文章目录
1. 集群成员
Kafka使用Zookeeper来管理集群成员(Broker),Broker启动时通过创建临时节点将自己注册到在Zookeeper,Zookeeper会将Broker的变动信息通知给控制器。
1.1 控制器
控制器是一个Kafka集群中的一个Broker,其作用是在Zookeeper的帮助下管理和协调整个Kafka集群。
Zookeeper概述
Zookeeper是一个高可靠性的分布式协调框架,核心功能是提供了:文件系统+通知机制。
ZK在内存中以树状目录结构存储数据,保证了高吞吐量和低延迟,但也限制了数据量的大小。
ZK赋予了客户端监听节点znode变更的能力,客户端通过在节点上注册Watcher,当事件发生时ZK会显示通知客户端。
常用作集群成员管理、Leader选举、注册中心、分布式锁等等。
选举
Broker启动时会尝试创建/controller临时节点,第一个成功创建的Broker会被指定为控制器。其它节点在该节点上注册Watcher以接收节点变更通知,并在控制器离线时,竞选控制器。
控制器使用epoch来避免“脑裂”,防止两个Broker同时认为自己是当前唯一的控制器。Broker在成为控制器之后,会自增epoch,旧控制器的epoch值较小,其消息会被其他Broker忽略。
功能
-
集群成员管理(Broker上下线)
利用ZK的Watch机制和临时节点对集群Broker进行管理。比如:- 当有新Broker启动后,其会在/broker/ids下创建一个临时节点,ZK通过Watch机制将该事件通知给控制器,控制器进而开始新增Broker作业。
- 当有Broker离线时,其与ZK之间的session结束,临时节点会被自动删除,ZK同样将该变更通知给控制器,控制器进而进行一些善后操作。比如首领副本离线,控制器需要为该分区重新选举分区首领(副本列表下一个副本),并将结果通知给该分区所有副本Broker。消费者需要重新发送Metadata请求获取新的分区首领信息。
-
主题、分区管理(增删主题/分区、分区分配、首领选举)
-
数据存储
控制器上保存了最全的集群元数据信息,其它Broker会定期接收控制器发来的元数据更新请求,从而更新其缓存数据,所以客户端元数据请求可发送给任意Broker。比较重要的数据有:所有主题信息、所有Broker信息。这些信息在ZK上也存储了一份,控制器初始化时会从ZK拉取。
故障转移Failover
任意时刻,Kafka集群中只有一个控制器,为了防止出现单点故障,Kafka为控制器提供了故障转移机制。
当控制器离线时,与ZK之间的session中断,ZK会删除/controller临时节点,集群中的其它Broker由于在/controller节点上注册了Watcher,会接收到ZK发来的节点变更通知,进而开始竞选控制器:抢先创建/controller节点。最终,第一个创建者成为控制器,从ZK拉取集群元数据,开始履行工作职责。
设计
- 单线程 + 事件队列
- 异步Zookeeper操作
1.2 群组协调器
群组协调器是为消费者群组服务的Broker,提供组成员管理及位移管理。其位置是保存该群组位移主题分区首领副本所在的Broker,由groupID.hashCode % 位移主题分区数 即可确定群组位移主题分区。
2. 副本
复制和分区多副本机制是Kafka Broker高可用、高持久性的实现方案。
副本通常是指分布式系统在多台机器上保存相同的数据拷贝,其作用有: