天天看點

kafka-再均衡

再均衡(Rebalance)本質上是一種協定,規定了一個消費組中所有消費者如何達成一緻來配置設定訂

閱主題的每個分區。

比如某個消費組有20個消費組,訂閱了一個具有100個分區的主題。正常情況下,Kafka平均會為每

個消費者配置設定5個分區。這個配置設定的過程就叫再均衡

  • 什麼時候再均衡?

    再均衡的觸發條件:

  1. 組成員發生變更(新消費者加入消費組組、已有消費者主動離開或崩潰了)
  2. 訂閱主題數發生變更。如果正規表達式進行訂閱,則建立比對正規表達式的主題觸發再均衡。
  3. 訂閱主題的分區數發生變更
  • 如何進行組内分區配置設定?

    三種配置設定政策:RangeAssignor和RoundRobinAssignor以及StickyAssignor

  • 誰來執行再均衡和消費組管理?

    Kafka提供了一個角色:Group Coordinator來執行對于消費組的管理。

    Group Coordinator——每個消費組配置設定一個消費組協調器用于組管理和位移管理。當消費組的第

    一個消費者啟動的時候,它會去和Kafka Broker确定誰是它們組的組協調器。之後該消費組内所有消費

    者和該組協調器協調通信

  • 如何确定coordinator?

    兩步:

  1. 确定消費組位移資訊寫入 __consumers_offsets 的哪個分區。具體計算公式:

    __consumers_offsets partition# = Math.abs(groupId.hashCode() %

    groupMetadataTopicPartitionCount) 注意:groupMetadataTopicPartitionCount

    由 offsets.topic.num.partitions 指定,預設是50個分區。

  2. 該分區leader所在的broker就是組協調器。
  • Rebalance Generation

    它表示Rebalance之後主題分區到消費組中消費者映射關系的一個版本,主要是用于保護消費組,

    隔離無效偏移量送出的。如上一個版本的消費者無法送出位移到新版本的消費組中,因為映射關系變

    了,你消費的或許已經不是原來的那個分區了。每次group進行Rebalance之後,Generation号都會加

    1,表示消費組和分區的映射關系到了一個新版本,如下圖所示: Generation 1時group有3個成員,随

    後成員2退出組,消費組協調器觸發Rebalance,消費組進入Generation 2,之後成員4加入,再次觸發

    Rebalance,消費組進入Generation 3

kafka-再均衡
  • 協定(protocol)

    kafka提供了5個協定來處理與消費組協調相關的問題:

    Heartbeat請求:consumer需要定期給組協調器發送心跳來表明自己還活着

    LeaveGroup請求:主動告訴組協調器我要離開消費組

    SyncGroup請求:消費組Leader把配置設定方案告訴組内所有成員

    JoinGroup請求:成員請求加入組

    DescribeGroup請求:顯示組的所有資訊,包括成員資訊,協定名稱,配置設定方案,訂閱資訊

    等。通常該請求是給管理者使用

    組協調器在再均衡的時候主要用到了前面4種請求

* liveness

消費者如何向消費組協調器證明自己還活着? 通過定時向消費組協調器發送Heartbeat請求。如果超過了設定的逾時時間,那麼協調器認為該消費者已經挂了。一旦協調器認為某個消費者挂了,那麼它就會開啟新一輪再均衡,并且在目前其他消費者的心跳響應中添加“REBALANCE_IN_PROGRESS”,告訴其他消費者:重新配置設定分區

* 再均衡過程

再均衡分為2步:Join和Sync

  1. Join, 加入組。所有成員都向消費組協調器發送JoinGroup請求,請求加入消費組。一旦所有

    成員都發送了JoinGroup請求,協調i器從中選擇一個消費者擔任Leader的角色,并把組成員信

    息以及訂閱資訊發給Leader。

  2. Sync,Leader開始配置設定消費方案,即哪個消費者負責消費哪些主題的哪些分區。一旦完成分

    配,Leader會将這個方案封裝進SyncGroup請求中發給消費組協調器,非Leader也會發

    SyncGroup請求,隻是内容為空。消費組協調器接收到配置設定方案之後會把方案塞進SyncGroup

    的response中發給各個消費者

kafka-再均衡

注意:在協調器收集到所有成員請求前,它會把已收到請求放入一個叫purgatory(煉獄)的地方。然

後是分發配置設定方案的過程,即SyncGroup請求

kafka-再均衡

注意:消費組的分區配置設定方案在用戶端執行。Kafka交給用戶端可以有更好的靈活性。Kafka預設提

供三種配置設定政策:range和round-robin和sticky。可以通過消費者的參數:

partition.assignment.strategy 來實作自己配置設定政策。

* 消費組狀态機

消費組組協調器根據狀态機對消費組做不同的處理:

kafka-再均衡

說明:

  1. Dead:組内已經沒有任何成員的最終狀态,組的中繼資料也已經被組協調器移除了。這種狀态

    響應各種請求都是一個response: UNKNOWN_MEMBER_ID

  2. Empty:組内無成員,但是位移資訊還沒有過期。這種狀态隻能響應JoinGroup請求
  3. PreparingRebalance:組準備開啟新的rebalance,等待成員加入
  4. AwaitingSync:正在等待leader consumer将配置設定方案傳給各個成員
  5. Stable:再均衡完成,可以開始消費