View a markdown version of this page

コンシューマーグループのオフセット同期 - Amazon Managed Streaming for Apache Kafka

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コンシューマーグループのオフセット同期

MSK レプリケーターは、コンシューマーグループのオフセットをソースクラスターからターゲットクラスターに同期できるため、コンシューマーはレコードをスキップすることなくクラスターを切り替えて処理を再開できます。このトピックでは、一方向 (レガシー) 設定と双方向 (拡張) 設定の両方でオフセット同期がどのように機能するかについて説明し、一般的な落とし穴について説明します。

オフセット同期の仕組み

データのレプリケートの一環として、MSK Replicator はソースクラスターからのメッセージを消費し、ターゲットクラスターに生成します。これにより、ソースクラスターとターゲットクラスターでメッセージのオフセットが異なる場合があります。レプリケーターの作成中にコンシューマーグループのオフセット同期を有効にした場合、MSK レプリケーターはメタデータのコピー中にオフセットを自動的に変換するため、ターゲットクラスターにフェイルオーバーした後、コンシューマーは中断した場所から処理を再開できます。

MSK レプリケーターは、ストリームの先端 (トピックパーティションの終わり) に近い位置から読み取っているソースクラスター上のコンシューマー向けに最適化します。コンシューマーグループがソースクラスターで遅延している場合、ソースと比較してターゲット上のコンシューマーグループの遅延が大きくなることがあります。つまり、コンシューマーはフェイルオーバー後に重複したメッセージを再処理します。この遅延を減らすには、ソースクラスターのコンシューマーがストリームの先端から追いついて消費を開始する必要があります。コンシューマーによる処理がキャッチアップすると、MSK Replicator は自動的に遅延を小さくします。

オフセット同期は 3 ステージのパイプラインです。

  1. オフセットマッピング — レコードがソースからターゲットにレプリケートされると、レプリケーターはソースオフセットと対応するターゲットオフセットの間の定期的なマッピングを記録します。ソースオフセットとターゲットオフセットは異なる (異なる開始点、圧縮など) ため、これらのマッピングは不可欠です。

  2. オフセット変換 — レプリケーターは、ソースクラスター上のレプリケートされた各コンシューマーグループのコミットされたオフセットを定期的に読み取ります。次に、保存されたオフセットマッピングを使用して、それらのソースオフセットを同等のターゲットオフセットに変換します。

  3. オフセットコミット — 変換されたオフセットはターゲットクラスターの__consumer_offsetsトピックにコミットされるため、コンシューマーがターゲットに接続して同じグループに参加すると、ほぼ正しい位置から再開されます。

主な動作:

  • オフセット変換は概算であり、正確ではありません。レプリケーターは時間間隔でオフセットマッピングをサンプリングするため、変換されたオフセットは実際の同等の位置からわずかに遅れる可能性があります。これは設計上、at-least-once配信の側でエラーが発生するため、コンシューマーはフェイルオーバー後に少数のメッセージを読み直す可能性があります。

  • オフセットは、ターゲットのそのグループでコンシューマーがアクティブに消費していない場合にのみ、ターゲットのコンシューマーグループにコミットされます。これにより、レプリケーターがターゲットクラスターで既に実行されているコンシューマーに干渉するのを防ぎます。

  • コンシューマーグループは、同期する設定済みのコンシューマーグループフィルター (包含/除外パターン) と一致する必要があります。

レガシーオフセット同期による一方向レプリケーション

これは、標準の一方向レプリケーター (クラスター A → クラスター B) のデフォルトモードです。

  • トピックの命名 — レガシーオフセット同期は、プレフィックス付きトピック名レプリケーションと同一のトピック名レプリケーションの両方をサポートします。

  • 方向 — コンシューマーグループのオフセットは、プロデューサーがソースでアクティブで、コンシューマーがターゲットクラスターで非アクティブの場合にのみ、ターゲットクラスターに同期されます。

  • フェイルオーバー — コンシューマーはターゲットクラスターを指すことができ、変換されたオフセット位置から再開されます。

  • フェイルバックサポートなし — レガシーオフセット同期は、ターゲットからソースにオフセットを変換しません。コンシューマーをターゲットに移動し、後でコンシューマーをソースに戻す場合、リターントリップの自動オフセット変換はありません。フェイルバックが必要な場合は、オフセット同期が強化された双方向セットアップを使用します。

オフセット同期が強化された双方向セットアップ

双方向セットアップでは、2 つのレプリケーターが反対方向に実行する必要があります (レプリケーター A→B とレプリケーター B→A)。各レプリケーターは、引き続き一方向のデータレプリケーションとオフセット同期を実行します。これは、ソースからターゲットにデータをレプリケートし、コンシューマーグループのオフセットを同じ方向に同期します。拡張オフセット同期を使用すると、プロデューサーとコンシューマーが異なるクラスターでアクティブであっても、各レプリケーターはコンシューマーグループの同期を継続できます。

