Kafka について: コンシューマー ソースコード分析とリバランス メカニズム

Kafka について: コンシューマー ソースコード分析とリバランス メカニズム

[[443148]]

1. はじめに

前回の記事では、Consumer が Consumer Group に参加する仕組みを分析しました。実際、前回の記事は非常にマクロなもので、主に ConsumerCoordinator が GroupCoordinator とどのように通信するかについて説明しました。待ってください、Lao Zhou、ConsumerCoordinator と GroupCoordinator とは何ですか?これら 2 つのコンポーネントは、それぞれ Consumer と Kafka Broker のコーディネーターです。簡単に言えば、これらはデザイン パターンにおけるファサード パターンです。具体的な内容については前回の記事を参照して確認することができます。今日の記事では、主に、コンシューマーがコンシューマー グループに参加する方法についての前回の記事で説明したリバランス メカニズムについて説明します。実際、前回の記事では概要を説明しましたが、この記事ではリバランスのメカニズムの具体的な詳細についてさらに詳しく説明します。

ある程度の経験があるプログラマーであれば、リバランスの仕組みは面接の質問として使えると思いますが、それでもかなり難しいです。しかし、自分自身を過小評価する必要はありません。この記事に従うだけで、必ず達成できると信じています。

しかし、一部の読者にとっては難しいと感じるかもしれません。心配しないで。以下の Kafka のトポロジをご覧ください。構造は非常に明確です。 Kafka のトポロジを理解していない場合は、読み進めないことをお勧めします。まず Kafka のトポロジーを明確に理解するか、読み進める前に Lao Zhou の以前の記事を読んでください。効果はもっと良くなると思います。

この記事では、主に以下の点からリバランスのメカニズムについて説明します。

  • リバランスメカニズムとは何ですか?
  • リバランスメカニズムをいつ起動するか
  • グループステータスの変更
  • 高齢の消費者クライアントに関する問題
  • リバランスメカニズムの原理
  • ブローカー側のリバランスシナリオ

2. リバランスメカニズムとは何ですか?

リバランスは、本質的には、コンシューマー グループ内のすべてのコンシューマーが、サブスクライブされたトピックの各パーティションを割り当てるために合意に達する方法を指定するプロトコルです。

新しいメンバーがクラスターに参加したり、一部のトピックにパーティションが追加されたりすると、コンシューマーは消費をどのように再分配するのでしょうか?これにはリバランスの概念が含まれます。 Kafka の再バランス調整メカニズムとは何かを説明します。

この図から、消費者グループ モデルのいくつかの概念がわかります。

  • 同じコンシューマー グループでは、パーティションは 1 つのコンシューマーによってのみサブスクライブおよび消費できますが、コンシューマーは複数のパーティションをサブスクライブできます。つまり、各メッセージは同じコンシューマー グループ内の 1 つのコンシューマーによってのみ消費され、繰り返し消費されないことが保証されます。
  • パーティションは、異なるコンシューマー グループによってサブスクライブできます。ここでは特別なケースがあります。各コンシューマー グループにコンシューマーが 1 つしかない場合、パーティションはすべてのコンシューマーにブロードキャストされ、ブロードキャスト モードの消費が実現されます。

上記のコンシューマ グループ モデルを実装するには、トピックに新しいパーティションが追加されたり、コンシューマ グループに新しいメンバーが参加したりするなど、外部環境が変化したときに上記のモデルを維持するための動的な調整を実装する必要があります。この作業は、Kafka の再バランス調整メカニズムによって処理されます。

図からわかるように、Kafka の再バランスは外部トリガーによって発生します。 Kafka の再バランス調整をトリガーする機会を見てみましょう。

