共计 2015 个字符,预计需要花费 6 分钟才能阅读完成。
kafka leader 选举有三种:
- broker leader 选举
- 正本 leader 选举
- 生产组 leader 选举
broker leader 选举
一个 broker leader 能够了解为一台机器,broker leader 次要负责监控治理分区和正本的状态,在分区与正本状态发生变化时做出相应操作。比方:分区的 leader 正本呈现了故障,那么 broker leader 须要进行分区 leader 正本的选举。Broker leader 称为 Controller 控制器。
选举过程
broker 们会向 zk 进行节点 /controller 的创立,谁先创立胜利谁就是 leader,并将本人的 brokerId 写入节点的值中,如果其它的 broker 发现节点的值不为 -1,则放弃选举成为 follower。
避免脑裂
当旧的 leader 从新上线后,而集群中新的 leader 曾经选出来了,整个集群就有两个 leader,这就是脑裂。如何防止这种状况呢?
broker 在创立 controller 的时候,还会创立一个 /controller epoch,每当新的节点成为控制器,就会主动加 1,这样就避免了旧的 leader 的影响,如果它给 ZK 的值小于 ZK 中的 epoch 值,ZK 会回绝它成为 leader.
controller 的性能
- 监听分区变动,正本选举工作,重分区工作
- 监听主题变动
- 监听 broker 变动
- auto.leader.rebalance.enble(kafka 的平衡机制) 如果开启,则定期进行 leader 选举 (不倡议开启,对消费者影响较大,见 auto.leader.rebalance.enable 阐明)
controller 须要监听 zk 上数据变动,并同步给其它节点,这些数据有:分区数变动,新的 leader 正本等。在 controller 呈现之前,所有节点都须要订阅 ZK 的事件,这会有羊群效应。有了 controller 之后,会通过一个 LindBlockQueue,而后应用一个专有的线程对解决,来防止羊群效应的问题。
分区正本 leader 选举
分区正本 leader 选举触发状况:
- 分区正本创立或分区高低线的时候
- 分区正本重新分配,因为须要放弃肯定负载平衡(分区的时候,数据的平衡保障不了)
- broker 节点宕机
消费者 leader 选举
随机的形式,从一个 hash 列表中取一个消费者作为 leader。
leader 的选举是因为某一个消费者 leader 下线了,这时候就呈现同一组中消费者数量的变动,这就不得不提到生产组的再平衡。因为一些起因,分区没有人生产了,那么就须要将它们重新分配给新的消费者或者存活着的消费者,这个再平衡的过程会引起 stop the world 的状况。
哪些状况会产生再平衡的情景呢?
- 同一组中消费者数量发生变化
- 主题的分区数发生变化,加减分区
- 组协调者节点下线
这里再聊一下分区的调配策略。
RangeAssignor: 针对一个主题下的消费者和分区按字典排序,而后 partition size / consumer size = m 并且 partition size % consumer size = n,那么前 n 个生产都调配到 m +1, 其它消费者调配到 m。
RoundRobinAssignor(轮询):将生产组内所有消费者和所有主题按字典程序排序,而后将分区顺次分给消费者。
StickyAssignor: 在初始状况下,它与轮询的后果是一样的,然而当呈现重新分配的时候,它会在尽可能保障分区不变动地位的状况下保障分区的平衡。
- 分区地位尽可能不变动
- 保障最终后果平衡
最初再看几个问题
一,kafka 为什么不反对主从读写
1,首先第一个问题,主从读写解决了什么问题
解决了节点压力的问题,主节点写数据,从节点读数据,然而 kafka 利用 partition 的形式,曾经做到将同一个 topic 的数据扩散到不同节点了。
2,而后主从读写带来了什么问题
主从的模式带来的数据提早,从节点总是会落后主节点 ms 级别,甚至 s 级别。然而在 kafka 除了用做削峰,异步的中间件外,它还是流式解决中间件,比方 Flink,Spark,Spark 的实时性要求不高,它是一批一批解决,缩小批次间的距离来实现假的实时性能;但 Flink 对实时性要求比拟高。在实时性要求高的场景下,如果呈现秒级甚至因为网络的起因,呈现了分区级别的提早,这是不能承受的。
二,ISR
1,音讯从生产者写入 kafka,首先写入正本 leader,而后 follower 正本同步 leader 的音讯。同步音讯落后的正本会被踢出 ISR,所以 ISR 的概念是,能追赶上 leader 的所有正本。
2,哪些状况会落后于 leader?
- 正本是新退出的,直到它同步与 leader 统一能力退出 ISR
- 正本卡死,正本机器死亡或 GC 卡死
- 正本同步因为网络或其它起因导致提早
3,怎么判断正本落后?
replica.lag.time.max.ms 参数:如果正本落后超过这个工夫就断定为落后了,直到它回来。音讯复制分为异步和同步,ISR 是动静的,有进有出。