ベストプラクティス - Amazon Managed Streaming for Apache Kafka

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

ベストプラクティス

このトピックでは、Amazon を使用する際に従うべきいくつかのベストプラクティスの概要を説明しますMSK。Amazon MSKレプリケーターのベストプラクティスについては、「」を参照してくださいMSK レプリケーターを使用するためのベストプラクティス

クラスターの適切なサイズ設定: ブローカーあたりのパーティション数

次の表は、推奨されるブローカーあたりのパーティション数 (リーダーとフォロワーのレプリカを含む) を示しています。

ブローカーサイズ 推奨されるブローカーあたりのパーティション数 (リーダーとフォロワーのレプリカを含む)
kafka.t3.small 300
kafka.m5.large、または kafka.m5.xlarge 1,000
kafka.m5.2xlarge 2000
kafka.m5.4xlargekafka.m5.8xlargekafka.m5.12xlargekafka.m5.16xlarge、 または kafka.m5.24xlarge 4000
kafka.m7g.large、または kafka.m7g.xlarge 1,000
kafka.m7g.2xlarge 2000
kafka.m7g.4xlargekafka.m7g.8xlargekafka.m7g.12xlarge、または kafka.m7g.16xlarge 4000

ブローカーあたりのパーティション数が推奨値を超え、クラスターが過負荷になると、以下のオペレーションを実行できなくなる可能性があります。

  • クラスター設定の更新

  • クラスターをより小さなブローカーサイズに更新する

  • を関連付ける AWS Secrets Manager SASL/SCRAM 認証を持つクラスターを持つ シークレット

パーティションの数が多いと、Prometheus スクレイピング CloudWatch で Kafka メトリクスが欠落する可能性があります。

パーティション数の選択に関するガイダンスについては、「Apache Kafka Supports 200K Partitions Per Cluster」を参照してください。また、ブローカーに適したサイズを決定するために、独自のテストを実行することをお勧めします。さまざまなブローカーサイズの詳細については、「」を参照してくださいブローカーサイズ

クラスターの適切なサイズ設定: クラスターあたりのブローカー数

MSK クラスターに適したブローカー数を決定し、コストを理解するには、MSK「サイジングと料金表」を参照してください。このスプレッドシートは、 MSKクラスターのサイズ設定と、同様のセルフマネージド型の EC2ベースの Apache Kafka クラスターMSKと比較した Amazon の関連コストの見積もりを提供します。スプレッドシートの入力パラメータの詳細については、パラメータの説明にカーソルを合わせてください。このシートに記載されている見積もりは保守的なものであり、新しいクラスターの出発点となります。クラスターのパフォーマンス、サイズ、コストはユースケースによって異なるため、実際のテストで検証することが推奨されます。

基盤となるインフラストラクチャが Apache Kafka のパフォーマンスにどのように影響するかを理解するには、「」の「Apache Kafka クラスターのサイズを適切に設定してパフォーマンスとコストを最適化するためのベストプラクティス」を参照してください。 AWS ビッグデータブログ。このブログ記事では、スループット、可用性、レイテンシーの要件を満たすようにクラスターのサイズを設定する方法について説明しています。また、スケールアップまたはスケールアウトを行うべきタイミングなどの質問への回答や、本番稼働のクラスターのサイズを継続的に検証する方法についてのガイダンスも提供しています。

m5.4xl、m7g.4xl 以上のインスタンスのクラスタースループットを最適化する

m5.4xl、m7g.4xl、またはそれ以上のインスタンスを使用する場合、num.io.threads と num.network.threads の設定を調整することで、クラスターのスループットを最適化できます。

num.io.threads は、ブローカーがリクエストを処理するために使用するスレッドの数です。インスタンスサイズでサポートされているCPUコア数までスレッドを追加すると、クラスターのスループットを向上させることができます。

num.network.threads は、すべての着信リクエストを受信してレスポンスを返すためにブローカーが使用するスレッドの数です。ネットワークスレッドは、着信リクエストをリクエストキューに入れ、io.threads で処理します。num.network.threads をインスタンスサイズでサポートされているCPUコア数の半分に設定すると、新しいインスタンスサイズを完全に使用できます。