3. リバランスメカニズムをいつ起動するか

  • 新たな消費者が消費者グループに加わりました
  • コンシューマーはオフラインです。消費者は必ずしもオフラインである必要はありません。たとえば、GC またはネットワークの遅延が長時間続いたために Consumer が GroupCoordinator に HeartbeatRequest を長時間送信しなかった場合、GroupCoordinator は Consumer をオフラインと見なします。
  • コンシューマーが積極的にコンシューマー グループを退出します (LeaveGroupRequest リクエストを送信します)。たとえば、クライアントは unsubscribe() メソッドを呼び出して、特定のトピックへのサブスクリプションをキャンセルします。
  • コンシューマーがタイムアウトになり、指定された時間内にオフセットを送信しませんでした。
  • コンシューマー グループに対応する GroupCoordinator ノードが変更されました。
  • コンシューマー グループによってサブスクライブされたトピック、またはトピックのパーティション数が変更されます。

4. グループステータスの変更

4.1 消費者側

Consumer 側のファサード ConsumerCoordinator は、AbstractCoordinator 抽象クラスを継承します。コーディネーター AbstractCoordinator の内部クラス MemberState では、コーディネーターの 4 つの状態 (未登録、再割り当て後に応答を受信せず、再割り当て後に応答を受信したが割り当てを受信せず、安定状態) を確認できます。

上記の消費者側の 4 つの状態の遷移を次の図に示します。

4.2 サーバー

Kafka サーバーの GroupCoordinator には、Empty、PreparingRebalance、CompletingRebalance、Stable、Dead の 5 つの状態があります。状態遷移は次の図に示されています。

  • コンシューマ グループは、最初は空です。
  • リバランスが有効になると、メンバーが参加するのを待つ PreparingRebalance 状態になります。
  • 次にCompletingRebalanceに変更し、割り当て計画を待ちます。
  • 最後に、フローは安定版に転送され、リバランスが完了します。
  • メンバーが変更されると、コンシューマー グループの状態は Stable から PreparingRebalance に変わります。
    • 現時点では、既存のメンバー全員がグループに参加するには再度申請する必要があります。
    • すべてのグループ メンバーがグループから退出すると、コンシューマー グループのステータスは空になります。
  • コンシューマ グループが空の状態の場合、Kafka は期限切れのオフセットを定期的に自動的に削除します。

5. 旧バージョンの消費者クライアントの問題

ConsumerCoordinator と GroupCoordinator の概念は、Kafka バージョン 0.9.0 以降のコンシューマー クライアント向けです。当面は、Kafka バージョン 0.9.0 より前のコンシューマー クライアントを旧バージョンのコンシューマー クライアントと呼びます。古いバージョンのコンシューマー クライアントでは、これらの機能を実装するために Zookeeper の Watcher を使用します。

各消費者グループ/consumers/はZookeeperで管理されています/ids パス。このパスの下では、このコンシューマ グループに属するコンシューマの一意の識別子 consumerldString を記録するために一時ノードが使用されます。 consumerldString は、コンシューマーが起動されたときに作成されます。コンシューマーの一意の識別子は、consumer.id + ホスト名 + タイムスタンプ + UUID の部分情報で構成されます。ここで、consumer.id はコンシューマー クライアントの古いバージョンの構成であり、クライアントの新しいバージョンの client.id に相当します。たとえば、コンシューマーの一意の識別子が consumerld_localhost-1510734527562-64b377f5 の場合、consumerld は指定された consumer.id、localhost はコンピューターのホスト名、1510734527562 はタイムスタンプ、64b377f5 は UUID 情報の一部を表します。

次の図は消費者に関するものです。 /idsと同じレベルには、ownersとoffsetsという2つのノードがあります。

  • /consumers//ownersパスはパーティションとコンシューマー間の対応を記録します
  • /consumers//offsetsパスは、パーティション内のこのコンシューマグループの対応する消費オフセットを記録します。

各ブローカー、トピック、パーティションは Zookeeper 内のパスにも対応しています。

  • /brokers/ids/ には、このブローカーに割り当てられたホスト、ポート、およびトピック パーティションのリストが記録されます。
  • /brokers/topics/ には、各パーティションのリーダーレプリカや ISR セットなどの情報が記録されます。
  • /brokers/topics//partitions//state には、現在のリーダー レプリカやリーダー エポックなどの情報が記録されます。

