kafka rebalance機制
阿新 • • 發佈:2019-01-09
Kafka保證同一consumer group中只有一個consumer會消費某條訊息,實際上,Kafka保證的是穩定狀態下每一個consumer例項只會消費某一個或多個特定的資料,而某個partition的資料只會被某一個特定的consumer例項所消費。這樣設計的劣勢是無法讓同一個consumer group裡的consumer均勻消費資料,優勢是每個consumer不用都跟大量的broker通訊,減少通訊開銷,同時也降低了分配難度,實現也更簡單。另外,因為同一個partition裡的資料是有序的,這種設計可以保證每個partition裡的資料也是有序被消費。
如果某consumer group中consumer數量少於partition數量,則至少有一個consumer會消費多個partition的資料,如果consumer的數量與partition數量相同,則正好一個consumer消費一個partition的資料,而如果consumer的數量多於partition的數量時,會有部分consumer無法消費該topic下任何一條訊息。
Consumer Rebalance演算法如下 :
1.將目標 topic 下的所有 partirtion 排序,存於PT
2.對某 consumer group 下所有 consumer 排序,存於 CG,第 i 個consumer 記為Ci
3. N=size(PT)/size(CG),向上取整
4.解除Ci對原來分配的 partition 的消費權(i從0開始)
5.將第i*N到(i+1)*N-1個 partition 分配給Ci
目前consumer rebalance的控制策略是由每一個consumer通過Zookeeper完成的。具體的控制方式如下:
在/consumers
設定對/consumers/[consumer-group]的watcher
設定對/brokers/ids的watcher
zk下設定watcher的路徑節點更改,觸發consumer rebalance
- Herd effect
- Split Brain