一。基本概念
控制器的概念基于集群,控制器本质上是一个kafka服务器,主要负责Leader分区选举。
Kafka集群包含若干个broker,broker.id指定broker的编号,编号不要重复。
Kafka集群上创建的主题,包含若干个分区。
每个分区包含若干个副本,副本因子包括了Follower副本和Leader副本。
副本又分为ISR(同步副本分区)和OSR(非同步副本分区)
二。 broker选举
集群里第一个启动的broker在Zookeeper中创建临时节点,其他broker启动后会利用watch监听该节点,本质还是利用zookeeper的分布式锁实现选举。
集群控制器负责监听 ids 节点,一旦节点子节点发送变化,集群控制器得到通知。
三。选举过程
当控制器发现一个 broker 已经离开集群,那些失去Leader副本分区的Follower分区需要一个新
Leader(这些分区的首领刚好是在这个 broker 上)。
控制器遍历这些Follower副本分区,并确定谁应该成为新Leader分区,然后向所有包含新Leader分区和现有Follower的 broker 发送请求。该请求消息包含了谁是新Leader副本分区以及谁是Follower副本分区的信息。随后,新Leader分区开始处理来自生产者和消费者的请求,而跟随者开始从新Leader副本分区消费消息。
当控制器发现一个 broker 加入集群时,它会使用 broker ID 来检查新加入的 broker 是否包含现有分区的副本。如果有,控制器就把变更通知发送给新加入的 broker 和其他 broker,新 broker上的副本分区开始从Leader分区那里消费消息,与Leader分区保持同步。
结论:
- Kafka使用 Zookeeper 的分布式锁选举控制器,并在节点加入集群或退出集群时通知控制器。
- 控制器负责在节点加入或离开集群时进行分区Leader选举。
- 控制器使用epoch来避免“脑裂”。“脑裂”是指两个节点同时认为自己是当前的控制器。