重要

num.network.threads を増やす場合は、先に num.io.threads を増やす必要があります。そうしないと、キューの飽和による輻輳が発生する可能性があります。

推奨される設定
インスタンスサイズ num.io.threads の推奨値 num.network.threads の推奨値

m5.4xl

16

8

m5.8xl

32

16

m5.12xl

48

24

m5.16xl

64

32

m5.24xl

96

48

m7g.4xlarge

16

8

m7g.8xlarge

32

16

m7g.12xlarge

48

24

m7g.16xlarge

64

32

トピック ID の不一致の問題を回避 AdminClient するために最新の Kafka を使用する

Kafka バージョン 2.8.0 より前のバージョンと フラグを使用して Kafka AdminClient バージョン 2.8.0 以降を使用するクラスターのトピックパーティション--zookeeperを増加または再割り当てすると、トピックの ID が失われます (エラー: はパーティションのトピック ID と一致しません)。--zookeeper フラグは Kafka 2.5 で非推奨になり、Kafka 3.0 以降では削除されているので注意してください。「Upgrading to 2.5.0 from any version 0.8.x through 2.4.x」を参照してください。

トピック ID の不一致を回避するには、Kafka 管理オペレーションに Kafka クライアントバージョン 2.8.0 以降を使用してください。または、2.5 以降のクライアントでは、--zookeeper フラグの代わりに --bootstrap-servers フラグを使用できます。

高可用性クラスターの構築

更新時 (ブローカーサイズや Apache Kafka バージョンを更新する場合など) または Amazon MSKがブローカーを置き換えるときにMSKクラスターを高可用性にするには、次の推奨事項を使用します。

  • 3-AZ クラスターを設定します。

  • レプリケーション係数 (RF) が 3 以上であることを確認します。RF が 1 の場合、ローリング更新中にパーティションがオフラインになる可能性があり、RF が 2 の場合、データが失われる可能性があることに注意してください。

  • 最小同期レプリカ (最小 ISR) を最大 RF - 1 に設定します。RF と等しい最小値ISRを指定すると、ローリング更新中に がクラスターに生成されるのを防ぐことができます。2 分間ISRで、1 つのレプリカがオフラインのときに 3 方向レプリケートされたトピックを使用できます。

  • クライアント接続文字列に、各アベイラビリティーゾーンのブローカーが少なくとも 1 つ含まれていることを確認してください。クライアントの接続文字列に複数のブローカーが含まれていると、特定のブローカーが更新のためにオフラインになった場合にフェイルオーバーができるようになります。複数のブローカーで接続文字列を取得する方法については、「Amazon MSKクラスターのブートストラップブローカーの取得」を参照してください。

CPU 使用状況のモニタリング

Amazon では、ブローカー ( と定義CPU User + CPU System) の合計CPU使用率を 60% 未満に維持することをMSK強くお勧めします。クラスターの合計の 40% 以上がCPU使用可能な場合、Apache Kafka は必要に応じてクラスター内のブローカー間でCPU負荷を再分散できます。これが必要な場合の 1 つの例は、Amazon がブローカーの障害MSKを検出して復旧する場合です。この場合、Amazon はパッチ適用などの自動メンテナンスMSKを実行します。もう 1 つの例は、ユーザーがブローカーのサイズ変更またはバージョンアップグレードをリクエストする場合です。これら 2 つの場合、Amazon は一度に 1 つのブローカーをオフラインにするローリングワークフローをMSKデプロイします。リードパーティションを持つブローカーがオフラインになると、Apache Kafka はパーティションのリーダーシップを再割り当てして、クラスター内の他のブローカーに作業を再配布します。このベストプラクティスに従うことで、このような運用イベントを許容するのに十分なCPUヘッドルームをクラスター内に確保できます。

