Apache Kafka消費者再平衡 | TechMyTalk

banq發表於2020-06-09

消費者重新平衡決定哪個消費者是負責某些主題Topic的所有可用分割槽的哪個子集。例如,您可能有一個包含20個分割槽和10個使用者的主題。在重新平衡結束時,您可能希望每個使用者都從2個分割槽中讀取資料。如果關閉了這些使用者中的10個,則可能會期望每個使用者在重新平衡完成後對應1個分割槽。消費者重新平衡是可以由Kafka自動處理的動態分割槽分配。

組協調員  是負責與消費者進行通訊以實現消費者之間平衡的經紀人之一。在早期版本中,Zookeeper儲存了後設資料詳細資訊,但最新版本儲存在經紀人上。消費者協調員收到了所有消費者組消費者的心跳和輪詢,因此他了解每個消費者心跳和管理在分割槽上的偏移量。

小組組長:  消費者組的一位消費者擔任小組組長,由小組協調員選出,負責代表小組中的所有消費者做出分割槽分配決定。
需要重新平衡情況:

  1. 消費者組訂閱任何主題
  2. 消費者例項無法使用session.heart.beat時間間隔傳送心跳。
  3. 消費者的長時間流程超出了輪詢超時
  4. 消費群體中的消費者透過例外
  5. 新增了新分割槽。
  6. 擴大消費者規模。新增了新使用者或手動刪除了現有使用者

消費者再平衡
消費者重新平衡是在消費者請求加入一個小組或離開一個小組時啟動的。小組負責人從小組協調員那裡收到所有活躍消費者的名單。組負責人使用PartitionAssigner決定分配給每個使用者的分割槽。一旦組長完成分割槽分配,它就會將分配列表傳送給組協調器,組協調器將這些資訊傳送回所有使用者。組僅將適用的分割槽傳送給其使用者,而不傳送其他使用者分配的分割槽。只有組長知道所有使用者及其分配的分割槽。重新平衡完成後,消費者開始將“心跳”傳送到仍活躍的“組協調器”。使用者向組協調器傳送OffsetFetch請求,以獲取為其分配的分割槽的最後提交的偏移量。

狀態管理
重新平衡時,組協調器將其狀態設定為“重新平衡”,並等待所有消費者重新加入組。
當組開始重新平衡時,組協調器首先將其狀態切換為重新平衡,以便通知所有互動的使用者重新加入組。重新平衡完成後,組協調器將建立新一代ID,並通知所有消費者,然後該組繼續進行同步階段,在此階段,消費者傳送同步請求,然後等待直到組長完成新的分配分割槽。一旦消費者收到新的分配分割槽,他們便進入穩定階段。

Apache Kafka消費者再平衡  | TechMyTalk


靜態成員
您的重新平衡操作相當繁瑣,因為它需要停止所有使用者並等待獲取新分配的分割槽。在每次重新平衡時,始終建立新一代id,這意味著重新整理所有內容。為了解決此開銷,Kafka 2.3+引入了靜態成員資格以減少不必要的重新平衡。
在靜態成員資格狀態下,消費者狀態將保持不變,在重新平衡狀態下,將應用相同的分配。它使用新的group.instance.id來保留成員身份。因此,即使在最壞的情況下,成員ID也會被改組以分配新分割槽,但相同的使用者例項ID仍將獲得相同的分割槽分配

instanceId: A, memberId: 1, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}


重啟後:

instanceId: A, memberId: 4, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}   



 

相關文章