乐趣区

关于kafka:kafka之六选举及controller

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 的性能

  1. 监听分区变动,正本选举工作,重分区工作
  2. 监听主题变动
  3. 监听 broker 变动
  4. 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 的状况。

哪些状况会产生再平衡的情景呢?

  1. 同一组中消费者数量发生变化
  2. 主题的分区数发生变化,加减分区
  3. 组协调者节点下线

这里再聊一下分区的调配策略。

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 是动静的,有进有出。

退出移动版