主な特徴

  • トピックの命名 — 拡張同期には、両方のレプリケーターで同じトピック名のレプリケーションが必要です。

  • 各単方向の 2 つのレプリケーター — 各レプリケーターはデータをレプリケートし、オフセットを一方向に同期します。双方向の動作は、ペアが連携することによって行われます。

  • 両方のレプリケーターからマッピングを読み取る — オフセットを変換する場合、レプリケーターは連携して利用可能な最も正確な変換を決定します。

  • フェイルオーバーとフェイルバック — コンシューマーはいずれかのクラスターから別のクラスターに移動し、ほぼ正しい位置から再開できます。

双方向オフセット同期を有効にする場合:

  • ロールバック機能を使用した移行 — あるクラスターから別のクラスターに移行し、問題が発生した場合に元のクラスターにロールバックできるようにします。

  • アクティブ/アクティブアーキテクチャ — 両方のクラスターが読み取りと書き込みをアクティブに処理しており、コンシューマーがクラスターを切り替えることができるようにする必要がある場合。

  • ディザスタリカバリ — フェイルオーバーまたはフェイルバックイベント後に、コンシューマーがいずれかのクラスターで正しいオフセットから処理を再開できるようにする必要がある場合。

オフセット同期のモニタリング

次の Amazon CloudWatch メトリクスをモニタリングして、オフセット同期が正しく機能していることを確認します。

  • ConsumerGroupCount — 両方のレプリケーターで予想される数のコンシューマーグループが同期されていることを確認します。

  • ConsumerGroupOffsetSyncFailure — 両方のレプリケーターで 0 にする必要があります。この値が 0 より大きい場合は、コンシューマーグループがアクティブであることを確認し、読み取りアクセス許可と説明アクセス許可を検証し、トピックがターゲットクラスターに存在することを確認します。

  • OffsetLag (MSK Cluster) および OffsetLag (Non-MSK Cluster) — 両方のクラスターでパーティションレベルのコンシューマーラグを比較して、オフセットが同期されていることを確認します。

一般的な落とし穴

  1. コンシューマーはフェイルオーバー後に少数のメッセージを再読むことがある

    オフセット変換は概算です。変換されたオフセットは意図的に保守的です。実際の同等の位置よりわずかに遅れている可能性があります。つまり、コンシューマーは通常、クラスターを切り替えた後に少数のレコードを再処理します。アプリケーションは、重複処理 (べき等性) を処理するように設計する必要があります。

  2. オフセットは、ターゲットでアクティブに消費しているグループに同期されません

    コンシューマーグループがターゲットクラスターで既にアクティブになっている場合、レプリケーターはそのオフセットを上書きしません。これは安全メカニズムです。ただし、レプリケーターがオフセットを同期する前にコンシューマーがターゲットで開始された場合、それらのコンシューマーは変換された位置からではなく、ターゲットのデフォルトのオフセットリセットポリシー (通常は latestまたは earliest) から開始されます。

  3. オフセット同期には固有の遅延があります

    オフセット変換は、データレプリケーションとオフセット同期の 2 つの非同期プロセスによって異なります。コンシューマーがソースでオフセットをコミットしてから、変換されたオフセットがターゲットに表示されるまでには常に多少の遅延があります。フェイルオーバー中に、ソースコンシューマーが最近アクティブだった場合、この遅延により、コンシューマーは予想よりも多くのメッセージを再読み込みする可能性があります。

  4. コンシューマーグループはレプリケーションフィルターに含める必要があります

    設定されたインクルードパターンに一致する (かつ除外パターンと一致しない) コンシューマーグループのみがオフセットを同期します。コンシューマーグループのオフセットがターゲットに表示されない場合は、コンシューマーグループのレプリケーション設定に含まれていることを確認します。

  5. 単方向レプリケーターはフェイルバックをサポートしていません

    レガシー (一方向) オフセット同期では、オフセットはソースからターゲットにのみ変換されます。コンシューマーをターゲットに移動し、後でコンシューマーをソースに戻す必要がある場合は、正しいオフセットを手動で決定するか、再処理を受け入れる必要があります。フェイルバックが必要な場合は、オフセット同期が強化された双方向セットアップを使用します。

  6. トピックの削除と再作成はオフセットマッピングを無効にする可能性があります

    いずれかのクラスターでトピックを削除して再作成した場合、新しいトピックはオフセット 0 から始まるため、オフセットマッピングは古くなります。レガシーオフセット同期では、オフセット変換が正しくない可能性があります。拡張オフセット同期は、トピックの再作成を検出し、マッピングを自動的にリセットします。