Amazon CloudWatch Metric Math を使用して、 である複合メトリクスを作成できますCPU User + CPU System。複合メトリクスの平均CPU使用率が 60% に達したときにトリガーされるアラームを設定します。このアラームがトリガーされたら、以下のいずれかのオプションを使用してクラスターをスケーリングします。

  • オプション 1 (推奨): ブローカーサイズを次に大きいサイズに更新します。例えば、現在のサイズが の場合kafka.m5.large、 を使用するようにクラスターを更新しますkafka.m5.xlarge。クラスター内のブローカーサイズを更新すると、Amazon MSKはブローカーをローリング方式でオフラインにし、一時的にパーティションリーダーシップを他のブローカーに再割り当てすることに注意してください。サイズの更新には、通常、ブローカーごとに 10 〜 15 分かかります。

  • オプション 2: ラウンドロビン書き込みを使用するプロデューサーからすべてのメッセージを取り込んでいる (つまり、メッセージにキーが設定されておらず、コンシューマーにとって順序は重要ではない) トピックがある場合は、ブローカーを追加してクラスターを拡張します。また、スループットが最も高い既存のトピックにパーティションを追加します。次に、kafka-topics.sh --describe を使用して、新しく追加されたパーティションが新しいブローカーに割り当てられていることを確認します。前のオプションと比較したこのオプションの主な利点は、リソースとコストをよりきめ細かく管理できることです。さらに、ロードが 60% CPUを大幅に超える場合は、このオプションを使用できます。これは、この形式のスケーリングでは、通常、既存のブローカーのロードが増加しないためです。

  • オプション 3: ブローカーを追加してクラスターを拡張し、kafka-reassign-partitions.sh という名前のパーティション再割り当てツールを使用して既存のパーティションを再割り当てします。ただし、このオプションを使用する場合、パーティションが再割り当てされた後、クラスターはブローカーからブローカーにデータを複製するためにリソースを費やす必要があります。前の 2 つのオプションと比較すると、これにより、最初はクラスターのロードが大幅に増加する可能性があります。その結果、レプリケーションによってCPU負荷とネットワークトラフィックが増えるため、CPU使用率が 70% を超える場合、Amazon はこのオプションを使用することを推奨MSKしません。Amazon MSK では、前の 2 つのオプションが不可能な場合にのみ、このオプションを使用することを推奨しています。

その他の推奨事項:

  • ロードディストリビューションのプロキシとして、ブローカーあたりの総CPU使用率をモニタリングします。ブローカーのCPU使用率が一貫して不均等である場合は、負荷がクラスター内に均等に分散されていない可能性があります。Amazon MSK では、Cruise Control を使用して、パーティション割り当てによる負荷分散を継続的に管理することをお勧めします。

  • 生成および消費レイテンシーをモニタリングします。レイテンシーの生成と消費は、CPU使用率に応じて直線的に増加する可能性があります。

  • JMX スクレイプ間隔: Prometheus 機能 でオープンモニタリングを有効にする場合は、Prometheus ホスト設定 (prometheus.yml) に 60 秒以上のスクレイプ間隔 (scrape_interval: 60s) を使用することをお勧めします。スクレイプ間隔を短くすると、クラスターのCPU使用率が高くなる可能性があります。

ディスク容量のモニタリング

メッセージのディスク容量が不足しないようにするには、 KafkaDataLogsDiskUsedメトリクスを監視する CloudWatch アラームを作成します。このメトリクスの値が 85% に達するか超える場合は、次の 1 つ以上のアクションを実行します。

  • Auto Scaling を使用します。「手動スケーリング」の説明に従って、ブローカーストレージを手動で増やすこともできます。

  • メッセージの保持期間またはログサイズを減らします。これを行う方法については、データ保持パラメータの調整 を参照してください。

  • 未使用のトピックを削除します。

アラームをセットアップして使用する方法については、「Amazon CloudWatch アラームの使用」を参照してください。Amazon MSKメトリクスの完全なリストについては、「」を参照してくださいAmazon MSKクラスターのモニタリング

データ保持パラメータの調整