各消費者は/消費者/にいます/ids および /brokers/ids パスにリスナーを登録します。 /消費者/ /ids パスの下のサブノードが変更されると、コンシューマー グループ内のコンシューマーが変更されたことを意味します。 /brokers/ids パスの下のサブノードが変更された場合、ブローカーが増加または減少したことを意味します。このように、Zookeeper が提供する Watcher を通じて、各コンシューマーはコンシューマー グループと Kafka クラスターのステータスを監視できます。

このようにして、各コンシューマーは Zookeeper の関連パスを個別に監視します。再バランス操作がトリガーされると、コンシューマー グループ内のすべてのコンシューマーが同時に再バランス操作を実行しますが、コンシューマーは互いの操作の結果を認識できないため、Kafka が誤った状態で動作する可能性があります。同時に、Zookeeper クラスターに大きく依存するこのアプローチには、さらに 2 つの深刻な問題があります。

  • 群れ効果: いわゆる群れ効果は、Zookeeper の監視対象ノードの変更を指します。大量の Watcher 通知がクライアントに送信され、通知期間中に他の操作が遅延し、デッドロックのような状況が発生する可能性もあります。
  • スプリット ブレイン: コンシューマーがリバランス操作を実行すると、各コンシューマーは Zookeeper と通信して、コンシューマーまたはブローカーの変更を判断します。 Zookeeper 自体の特性により、各コンシューマーが同時に取得した状態が矛盾する可能性があり、異常な問題が発生する可能性があります。

6. リバランスメカニズムの原則

Kafka バージョン 0.9.0 以降のコンシューマー クライアントは、すべてのコンシューマー グループを複数のサブセットに分割するように再設計されました。コンシューマ グループの各サブセットは、それを管理するサーバー上の GroupCoordinator に対応します。 GroupCoordinator は、コンシューマー グループを管理するために使用される Kafka サーバー内のコンポーネントです。コンシューマー クライアントの ConsumerCoordinator コンポーネントは、GroupCoordinator との対話を担当します。

  • 完全な再バランス調整プロセスには、コンシューマーとコーディネーターの共同の取り組みが必要です。
  • 消費者側の再調整手順
    • グループに参加: JoinGroupリクエストに対応
    • リーダーコンシューマー割り当て計画を待機中: SyncGroup 要求に対応
  • メンバーがグループに参加すると、コンシューマーはコーディネーターに JoinGroup リクエストを送信します。
  • 各コンシューマーはサブスクライブしているトピックを報告します
  • コーディネーターは、すべての JoinGroup リクエストを収集した後、これらのメンバーの中からコンシューマー グループのリーダーとして機能するリーダーを選択します。
    • 通常、最初にJoinGroupリクエストを送信した人が自動的にリーダーになります。
  • リーダー コンシューマーのタスクは、すべてのメンバーからトピックを収集し、その情報に基づいて特定のパーティション コンシューマー割り当て計画を策定することです。
  • リーダーを選択した後、コーディネーターはすべてのトピック情報を JoinGroup 応答にカプセル化し、リーダーに送信します。
  • リーダー コンシューマーは、統一された割り当て計画を作成し、SyncGroup 要求を入力します。
  • リーダー コンシューマーは SyncGroup をコーディネーターに送信し、割り当て計画をコーディネーターに送信します。
  • 他のメンバーもSyncGroupリクエストを発行します
  • コーディネーターは、SyncGroup Response の形式でソリューションをすべてのメンバーに送信します。

  • すべてのメンバーが割り当て計画を正常に受信し、コンシューマー グループは安定状態になり、通常の消費を開始します。

詳細なソースコード分析については、コンシューマー グループに参加する方法に関する以前の記事を参照してください。

7. ブローカー側のバランスシナリオ

7.1 新メンバー

安定状態になった後、新しいメンバーがコンシューマーグループに参加します

7.2 グループメンバーが自主的に脱退する

  • 能動的に離脱する: コンシューマーインスタンスはclose()メソッドを呼び出してコーディネータに終了を通知する
  • このシナリオには3番目のリクエストが含まれます: LeaveGroupリクエスト

