Kafka之Rebalence

209 阅读2分钟

今天我们来聊聊kafka的rebalence机制,即一个consumer group中的consumers重新分配partitions的机制。

Rebalence时机

  • consumer发生变化

  • 某个consumer挂掉,新加consumer

  • partition发生变化

  • 增加partition

  • coordinator挂掉,选新的coordinator

  • 订阅的topics发生变化

什么是coordinator

每个broker启动时,都会包含一个coordinator,协调器。coordinator是用来存储consumer group的信息的,比如该group对每个partition消费的offset。

新版本的kafka,group对partition的消费offset是存储在kafka的一个topic中的(_consumer_offsets)。旧版本的kafka是存储在zk中的,由于zk的写性能不好,换到了kafka中。

每个group对应一个coordinator,一个coordinator管理0个或者多个group的信息。

consumer group选择哪个broker上的coordinator来为自己服务呢?

算法是这样的:上边讲到新版kafka中,group对partition的消费offset是存储在_consumer_offsets这个topic中的,那它肯定是存储在这个topic的某个partition上的,而这个group就会选择这个partition的leader所在broker的coordinator来为自己服务。

Rebalence是谁来做的?

rebalence是由对应consumer group的某个consumer client来做的,而不是由上边将的coordinator来做。

之所以由consumer client来做,是为了灵活性。如果交给coordinator来做,需要重启broker,这会影响到整个kafka服务。而交给consumer client来做,则只影响该consumer group。

rebalence的流程

当发现需要进行rebalence时:

  1. 全部的consumer client向coordinator发送JoinGroupRequest的请求;

  2. coordinator选择一个client作为leader来进行分配,其他client作为follower,等待分配结果;

  3. leader根据客户端的分配策略进行分配,然后发送SyncGroupRequest请求,将分配结果发送给coordinator;

  4. 其他follower也发送SyncGroupRequest请求,获取分配结果。结束。

coordinator和consumer client是怎么知道要进行rebalence的?

coordinator和consumer client之间会通过heartBeat进行通信,这样,不管是coordinator挂了,还是partition增加了,又或者client变化了,都会被感知到,然后发起rebalence流程。

partition分配策略

  • range
  • roundRobin
  • 其它

Rebalence的优缺点

优点:rebalence实现了kafka的高可用性和扩展性。

缺点:看KafkaConsumer的源码可知,consumer的poll方法是单线程的,rebalence过程也是发生在这个线程内。因此整个rebalence期间,会导致整个consumer group不可用。

源码

1

2

参考资料:

Kafka理论之Consumer Group & Coordinator

kafka源码深度解析