メッセージを消費しても、ログからは削除されません。定期的にディスク容量を解放するには、保持期間(メッセージをログに保持する期間)を明示的に指定できます。保存ログのサイズを指定することもできます。保持期間または保持ログのサイズのいずれかに達すると、Apache Kafka は、ログから非アクティブなセグメントの削除を開始します。

クラスターレベルで保持ポリシーを指定するには、log.retention.hourslog.retention.minuteslog.retention.ms、または log.retention.bytes のいずれかまたは複数のパラメータを設定します。詳細については、「カスタムMSK設定」を参照してください。

トピックレベルで保持パラメータを指定することもできます。

  • トピックごとに保持期間を指定するには、次のコマンドを使用します。

    kafka-configs.sh --bootstrap-server $bs --alter --entity-type topics --entity-name TopicName --add-config retention.ms=DesiredRetentionTimePeriod
  • トピックごとに保持ログのサイズを指定するには、次のコマンドを使用します。

    kafka-configs.sh --bootstrap-server $bs --alter --entity-type topics --entity-name TopicName --add-config retention.bytes=DesiredRetentionLogSize

トピックレベルで指定する保持パラメータは、クラスターレベルのパラメータよりも優先されます。

不正シャットダウン後のログ復旧の高速化

不正シャットダウンの後、ブローカーはログ復旧を実行するため、再起動に時間がかかることがあります。デフォルトでは、Kafka はログディレクトリごとに 1 つのスレッドのみを使用してこの復旧を実行します。例えば、数千のパーティションがある場合、ログ復旧が完了するまでに数時間かかる可能性があります。ログ復旧を高速化するには、設定プロパティ num.recovery.threads.per.data.dir を使用してスレッド数を増やすことが推奨されます。CPU コア数に設定できます。

Apache Kafka メモリのモニタリング

Apache Kafka が使用するメモリをモニタリングすることが推奨されます。そうしないと、クラスターを使用できなくなる可能性があります。

Apache Kafka が使用するメモリ量を判別するために、HeapMemoryAfterGC メトリクスをモニタリングできます。HeapMemoryAfterGC は、ガベージコレクション後に使用されている合計ヒープメモリの割合 (%) です。HeapMemoryAfterGC が 60% を超えたときにアクションを実行する CloudWatch アラームを作成することをお勧めします。

メモリ使用量を減らすために実行できるステップはさまざまです。これらは Apache Kafka の設定方法によって異なります。例えば、トランザクションメッセージ配信を使用する場合、Apache Kafka 設定の transactional.id.expiration.ms 値を 604800000 ミリ秒から 86400000 ミリ秒に (7 日から 1 日に) 減らすことができます。これにより、各トランザクションのメモリフットプリントが減ります。

以外のMSKブローカーを追加しない

ZooKeeperベースのクラスターの場合、Apache ZooKeeper コマンドを使用してブローカーを追加すると、これらのブローカー ZooKeeper はMSKクラスターに追加されず、Apache にはクラスターに関する誤った情報が含まれます。これにより、データが失われる可能性があります。サポートされているクラスターオペレーションについては、「Amazon MSK: 仕組み」を参照してください。

転送中の暗号化を有効にする

転送中の暗号化とその有効化方法については、「転送中の暗号化」を参照してください。

パーティションの再割り当て

同じクラスター上の異なるブローカーにパーティションを移動するには、kafka-reassign-partitions.sh という名前のパーティション再割り当てツールを使用できます。例えば、新しいブローカーを追加してクラスターを拡張したり、ブローカーを削除するためにパーティションを移動したりした後、新しいブローカーにパーティションを再割り当てすることで、そのクラスターのバランスを再調整できます。クラスターにブローカーを追加する方法については、「Amazon MSKクラスターの拡張」を参照してください。クラスターからブローカーを削除する方法については、「」を参照してくださいAmazon MSKクラスターからブローカーを削除する。パーティション再割り当てツールの詳細については、Apache Kafka のドキュメントの「クラスターの拡張」を参照してください。