kafka rebalance机制
kafka rebalance机制
kafka
保证同一个consumer group
中只有一个consumer
会消费掉某条消息,实际上,kafka保证的是稳定状态下每一个consumer
实例只会消费一个或者多个特定的数据,而某个partition
的数据只会被某一个特定的consumer实例所消费,这样设计的劣势是无法让同一个consumer group
里的consumer
均匀的消费数据,优势是每个consumer
不用跟大量的broker通信,减少通信开销,同事也降低了分配的难度,实现也更简单,另外,因为同一个partition里的数据都是有序的,这样可以保证每个partition
里的数据也是有序被消费的。如果某consumer group中consumer数量少于partition的数量 则至少有一个consuemr
会消费多个partition
的数据,如果consumer
的数量与partition
数量相同,则正好一个consumer
消费一个partition
的数据,而如果consumer
的数量多于partition
的数量时,会有部分consumer
无法消费该topic下任何一条信息。
Consumer Rebalance
算法如下:
- 将目标
topic
下所有的partition
排序,存于pt
- 对某
consumer group
下所有consumer
排序,存于cg ,第i个
consumer记为
ci ` N=size(Pt)/size(cg)
向上取整- 解除
ci
对原来分配的partiiton
的消费权(i从零开始) - 将第
i*N到(i+1)* N-1
个partition
分配给ci
目前consumer realance
的控制策略是由每一个consumer
通过通过zookeeper
完成的,具体的控制方法
- 在
/consumer/[consumer-group]/
下注册id
- 设置
/cnsumer/[consumer_group]
的watcher
- 设置对
/brokers/ids 的watcher
zk
下设置watcher的路径节点更改,触发consumer rebalance
在这种策略下,每一个consumer或者broker的增加或减少都会触发consumer rebalance
因为每个consumer
只负责调整自己所消费的paritition
,为了保证整个consumer group
的一致性,所以当一个consumer触发了
rebalance时,该
consumer group 内的其他所有
consumer 也应该同时触发rebalance
herd effect
任何broker
或者consumer的增减都会触发所有的consumer
的rebalance
split brain
每个consumer
分别单独通过zookeeper
判断哪些parittion dowm
了 那么不同consumer
从
zookeeper
看到的view就看不一样了,这样会造成错误的reblance
尝试,而且有可能所以的consumer
都认为rebalance