1. 程式人生 > >kafka rebalance機制

kafka rebalance機制


     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. 1.將目標 topic 下的所有 partirtion 排序,存於PT
  2. 2.對某 consumer group 下所有 consumer 排序,存於 CG,第 i consumer 記為Ci
  3. 3. N=size(PT)/size(CG),向上取整
  4. 4.解除Ci對原來分配的 partition 的消費權(i0開始)
  5. 5.將第i*N到(i+1)*N-1 partition 分配給Ci

目前consumer rebalance的控制策略是由每一個consumer通過Zookeeper完成的。具體的控制方式如下:

  1. 在/consumers
    /[consumer-group]/下注冊id
  2. 設定對/consumers/[consumer-group]watcher
  3. 設定對/brokers/idswatcher
  4. zk下設定watcher的路徑節點更改,觸發consumer rebalance
在這種策略下,每一個consumer或者broker的增加或者減少都會觸發consumer rebalance。因為每個consumer只負責調整自己所消費的partition,為了保證整個consumer group的一致性,所以當一個consumer觸發了rebalance時,該consumer group內的其它所有consumer也應該同時觸發rebalance。
  • Herd effect
  任何broker或者consumer的增減都會觸發所有的consumer的rebalance
  • Split Brain
  每個consumer分別單獨通過Zookeeper判斷哪些partition down了,那麼不同consumer從Zookeeper“看”到的view就可能不一樣,這就會造成錯誤的reblance嘗試。而且有可能所有的consumer都認為rebalance已經完成了,但實際上可能並非如此。