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