今天我们来聊聊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时:
-
全部的consumer client向coordinator发送JoinGroupRequest的请求;
-
coordinator选择一个client作为leader来进行分配,其他client作为follower,等待分配结果;
-
leader根据客户端的分配策略进行分配,然后发送SyncGroupRequest请求,将分配结果发送给coordinator;
-
其他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