Apache Kafka on Heroku
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年06月07日(金)
Table of Contents
Apache Kafka on Heroku は、サービスとしての Kafka を Heroku プラットフォームに完全に統合するためのアドオンです。
Apache Kafka は、メッセージベースのトピックを使用したプロデューサーとコンシューマー間の高速でフォールトトレラントな通信用の分散コミットログです。Kafka は、数十億のイベントと数百万のトランザクションを処理できる新世代の分散アプリケーションを構築するためのメッセージングバックボーンを提供しています。Kafka は、高度な信頼性とフォールトトレランスのもと大量の一時的なデータを移動させるように設計されています。
Kafka を使用すると、次のような多くの重要なユースケースのアーキテクチャを簡単に設計し実装できます。
弾性キューイング
Kafka は、システムが、変動の大きいスケーリング需要をダウンストリームサービスに置かずに、大量の着信イベントを簡単に受け入れられるようにします。これらのダウンストリームサービスは、イベントの「プッシュ」に反応するのではなく、容量があるときには Kafka のイベントストリームからプルできます。これにより、スケーリング、負荷の変動の処理、および全般的な安定性が向上します。
データパイプラインおよび分析
大規模なアプリケーションは多くの場合、データから最大の価値を引き出すために分析や ETL パイプラインを必要とします。Kafka の不変のイベントストリームにより、開発者は、データの変換および集計用の高度な並列データパイプラインを構築できます。したがって、開発者は、バッチシステムや変動しやすいデータで可能であったものよりもはるかに高速で安定したデータパイプラインを実現できます。
マイクロサービスの調整
多くのアプリケーションは、規模が大きくなると、マイクロサービススタイルのアーキテクチャに移行し、サービスディスカバリ、サービス可用性の依存関係と順序付け、サービスの相互作用など、マイクロサービスに伴う課題に直面します。サービス間の通信に Kafka を使用するアプリケーションであれば、これらの設計問題を大幅に簡単なものにできます。Kafka は、サービスが自ら簡単にマイクロサービスネットワークになり、メッセージの送受信を行うときの Kafka トピックを検出できるようにします。サービス間のメッセージが Kafka で永続的に管理されると、順序付けや依存関係の問題は軽減し、トピックベースの調整によってサービスディスカバリのオーバーヘッドが低減します。
Kafka の概念
Kafka クラスターは、多数のブローカー、つまり Kafka を実行するインスタンスから構成されています。クラスタ内のブローカーの数は、容量、障害許容力、並列処理を高めるために増大させることができます。
プロデューサーは、Kafka ブローカーに書き込むクライアントであり、コンシューマーは Kafka ブローカーから読み取るクライアントです。
ブローカーは、トピック内のメッセージ (Kafka に送信されたイベント) のストリームを管理します。トピックは、サポートすることになるデータに応じて、さまざまなオプション (保持、圧縮、複製因子など) で設定されます。
トピックは、並列処理や順序付けの問題のバランスをとるために使用されるトピックの個別のサブセットである多数のパーティションから構成されます。パーティション数を増やすと、特定のトピックを扱うプロデューサーおよびコンシューマーの数が増加し、並列処理やスループットが増えることがあります。パーティション内のメッセージは順序付けられますが、パーティション間のメッセージの順序付けは保証されていません。並列処理と順序付けのバランスをとる必要性は、トピックの適切なパーティション設定にとって重要です。
例として、ユーザー ID のハッシュをパーティションキーとして使用するトピックを考えてみます。これにより、特定のユーザーの更新が発生した順序でどのコンシューマーにも示されることが保証されますが、(別のパーティションで管理されている可能性のある) それ以外のユーザーの更新は相互に早着または遅着する可能性があります。
パーティション内の各メッセージにはオフセット、つまり数字の識別子があり、シーケンス内のその位置を示します。Kafka 0.10 以降、メッセージには、オプションのタイムスタンプも含まれることがあり、これにはメッセージが作成された時間か、メッセージが Kafka に書き込まれた時間が反映されます。
Apache Kafka プロジェクトについては、概要ドキュメントで詳細に説明しています。
開発環境の準備
Apache Kafka on Heroku は、Heroku の CLI プラグインを使用する必要があります。この機能は、将来 Heroku CLI にまとめられますが、当面は次のコマンドを実行してください。
$ heroku plugins:install heroku-kafka
Kafka CLI プラグインには Python が必要で、追加の設定を行わない場合、Windows では機能しません。
- Python 2.7 をインストールします
- Python 2.7 用に PATH および PYTHONPATH を設定します
- ノード 8.x をインストールします
- cmd.exe を管理者として開きます (
npm install --global windows-build-tools
) - .NET Framework をインストールします
- Visual C++ Build ツールをインストールします
$ heroku plugins:install heroku-kafka
を実行します
ローカルテストおよび開発
Kafka によるローカルテストおよび開発は、そのクラスター設定のために、何らかの注意を必要とすることがあります。kafka-docker
セットアップは、ローカルで快適に操作できるように、十分に低いメモリフットプリントで設定されている限り、ローカルクラスターを実行する適切な方法をもたらします。Heroku は、近い将来にさまざまな開発中心プランを提供することに取り組んでいます。
プランと設定
現在、さまざまなプランをプラットフォームのランタイムに使用できます。現在利用できるプランは、クラスターが割り当てられており、高スループットおよび高ボリュームに最適化されています。幅広い一連のニーズに対応するためにこのプランの範囲を拡張し、イベント化されたアーキテクチャを開発の全ステージでアプリケーションに使用できるようにし続けます。
一般的なランタイムプラン
プラン名 | 容量 | 最大保持期間 | vCPU | RAM | クラスター |
---|---|---|---|---|---|
standard-0 | 150GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
standard-1 | 300GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
standard-2 | 900GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
extended-0 | 400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
extended-1 | 800GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
extended-2 | 2400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
Private Spaces プラン
プラン名 | 容量 | 最大保持期間 | vCPU | RAM | クラスター |
---|---|---|---|---|---|
private-standard-0 | 150GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
private-standard-1 | 300GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
private-standard-2 | 900GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
private-extended-0 | 400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
private-extended-1 | 800GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
private-extended-2 | 2400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
Shield Spaces プラン
プラン名 | 容量 | 最大保持期間 | vCPU | RAM | クラスター |
---|---|---|---|---|---|
shield-standard-0 | 150GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
shield-standard-1 | 300GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
shield-standard-2 | 900GB | 2 週間 | 4 | 16GB | 3 kafka、5 zookeeper |
shield-extended-0 | 400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
shield-extended-1 | 800GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
shield-extended-2 | 2400GB | 6 週間 | 4 | 16GB | 8 kafka、5 zookeeper |
選択可能なすべてのプランのリストはここから見つけることができます。
アドオンのプロビジョニング
Apache Kafka on Heroku は、プラットフォームの他のアドオンと同じように管理されます。Kafka クラスターは、CLI を介して Heroku アプリケーション用にプロビジョニングできます。
$ heroku addons:create heroku-kafka:standard-0 -a kafka-demo
Creating kafka-animated-39618... done
Adding kafka-animated-39618 to kafka-demo... done
The cluster should be available in 15-45 minutes.
Run `heroku kafka:wait` to wait until the cluster is ready.
Use `heroku addons:docs heroku-kafka` to view documentation.
Kafka は大規模で可用性の高いサービスのため、新しいクラスターが利用可能になるまでしばらく時間がかかります。heroku kafka:wait
と入力することにより進捗状況を追跡できます。
他の使用がサービスの操作の安定性を低下させる可能性があるため、Kafka のサポートでその役割を超えて Zookeeper を使用することはお勧めできません。Private Space において (Common Runtime ではなく)、Kafka に関連付けられた Zookeeper へのアクセスを、アドオン作成時に有効にすることができます。これは、アドオン作成コマンドでオプションを渡すことにより行えます (heroku addons:create heroku-kafka --enable-zookeeper
)。Zookeeper アクセスは、heroku kafka:zookeeper enable
または heroku kafka:zookeeper disable
のコマンドを介して、作成後に有効または無効にすることもできます。
Shield Space で、Zookeeper アクセスは許可されません。
Kafka がプロビジョニングされたら、Kafka 環境設定をアプリ設定で使用できます。これは heroku config:get KAFKA_URL
コマンドを使用して確認できます。
クラスターへの接続方法については、「Kafka クラスターへの接続」を参照してください。
$ heroku config:get KAFKA_URL
Kafka は、Common Runtime、Private Space、および Shield Space で使用できます。Private Space または Shield Space でのアプリケーション用に Kafka をプロビジョニングすると、その Space にアタッチされた分離データリソースネットワーク内に Kafka クラスターが作成されます。
アプリケーション間での Kafka の共有
Kafka は、同じグループ内の多数の異なるコードベースおよびプロジェクトで共有されるときに、うまく機能します。独立したプロデューサーおよびコンシューマーのセットとして Kafka の使用法を構築することをお勧めします。複数のアプリケーションとしてか、1 つ以上のアプリケーションのプロセスタイプとして設定してください。
$ heroku addons:attach my-originating-app::KAFKA -a this-app
クラスター情報の表示
次のように入力して、クラスターの現在の状態を調べることができます。
$ heroku kafka:info
このコマンドにより、リソースの名前、作成日、プラン、バージョン、ステータス、トピック、トラフィック、およびアクティブコンシューマーに関する情報が表示されます。
クラスターの詳細なトピックごとのスループット情報は、次のようにして入手できます。
$ heroku kafka:topics
Apache Kafka on Heroku プランのアップグレード
Apache Kafka on Heroku プランは、CLI で heroku addons:upgrade
コマンドを使用してアップグレードできます。
このコマンドは、次のために使用できます。
- マルチテナント Kafka Basic プランのアップグレードまたはダウングレード。
- 専用クラスタープランのアップグレードまたはダウングレード。
「マルチテナントと専用クラスターとの違い」を参照してください。
このコマンドは、次のためには使用できません。
- マルチテナントプランと専用プランの間でのアップグレードまたはダウングレード。このアップグレードには移行が必要です。
- 一般的なランタイムプランと Private または Shield 層プランの間でのアップグレードまたはダウングレード。
Kafka クラスターのデータサイズが、ダウングレード後のプランの上限を超えている場合、小さいプランへのダウングレードは許可されません。
Apache Kafka on Heroku プランをアップグレードするには、最初にアップグレードする Kafka クラスターのリソース名を見つけます。リソース名は、すべてのアプリおよびアドオンにわたるクラスターのグローバル固有名です。
$ heroku kafka:info -a example-app
=== kafka-animated-12345
Plan: heroku-kafka:standard-0
Status: available
Version: 2.8.2
Created: 2022-11-30T13:02:37.320+00.00
Topics: 84 topics, see heroku kafka:topics
Partitions: [··········] 414 / 12000 partition replicas (partitions × replication factor)
Messages: 0 messages/s
Traffic: 32 bytes/s in / 166 bytes/s out
Data Size: [··········] 68.38 MB / 150.00 GB (0.04%)
Add-on: kafka-convex-12345
以下の例では、kafka-animated-12345
が Standard-0
プランから Extended-0
プランにアップグレードされます。ここで、kafka-animated-12345
は Kafka クラスターの名前であって、この場合はアプリケーションではないことを覚えておいてください。
$ heroku addons:upgrade kafka-animated-12345 extended-1 -a example-app
Changing kafka-convex-12345 on example-app from heroku-kafka:standard-0 to heroku-kafka:extended-0... done, ($1800.00/month)
Kafka cluster is being upgraded, and will be ready shortly.
Please use `heroku kafka:wait` to monitor the status of your upgrade.
Apache Kafka on Heroku のプランレベルのスケールアップまたはスケールダウンのプロセスは、その場で行われます。ただし、実際のデータ移行が必要になる状況がいくつか存在します。アップグレード中に新しいブローカーを追加または削除する場合、ブローカーの間でパーティションを再分散します。
アップグレードプロセスは、heroku kafka:wait
を使用して実行できます。
$ heroku kafka:wait -a example-app
Waiting for cluster kafka-convex-12345... ⡿ upgrading
あるいは、heroku kafka:info
を使用することもできます。
$ heroku kafka:info -a example-app
=== kafka-animated-12345
Plan: heroku-kafka:extended-0
Status: upgrading
Version: 2.8.2
Created: 2022-11-30T13:02:37.320+00.00
Topics: 84 topics, see heroku kafka:topics
Partitions: [··········] 414 / 12000 partition replicas (partitions × replication factor)
Messages: 0 messages/s
Traffic: 25 bytes/s in / 136 bytes/s out
Data Size: [··········] 68.38 MB / 150.00 GB (0.04%)
Add-on: kafka-convex-12345
アップグレードを完了するのに要する時間は、プランの違いとストリームボリュームのサイズに依存します。アップグレードまたはダウングレードが同じ層のレベル間で行われる場合 (standard-0
から standard-1
など)、アップグレードはほぼ即時に行われます。アップグレードまたはダウングレードが異なる層の間で行われる場合 (standard
から extended
など)、各プランで提供される追加のブローカーを作成または削除し、最終的なブローカーの数でパーティションを再分散します。このプロセスにダウンタイムはありませんが、クラスターのサイズによっては完了するまでに時間がかかります。
Kafka の管理
トピックは、メッセージの構造化された表現であり、プロデューサーとコンシューマーとの媒介役として機能します。Kafka でのトピックの名前とは別に、データがどのようにトピックを流れるかを定義する設定可能なプロパティがいくつかあります。
プロパティには、複製因子、論理パーティションの数、および圧縮または時間ベースの保持が含まれます。Heroku 提供のデフォルト設定は、多くのアプリケーションに適していますが、1 日に数十億のイベントを処理することが予想されるトピックの場合、本番環境に移る前にさらなる調査を検討してください。
設定のデフォルトと限度
パラメーター | デフォルト | 下限 | 上限 |
---|---|---|---|
複製 | 3 | 3 | クラスター内のブローカーの数 |
保持期間 | 1 日 | 1 日 | standard: 2 週間、extended: 6 週間 |
トピックあたりのパーティション数 | 32 | 1 | 256 |
クラスターあたりのパーティション数 | 非該当 | 非該当 | 4000 x クラスター内のブローカーの数 |
トピックの設計は慎重に行うことをお勧めします。retention や compaction などのパラメーターは、比較的簡単に変更でき、replication は、もう少し注意を払って変更できますが、partitions は現在、作成後に変更できません。圧縮および時間ベースの保持は、特定のトピックにとって相互に排他的な設定ですが、クラスター内の異なるトピックには、これらの設定が混在していることがあります。
トピックについて
Kafka トピックは、Web ダッシュボードと CLI を使用して作成および管理できます。このセクションでは、CLI ベースのトピック管理の基本を取り上げます。
Heroku CLI 自体から完全な CLI ドキュメントに常にアクセスできます。
$ heroku help kafka
自動的なトピック作成、つまり「最初の書き込み時のトピックの作成」は現在 Heroku で利用できません。
次の CLI コマンドを使用してトピックを作成および破棄できます。
$ heroku kafka:topics:create my-cool-topic --partitions 100
$ heroku kafka:topics:destroy my-cool-topic
次の CLI コマンドを使用してクラスター上のすべてのトピックを一覧表示できます。
$ heroku kafka:topics
次の CLI コマンドを使用してトピックに関する情報を確認できます。
$ heroku kafka:topics:info my-cool-topic
トピックのテストおよび調査を円滑に行うために、CLI からトピックに書き込むことも、トピックの末尾につなげることもできます。
許可されたソースに対して IP ルールを作成した場合、kafka:write
および kafka:tail
は Private Space と Shield Space でのみ機能します。
次の CLI コマンドを使用して、トピックに新しいメッセージを書き込むことができます。
$ heroku kafka:topics:write my-cool-topic MESSAGE
次の CLI コマンドを使用して、トピックをサブスクライブし、そこから新しいメッセージを読むことができます。
$ heroku kafka:topics:tail my-cool-topic
基本的なマルチテナント Kafka プランには、トピックおよびコンシューマーグループの接頭辞が必要です。「マルチテナントと専用との違い」を参照してください。Kafka コンシューマーを統合するときに、トピックおよびコンシューマーグループの前に KAFKA_PREFIX
環境変数の値が付けられていることを確認します。そうでない場合、メッセージは受信されず、Kafka デバッグイベントに、Broker: Topic authorization failed (ブローカー: トピックの認証に失敗しました) や Broker: Group authorization failed (ブローカー: グループの認証に失敗しました) のようなエラーが表示されることがあります。
パーティションについて
Kafka トピックは、多数の論理パーティションで設定されます。これらはログをシャードに分割します。それぞれのシャードは、クラスター内で独立して分散され消費できます。
ただし、Kafka の順序付けの保証は、個々のパーティション内でのみ適用されます。つまり、メッセージは生成された順序で消費されますが、複数のパーティションにわたる場合はインターリーブされる可能性があります。
ほとんどのコンシューマーライブラリは、パーティションあたり単一のコンシューマースレッドを割り当てます。したがって、トピックに選択するパーティションの数と、それらにメッセージを配信する方法が、アプリケーションのスケーラビリティにとって重要になります。
コンシューマーがプロデューサーと比べて比較的「低速」である場合は (外部データベースに書き込んでいる場合など)、パーティションの数を増やすことをお勧めします。デフォルトと制限に関する上記のセクションのとおり、現在のプランでは、トピックあたりのデフォルトのパーティション数は 32、トピックあたりの最大のパーティション数は 256、クラスター内の最大のパーティション数は 4000 x ブローカー数になります (たとえば、standard
プランクラスターでは 12000 のパーティション、extended
プランクラスターでは 32000 のパーティション)。
クリーンアップポリシー
Kafka は、トピックでのクリーンアップに、時間ベースの保持とログ圧縮の 2 つのプライマリモードをサポートしています。バージョン 0.10.1.0 現在、Kafka は、これらのモードの混合使用をサポートしています。たとえば、トピックは、時間ベースの保持、圧縮、または両方のモードを有効にしている場合があります。
時間ベースの保持
これは、Kafka トピックのクリーンアップのデフォルトモードです。メッセージは、トピックのパーティションに書き込まれると、時間値が注釈として付けられ、ログセグメントに書き込まれます。ログセグメントは続いて定期的に処理され、保持期間を超えたメッセージは、クリーンアップされ、削除されます。
$ heroku kafka:topics:retention-time my-cool-topic '18 hours'
現在、Apache Kafka on Heroku は、最低の保持期間が 24 時間で、最大の保持期間が standard
プランでは 2 週間、extended
プランでは 6 週間です。
ログ圧縮
Kafka は、ログ圧縮と呼ばれる、トピックでの代替設定をサポートしています。この設定は、所定のキーの最新のメッセージのみを保持し、以前のものはツームストーンするように、トピックのセマンティックスを変更します。これは、バリューストリーム、つまりデータのテーブルのようなビューの作成を可能にし、データおよびシステムのモデリングにおける強力な構成概念になります。
圧縮されたトピック (時間ベースの保持を有効にしない) が、時間の経過とともにすべての記憶域を自動的に解放するわけではないことに注意してください。所定のキーに関する最新版のメッセージは、そのキーの新しいメッセージがトピックに書き込まれるか、またはそのキーに対して明示的なツームストーンが書き込まれるかによって、能動的にツームストーンされるまで存続します。このために、無限のキー空間で圧縮されたトピックが、時間の経過とともに無限に増大し、予想外のリソースの使用が促進される場合があります。圧縮したトピックは、プランの限度内に収めるために、慎重に使用し監視する必要があります。
所定のキーの古いメッセージは、ツームストーンされても、ログクリーナープロセスで消去されるまで削除されないことにも注意してください。このプロセスは、非同期的であり、現在セグメントが処理されるまで、所定のキーの複数バージョンがログに残ります。
$ heroku kafka:topics:compaction my-cool-topic enable
複製
トピックの複製因子によって、クラスター内のブローカーにわたって維持されるレプリカまたはコピーの数が決まります。複製によって、Kafka クラスター内のデータの耐久性とフォールトトレランスが高まり、クラスターで管理されるデータの量も増大します。
Kafka は、standard
および extended
プランで最低 3 の複製因子が必要になるように設定されています。複製は、Kafka クラスター内のブローカー数と同じ値に設定できます。
$ heroku kafka:topics:replication-factor my-cool-topic 3
既存のトピックの複製因子を増やすと、使用可能なブローカーの間で追加レプリカを作成するように機能するので、Kafka クラスターへの負荷が増大する場合があります。これにより、クラスターで保持されるデータのサイズも増加します。このサイズはプランの容量との関連で検討する必要があります。
プロデューサーの承認の設定
プロデューサーの承認設定、つまりプロデューサー acks
が、レプリカの数に関連しています。これにより、成功したと見なされるまでに、同期レプリカのうち書き込みを承認する必要のあるものの数が決まります。この設定は、複製因子とともに、書き込みのレイテンシーおよび耐久性の保証に影響します。この設定は、Kafka へ生成するために使用するアプリケーションコードに存在しますが、複製と一緒に考慮することが重要です。
acks=0
の設定は、プロデューサーが、書き込もうと試みたブローカーからの確認を待たずに続行するということを意味します。これによりプロデューサーのレイテンシーが低減することはありますが、サーバーがメッセージを記録したという保証はなされず、クライアントは書き込みを再試行できなくなります。
acks=1
の設定は、プロデューサーが、メッセージが最初に書き込まれたブローカーだけからの書き込みの確認を待機するということを意味します。プロデューサーの再試行は、この設定でも行われることがありますが、他のトピックのレプリカにデータが同期される前にブローカーインスタンスが失敗した場合、データの損失も引き続き起きる可能性があります。
acks=all
または acks=-1
の設定は、続行する前に、すべてのレプリカが同期され、書き込みを承認していることを要求します。複製因子が高いと、これに伴うレイテンシーが増大することがありますが、書き込みに対するデータ障害許容力の保証が最も強力になります。
ACL について
単一テナント (standard
および extended
) の Apache Kafka On Heroku プランを使用しているお客様に対して、発行済みのサポート対象の ACL ポリシーが用意されています。今後、新しい Changelog の更新なしにこれらの ACL を変更することはありません。
お客様は次の内容にアクセスできます。
- リソースタイプ
Topic
の名前*
に対するRead,Write,Describe
- リソースタイプ
Group
の名前*
に対するRead,Write,Describe,Delete
- リソースタイプ
TransactionalId
の名前*
に対するDescribe,Write
Kafka バージョンとクライアント
Heroku は、デフォルトで Apache Kafka バージョン 3.7.1 を提供しています。
使用可能な Kafka バージョン
メジャーバージョン | マイナーバージョン | ステータス | EOL 日 |
---|---|---|---|
2.7 | 2.7.1 | EOL | 2022-06-15 |
2.8 | 2.8.2 | Available | TBD |
3.7 | 3.7.1 | Available | TBD |
一般に、使用されるクライアントライブラリのバージョンは、クラスターのバージョン以下である必要があります。
Kafka は、接続の暗号化および認証に SSL をサポートし、これが Common Runtime でサポートされる唯一の接続モードになります。このため、SSL 暗号化およびクライアント証明書をサポートするライブラリを使用する必要があります。Private Space では、下記のように、プレーンテキスト接続をオプションで使用できます。Shield Space では、プレーンテキスト接続は許可されません。
バージョンのライフサイクル
Apache Kafka プロジェクトは、約 4 か月 (3 回/年) で新しいメジャーバージョンをリリースします。このリリーススケジュールに従って、昨年発行したすべてのバージョンを新しいアドオンで使用できるようにします。サポートされるのは、上位プロジェクトが管理する Apache Kafka バージョンのみです。最新のポイントリリースが使用できるようになった 1 年後、メジャーバージョンを廃止とマークし、新しいアドオンでのこのバージョンの許可を停止します。
バージョンが廃止された後、クラスターは通常どおり動作し続けます。ただし、廃止されたバージョンはバグ修正プログラムやセキュリティパッチを受信せず、コミュニティでサポートされなくなるため、以前のバージョンを実行するには危険が伴うことがわかっています。Heroku は、影響を受けるクラスターの非推奨プロセスについてメール経由で顧客に通知します。
ユーザーがアドオンバージョンを定期的に評価し、少なくとも年に一度クラスターをアップグレードする計画を立てることをお勧めします。このスケジュールに遅れないようにすることにより、クラスターは、重要なバグ修正プログラムと信頼性の重大な改善を得られます。
Kafka バージョンのアップグレード
専用の Kafka クラスターのバージョンをアップグレードするには、コマンドラインから次のコマンドを使用します。
$ heroku kafka:upgrade --version MAJOR_VERSION_NUMBER
このアップグレードコマンドによって、サポート対象の最新の安定したマイナーバージョンにバージョンアップされることに注意してください。たとえば、現時点では、heroku kafka:upgrade --version 2.8
はクラスターをバージョン 2.8.2 にアップグレードします。
このコマンドは、クラスター内の Kafka ブローカーを新しいバージョンにアップグレードします。クラスターのアップグレードには、ブローカーのプロセス再起動が数回行われますが、これらの再起動は一度に 1 回ずつ行われます。アプリケーションがブローカーの再起動を処理できるとすれば、アップグレードは比較的シームレスに行われます。
ブローカーの再起動を適切に処理できるように、Kafka の堅牢な使用に関する記事を一読することをお勧めします。アップグレード期間中、クラスターではさまざまなバージョンが実行されます。たとえば、0.10.2.1 で 1 つのブローカーが、1.0.2 で 2 つのブローカーがあるとします。
Kafka は、プロトコルの後方互換性を完全に約束しています。つまり、常に、クラスターが実行しているバージョンよりも古いクライアントプロトコルバージョンを使用できます。ただし、クラスターが実行しているものよりも新しいクライアントバージョンは使用できません。
アップグレード中、アップグレード前のバージョン以下のバージョンにクライアントを保持しておく必要があります。アップグレードが終わったら (heroku kafka:wait
にステータスで表示)、新しいプロトコルバージョンとそれがサポートする新しい機能の使用を開始できます。クラスターが実行しているものと同じプロトコルバージョンでクライアントを保持しておく必要はありません (ただし推奨)。
Heroku の最新の推奨バージョン (現時点では 2.8.2
) で、クラスターを最新の状態に保つことをお勧めします。Heroku では、すべての新しい Kafka リリースに対して、アップグレード手順のテストを含めた大量のテストおよび検証作業を実行し、信頼できるバージョンだけを注意深く推奨しています。
言語サポート
多数の言語にわたる数多くの Kafka のクライアントライブラリがあります。下記に一覧表示したものは、Heroku が改善を支援したライブラリか、SSL のサポートのような重要な機能を含む、Kafka 機能の最新のサポートを持っていると思われるライブラリです。
基本的なマルチテナント Kafka プランには、トピックおよびコンシューマーグループの接頭辞が必要です。「マルチテナントと専用との違い」を参照してください。Kafka コンシューマーを統合するときに、トピックおよびコンシューマーグループの前に KAFKA_PREFIX
環境変数の値が付けられていることを確認します。そうでない場合、メッセージは受信されず、Broker: Topic authorization failed
または Broker: Group authorization failed
のようなエラーが Kafka デバッグイベントに表示されることがあります。
Ruby アプリケーションでの Kafka の使用
Ruby から Kafka に接続するときには、rdkafka-ruby
を使用することをお勧めします。
この例には、Ruby でメッセージを書き込んで消費する方法が示されています。
rdkafka-ruby
を使用する場合は、"enable.ssl.certificate.verification" => false
をクライアント設定で指定して Heroku の Apache Kafka に接続する必要があります。
Java アプリケーションでの Kafka の使用
Java から Kafka に接続するときには、kafka-clients
を使用することをお勧めします。詳細については、『Kafka プロジェクトドキュメント』を参照してください。
この例には、Java でメッセージを書き込んで消費する方法が示されています。デモアプリのこのセクションでは、JVM アプリケーション用の TrustStore および KeyStore を扱う適切な例を示しています。
Java Kafka クライアントの最新のバージョンでは、Heroku 上の Apache Kafka に接続する ssl.endpoint.identification.algorithm=
(空の文字列) を指定する必要があります。
Go アプリケーションでの Kafka の使用
Go から Kafka に接続するときには、sarama
を使用することをお勧めします。
この例には、Go でメッセージを書き込んで消費する方法が示されています。
Go での tls
パッケージの厳密さのため、InsecureSkipVerify
を true
に設定する必要があります。
Python アプリケーションでの Kafka の使用
Python から Kafka に接続するときには、confluent-kafka-python
を使用することをお勧めします。このクライアントライブラリは、C/C++ Kafka ライブラリをラップします。
また、kafka-python
ライブラリは、特に理想より少ない C/C++ ライブラリをラップするシナリオに適しています。Heroku では、kafka-python
を使いやすくするための kafka-helper
ライブラリを作成しました。
Node.js アプリケーションでの Kafka の使用
Node.js アプリケーションから Kafka に接続するときには、kafkajs
を使用することをお勧めします。
PHP アプリケーションでの Kafka の使用
PHP 用の rdkafka
拡張を Heroku で使用できます。librdkafka
ライブラリのバインドを提供し、SSL をサポートします。
他の言語またはフレームワークでの Kafka の使用
Confluent Client wiki は、他の言語およびフレームワークのクライアントおよびコード例の適切なソースです。
Kafka クラスターへの接続
Kafka へのすべての接続は、SSL 暗号化および認証をサポートします。クラスターが Private Space でプロビジョニングされている場合、プレーンテキストを介して接続するオプションがあります。Shield Space では、プレーンテキスト接続は許可されません。
SSL による接続は、SSL クライアント証明書を介してすべてのトラフィックが暗号化され認証されていることを意味します。
SSL で接続するには、次の環境変数を使用します。
すべての Heroku アドオンと同様に、重要な環境および設定変数は変更できます。特にこれらのリソースが Heroku 外からアクセスしている場合、これらの値の更新を処理するようにアプリケーションを設計することが重要です。
KAFKA_URL
: クラスターを構成する Kafka ブローカーへの SSL URL のカンマ区切りのリスト。KAFKA_TRUSTED_CERT
: 正しいサーバに接続していることを確認するためのブローカーの SSL 証明書 (PEM 形式)。KAFKA_CLIENT_CERT
: ブローカーに対してクライアントを認証するための必須クライアント証明書 (PEM 形式)。KAFKA_CLIENT_CERT_KEY
: ブローカーに対してクライアントを認証するための必須クライアント証明書キー (PEM 形式)。
Kafka クラスターは、提供されたクライアント証明書を使用した認証を必要とします。 クライアント証明書を使用しないリクエストはすべて、拒否されます。
KAFKA_PREFIX
が提供されるのは basic
プランのみです。basic
プラン以外の環境変数を追加しないでください。basic
プランをご利用の場合は、「マルチテナント Apache Kafka on Heroku 」を参照してください。
資格情報のローテーション
セキュリティ対策上、重要なサービスの資格情報は定期的にローテーションすることをお勧めします。Apache Kafka on Heroku でこれを行うには heroku kafka:credentials --reset
を使用します。
$ heroku kafka:credentials HEROKU_KAFKA_GRAY_URL --reset
このコマンドを発行すると、次のステップが実行されます。
- クラスターの新しい資格情報が生成されます。
- 既存のトピックとコンシューマーグループは、新しい ACL を受け取って、新しいクライアント証明書の資格情報を可能にします。
- 新しい資格情報の準備ができたら、Heroku アプリケーションで関連する環境設定を更新します。
- 5 分間にわたって、古いクライアント証明書と新しいクライアント証明書の両方が有効なままです。これにより、新しいクライアント証明書がアプリに組み入れられる時間が得られます。
- 5 分後、古いクライアント証明書資格情報は期限切れになり、有効でなくなります。
外部リソースから Private または Shield の Kafka クラスターに接続する
「外部リソースから Private または Shield の Kafka クラスターに接続する」の記事を参照してください。
ログを介したモニタリング
standard
プランや extended
プランなどの専用クラスタープランの場合、Kafka アクティビティは Heroku アプリのログストリーム内で確認できます。basic
プランのログ記録オプションは、今後配信される予定です。
Kafka ログ
Kafka サービス自体のログを表示するには、プロセスタイプ -p
のフラグとアドオン名を使用します。このコマンドは、特定の Apache Kafka on Heroku アドオンからのログのみを表示することを示します。--tail
オプションを使用して、リアルタイムのログエントリにアクセスします。
$ heroku logs -p kafka-globular-94829 -tail
Heroku では、Kafka クラスターからの WARN
、ERROR
、または FATAL
レベルのログ行をアプリのログストリームに配信します。これらのログ行は次のようになります。
2022-06-07T22:46:31+00:00 kafka[kafka-globular-94829.0]: pri=WARN t=ReplicaFetcherThread-0-2 at=ReplicaFetcherThread [ReplicaFetcher replicaId=1, leaderId=2, fetcherId=0] Partition my-cool-topic-16 marked as failed
Kafka メトリクス
Kafka メトリクスは、[heroku-kafka] プレフィックスが付いたログストリームに書き込まれます。クラスター内の特定のブローカーに対して発行されたメトリックは [heroku-kafka.N] として記述されます。N はログ行を担当するノードのブローカー ID です。
$ heroku logs --tail --ps heroku-kafka
2024-04-15T14:53:16.000000+00:00 app[heroku-kafka.2]: source=KAFKA addon=kafka-flat-32368 sample#load-avg-1m=0.005 sample#load-avg-5m=0.005 sample#load-avg-15m=0 sample#read-iops=0 sample#write-iops=0.18462 sample#memory-total=16098868kB sample#memory-free=5667652kB sample#memory-cached=5290740kB sample#bytes-in-per-second=0.0 sample#bytes-out-per-second=0.0
これらのメトリクスは、クラスター内の個々のノードに適用されます。
sample#bytes-in-per-second
: クラスターにより取り込まれる秒あたりのバイト数。これは複製を考慮に入れます。したがって、プロデューサーが送信するよりも多くの秒あたりのバイト数がここに表示されます。sample#bytes-out-per-second
: クラスターにより出力される秒あたりのバイト数。これは複製を考慮に入れます。したがって、コンシューマーが読み取るよりも多くの秒あたりのバイト数がここに表示されます。
サーバーメトリクス
これらのメトリクスはサーバーのオペレーティングシステムから直接得られます。
sample#load-avg-1m
、sample#load-avg-5m
、およびsample#load-avg-15m
: 1 分、5 分、および 15 分の期間での平均システム負荷を、使用可能な CPU の数で割ったもの。1.0 の負荷平均は、プロセスが平均で 100% のタイムスパンに CPU リソースを要求していたことを示します。この数値には I/O の待機が含まれます。sample#read-iops
およびsample#write-iops
: 16 KB ブロックの I/O サイズでの読み取りまたは書き込み操作の数。sample#memory-total
: 使用中のサーバーメモリの合計量 (KB 単位)。これには、すべての Kafka プロセス、OS メモリ、およびディスクキャッシュで使用されるメモリが含まれます。sample#memory-free
: 使用可能な空きメモリの量 (KB 単位)。sample#memory-cached
: ページキャッシュに OS で使用されているメモリの量 (KB 単位)。
リージョン
Kafka は、Heroku により現在サポートされているすべての地域で使用できます。
Heroku は、Kafka ブローカーをネットワーク可用性ゾーンにわたって配信します。そして、システムまたはハードウェアの障害に対する障害許容力を高めるために、Kafka のラック対応パーティション割り当てを利用します。一部の地域には、さまざまな数のネットワーク可用性ゾーンがありますが、目的のフォールトトレランスを達成するにはさらに慎重になる必要があります。
ノード障害の課題
分散データベースは、ノードに障害が生じても操作できるように設計されています。残念ながら、ノードの障害中、データベースは使用可能なままであっても、パフォーマンスや他の特性は低下することがあります。データが新しいノードに複製される間に負荷を受けるので、負荷の高いクラスターにノードを追加すると、同様の動作になる可能性があります。Apache Kafka on Heroku は、クラスタ内のノードの 1 つに障害を引き起こすために使用できる CLI ツールを用意しています。
これは実際に、クラスター内のノードの 1 つに障害を引き起こします。
$ heroku kafka:fail
heroku kafka:wait
と入力することによりリカバリの進捗状況を追跡できます。
障害時、自動化されたシステムは、通常の操作を回復するように機能します。障害の発生したノードで多大な負荷がかかった状態で、アプリケーションが正常に動作するか検証することをお勧めします。これはステージング環境で検証することをお勧めします。
catastrophic
フラグは、ノードを単に再起動するのではなく、実際にノードを破棄してクラスター内でそれを置き換えます。これにより、置換ノードがその状態を再同期している間、十分な追加の読み取りトラフィックが他のノードに配置されます。
$ heroku kafka:fail --catastrophic
アドオンの削除
Kafka は CLI を使用して削除できます。
これにより、すべての関連データが破棄され、元に戻すことはできません。
$ heroku addons:destroy heroku-kafka
-----> Removing heroku-kafka from kafka-demo... done, v20 (free)