Random Thoughts

Recent content on Random Thoughts

马上订阅 Random Thoughts RSS 更新: https://blog.joway.io/index.xml

Kafka 的设计与实践思考

2018年4月16日 08:00

前几天看了 librdkafka 的官方文档,这篇文档不仅仅讲解了如何使用 Kafka ,某种程度也讲解了分布式系统实现的难点和使用细节,故而让我对 Kafka 的实现原理产生了浓厚的兴趣。

这篇文章从 Kafka 的设计到使用做了一些个人总结,围绕真正实践场景,探寻其设计上的智慧与妥协。

设计

架构设计

Zookeeper

Zookeeper 存储了 Kafka 集群状态信息 。

Zookeeper 还负责从 Broker 中选举出一个机器作为 Controller, 并确保其唯一性。 同时, 当 Controller 宕机时, 再选举一个新的 。

在 0.9 版本之前,它还存储着 Consumer 的 offset 信息 。

Broker

接收 Producer 和 Consumer 的请求,并把 Message 持久化到本地磁盘。

集群会经由 ZK 选举出一个 Broker 来担任 Controller,负责处理各个 Partition 的 Leader 选举,协调 Partition 迁移等工作。

内部组件设计

Topic

逻辑概念,一个 Topic 的数据会被划分到一个或多个 Partition 中。

Partition

最小分配单位。一个 Partition 对应一个目录,该目录可以被单独挂在到一个磁盘上,以实现IO压力的负载均衡。同时多个 Partition 分布在多台机器上,也实现了灵活地水平扩容。

每个 Partition 都能够拥有一个或多个 Replication 副本。创建 Topic 的时候能够指定每个 Topic 的 Replication 数量,来保证高可用,Replication 数量为1时,即没有副本,只有其自身 (所以其自身也算是一个 Replication )。其中一个Replication 被选举为 leader。如果leader挂掉了,也会有相应的选举算法来选新的leader。