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

作者:步履不停原文地址:https://segmentfault.com/a/1190000042249731

%s 个评论

要回复文章请先登录注册