7.3 グループメンバーがクラッシュして離脱

  • コーディネーターは、感知するまでしばらく待つ必要がある
  • この期間はコンシューマーパラメータsessionn.timeout.msによって制御されます。
  • 上記のパラメータを超えてもKafkaはクラッシュしません
  • 同じプロセス

7.4 グループメンバーはリバランス中にオフセットを提出する

  • リバランスがオンになっている場合、コーディネーターはメンバーにバッファ期間を与え、この期間中に各メンバーにオフセットを迅速に報告するよう要求します。
  • 次に通常のJoinGroup/SyncGroupリクエストを開始します

さて、リバランスのメカニズムについて私が言いたいことは以上です。次の記事では、リバランスを回避する方法について説明します。

この記事はWeChatの公開アカウント「Lao Zhou Talks Architecture」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Lao Zhou Chats about Architecture パブリックアカウントにご連絡ください。

<<:  テクノロジーの偏りがクラウド アーキテクチャに与える影響

>>:  クラウドネイティブの5つの主要技術の詳細説明

推薦する

hosteons: 新しい OpenVZ7 VPS、無料のダブルアップグレードリソース

シンガポールの VPS 販売業者である Hosteons は、おそらく皆さんもよくご存知でしょう。同...

アリババの専門家が分散システムを詳しく説明し、大規模ウェブサイトへの分散システムの実用化を分析します。

分散システム分散システムは、オリジナルの CORBA から EJB、Web、SOA へ、クラスターか...

#元旦推广# dogyun: すべてのハイエンド最適化ライン、エラスティッククラウドサーバーが 30% オフ、香港\韓国\日本\米国\ドイツ\オランダ

Dogyun は新年のプロモーションを開始しました。10 台のコンピュータ ルーム (複数回線) を...

AWS が新しい IoT サービスを発表。機械学習をエッジに導入

[51CTO.com からのオリジナル記事] 本日の AWS re:Invent カンファレンスで、...

インスタント食品安全プラットフォームについてどう思いますか?

年末が近づくにつれ、食品の安全性が再びホットな話題の一つになっています。人々は健康に有害なあらゆる種...

Baidu入札とSEOの比較についての簡単な説明

百度が現在、中国のインターネット市場における検索エンジンシェアの 85% 以上を占めていることは周知...

ソーシャルマーケティングを爆発的に成長させるのに役立つシードユーザーを見つける方法

私たちは、ソーシャル マーケティングの成功事例を数多く目にし、ソーシャル ネットワークを通じて達成さ...

ハイブリッド クラウド コンピューティングは企業にとって次のステップとなるのでしょうか?

ハイブリッド クラウド コンピューティングでは、オンプレミスのプライベート クラウド環境とサードパー...

康生戴志康:個人のウェブマスターが世界を征服する時代は終わった

右は康盛社社長の戴志康氏(Weibo)(写真提供:テンセントテクノロジー)テンセントテクノロジーニュ...

小規模ウェブマスター向けサポートプラン「Magic Cube Cloud」!無料アップグレード!史上最安値!

Magic Cube Cloudは、ユーザーにVPS構成の無料アップグレードと製品価格の値下げを提供...

ユーザーの熱意が薄れた後、ソーシャル ネットワーキング サイトはどこへ向かうのでしょうか?

MySpaceに何が起こったのですか?まずは、Google Correlateが提供するFacebo...

virmach: 4 か月で 3.23 ドル、1 回限りの VPS、640M メモリ/1 コア/10g ハードディスク/1T トラフィック

これは、virmach のワンタイム VPS の第 2 波です。料金は 1 回のみで、使用後は破棄さ...

タオバオアフィリエイトはアリババや電子商取引にとって不可欠ではない

最近、注目に値するニュースがありました。つまり、アリババはタオバオアフィリエイトに対して一連の是正措...

Kubernetes を恐れる必要がない理由

90 年代後半から 2000 年代初頭にかけて、大規模な Web サイトに取り組むのは楽しかったです...