再均衡(Rebalance)本質上是一種協定,規定了一個消費組中所有消費者如何達成一緻來配置設定訂
閱主題的每個分區。
比如某個消費組有20個消費組,訂閱了一個具有100個分區的主題。正常情況下,Kafka平均會為每
個消費者配置設定5個分區。這個配置設定的過程就叫再均衡
-
什麼時候再均衡?
再均衡的觸發條件:
- 組成員發生變更(新消費者加入消費組組、已有消費者主動離開或崩潰了)
- 訂閱主題數發生變更。如果正規表達式進行訂閱,則建立比對正規表達式的主題觸發再均衡。
- 訂閱主題的分區數發生變更
-
如何進行組内分區配置設定?
三種配置設定政策:RangeAssignor和RoundRobinAssignor以及StickyAssignor
-
誰來執行再均衡和消費組管理?
Kafka提供了一個角色:Group Coordinator來執行對于消費組的管理。
Group Coordinator——每個消費組配置設定一個消費組協調器用于組管理和位移管理。當消費組的第
一個消費者啟動的時候,它會去和Kafka Broker确定誰是它們組的組協調器。之後該消費組内所有消費
者和該組協調器協調通信
-
如何确定coordinator?
兩步:
-
确定消費組位移資訊寫入 __consumers_offsets 的哪個分區。具體計算公式:
__consumers_offsets partition# = Math.abs(groupId.hashCode() %
groupMetadataTopicPartitionCount) 注意:groupMetadataTopicPartitionCount
由 offsets.topic.num.partitions 指定,預設是50個分區。
- 該分區leader所在的broker就是組協調器。
-
Rebalance Generation
它表示Rebalance之後主題分區到消費組中消費者映射關系的一個版本,主要是用于保護消費組,
隔離無效偏移量送出的。如上一個版本的消費者無法送出位移到新版本的消費組中,因為映射關系變
了,你消費的或許已經不是原來的那個分區了。每次group進行Rebalance之後,Generation号都會加
1,表示消費組和分區的映射關系到了一個新版本,如下圖所示: Generation 1時group有3個成員,随
後成員2退出組,消費組協調器觸發Rebalance,消費組進入Generation 2,之後成員4加入,再次觸發
Rebalance,消費組進入Generation 3
-
協定(protocol)
kafka提供了5個協定來處理與消費組協調相關的問題:
Heartbeat請求:consumer需要定期給組協調器發送心跳來表明自己還活着
LeaveGroup請求:主動告訴組協調器我要離開消費組
SyncGroup請求:消費組Leader把配置設定方案告訴組内所有成員
JoinGroup請求:成員請求加入組
DescribeGroup請求:顯示組的所有資訊,包括成員資訊,協定名稱,配置設定方案,訂閱資訊
等。通常該請求是給管理者使用
組協調器在再均衡的時候主要用到了前面4種請求
* liveness
消費者如何向消費組協調器證明自己還活着? 通過定時向消費組協調器發送Heartbeat請求。如果超過了設定的逾時時間,那麼協調器認為該消費者已經挂了。一旦協調器認為某個消費者挂了,那麼它就會開啟新一輪再均衡,并且在目前其他消費者的心跳響應中添加“REBALANCE_IN_PROGRESS”,告訴其他消費者:重新配置設定分區
* 再均衡過程
再均衡分為2步:Join和Sync
-
Join, 加入組。所有成員都向消費組協調器發送JoinGroup請求,請求加入消費組。一旦所有
成員都發送了JoinGroup請求,協調i器從中選擇一個消費者擔任Leader的角色,并把組成員信
息以及訂閱資訊發給Leader。
-
Sync,Leader開始配置設定消費方案,即哪個消費者負責消費哪些主題的哪些分區。一旦完成分
配,Leader會将這個方案封裝進SyncGroup請求中發給消費組協調器,非Leader也會發
SyncGroup請求,隻是内容為空。消費組協調器接收到配置設定方案之後會把方案塞進SyncGroup
的response中發給各個消費者
注意:在協調器收集到所有成員請求前,它會把已收到請求放入一個叫purgatory(煉獄)的地方。然
後是分發配置設定方案的過程,即SyncGroup請求
注意:消費組的分區配置設定方案在用戶端執行。Kafka交給用戶端可以有更好的靈活性。Kafka預設提
供三種配置設定政策:range和round-robin和sticky。可以通過消費者的參數:
partition.assignment.strategy 來實作自己配置設定政策。
* 消費組狀态機
消費組組協調器根據狀态機對消費組做不同的處理:
說明:
-
Dead:組内已經沒有任何成員的最終狀态,組的中繼資料也已經被組協調器移除了。這種狀态
響應各種請求都是一個response: UNKNOWN_MEMBER_ID
- Empty:組内無成員,但是位移資訊還沒有過期。這種狀态隻能響應JoinGroup請求
- PreparingRebalance:組準備開啟新的rebalance,等待成員加入
- AwaitingSync:正在等待leader consumer将配置設定方案傳給各個成員
- Stable:再均衡完成,可以開始消費