Apache Kafka on Heroku アドオンの移行
最終更新日 2022年12月13日(火)
Table of Contents
Apache Kafka on Heroku のプランレベル間のスケールアップまたはスケールダウンは通常、シームレスであり、その場で実行されます。ただし、実際のデータ移行が必要になる状況がいくつか存在します。このドキュメントでは、これらの条件と適用可能なプロセスの概要を示します。
Kafka アドオン間の移行が必要になる場合
Kafka アドオン間の移行が必要になるケースには、次の 3 つがあります。
- マルチテナント Kafka (Kafka Basic)) アドオンを使用しており、専用 Kafka アドオンの使用を開始したい。
- 専用 Kafka アドオンを使用しており、マルチテナント Kafka (Kafka Basic)) アドオンの使用を開始したい。
- ベータ版のマルチテナント Kafka (Kafka Basic)) アドオンを使用しており、そのアドオンをホストするクラスターがサポートの終了に近づいている。
移行を処理する方法
多くのシナリオでは、アプリケーションがメンテナンスウィンドウに入り、アプリケーションのコードを変更することなく新しいアドオンに移行できます。一般には、移行の複雑さが大幅に削減され、アプリの大きな変更が必要ないため、可能であればメンテナンスウィンドウに入ることをお勧めします。
アプリケーションがメンテナンスウィンドウに入ることができない場合は、トピックの両方のセットに二重に書き込み、新しいアドオンが保持期間より長い期間にわたって書き込みを受信した後に古いアドオンから新しいアドオンにカットオーバーすることによって新しいアドオンに移行する必要があります。
メンテナンスウィンドウの間にアドオン間で移行する方法
メンテナンスウィンドウの間に移行するための高レベルの手順は次のとおりです。
- 関連するすべてのトピックとコンシューマーグループを使用して新しいアドオンをプロビジョニングします。
- メンテナンスウィンドウに入ります。
- Kafka プロデューサーを停止します。
- Kafka コンシューマーが完全に追いつくまで待ちます。
- 新しいアドオンに切り替えます。
- Kafka プロデューサーおよびコンシューマーを起動します。
- メンテナンスウィンドウを終了します。
$ heroku addons:create heroku-kafka:basic-0 --as NEW_KAFKA -a mackerel
$ heroku kafka:topics:create my-topic-name NEW_KAFKA -a mackerel
$ heroku kafka:consumer-groups:create my-group-name KAFKA -a mackerel
$ heroku ps:scale producer=0 -a mackerel
# check consumers
heroku ps:scale consumer=0 -a mackerel
heroku maintenance:on -a mackerel
# kafka-parallel-2019
heroku addons:attach kafka-symmetrical-26061 --as OLD_KAFKA -a mackerel
$ heroku addons:attach kafka-parallel-2019 --as KAFKA -a mackerel
$ heroku ps:scale producer=1 consumer=1 -a mackerel
$ heroku addons:destroy kafka-symmetrical-26061 -a mackerel
メンテナンスウィンドウに入ることなくアドオン間で移行する方法
メンテナンスウィンドウに入ることなく移行するための高レベルの手順は次のとおりです。
- アプリでの二重書き込みを準備します。
- 関連するすべてのトピックとコンシューマーグループを使用して新しい Kafka アドオンをプロビジョニングします。
- 古いアドオンと新しいアドオンの両方に二重に書き込みます。
- 新しいアドオンに古いアドオンと同じ履歴データが含まれるまで待ちます。
- 古いアドオンへの生成を停止します。
- 古いアドオンを破棄します。
これらの手順についてはこのセクションでさらに詳細に説明します。
手順 1: アプリでの二重書き込みを準備する
アプリで、Kafka 環境設定の 2 つのセット (アドオンごとに 1 つ) がサポートされている必要があります。
この例では、二重書き込みが開始される前に KAFKA_URL
、KAFKA_CLIENT_CERT
、KAFKA_CLIENT_CERT_KEY
、KAFKA_TRUSTED_CERT
を古い Kafka アドオンに使用し、二重書き込みが開始された後にそれらを新しい Kafka アドオンに使用します。
この例では、二重書き込みが開始された後に OLD_KAFKA_URL
、OLD_KAFKA_CLIENT_CERT
、OLD_KAFKA_CLIENT_CERT_KEY
、OLD_KAFKA_TRUSTED_CERT
を古い Kafka アドオンに使用します。この環境設定のセットは、二重書き込みが実行されている間だけ存在します。
次の 2 つの追加の環境設定が必要です。これは、プロデューサーとコンシューマーに書き込みと読み取りの場所を指示します。
PRODUCER_ADDON_NAMES
は、どのアドオンに書き込むかを検出するためにプロデューサーによって使用されます。CONSUMER_ADDON_NAME
は、どのアドオンから読み取るかを検出するためにコンシューマーによって使用されます。
アプリに次のサポートを追加する必要があります。
PRODUCER_ADDON_NAMES
で指定されているすべてのアドオンへの生成CONSUMER_ADDON_NAME
で指定されているアドオンからの消費
コンシューマーは、重複したメッセージをべき等的に処理する必要があります。 詳細は、Apache Kafka Heroku の堅牢な使用法に関する記事を参照してください。
手順 2: 新しいアドオンをプロビジョニングする
新しいアドオンをプロビジョニングする前に、準備として既存の Kafka アドオンを新しい名前でアタッチします。
$ heroku addons:attach kafka-symmetrical-26061 --as OLD_KAFKA -a mackerel
$ heroku addons:create heroku-kafka:basic-0 --as KAFKA -a mackerel
手順 3: 新しいアドオンでトピックとコンシューマーグループを作成する
古いアドオンからトピックとコンシューマーグループの一覧を取得します。
$ heroku kafka:topics OLD_KAFKA -a mackerel
$ heroku kafka:consumer-groups OLD_KAFKA -a mackerel
これで、新しいアドオンでこれらのトピックとコンシューマーグループを作成できます。
$ heroku kafka:topics:create my-topic-name KAFKA -a mackerel
$ heroku kafka:consumer-groups:create my-group-name KAFKA -a mackerel
手順 4: 古いアドオンと新しいアドオンに二重に書き込む
新しいアドオンのトピックがデータでいっぱいになるまでの間、アプリはトピックの両方のセットに生成し、古いアドオンのトピックから消費する必要があります。
$ heroku config:set PRODUCER_ADDON_NAMES=OLD_KAFKA,KAFKA -a mackerel
$ heroku config:set CONSUMER_ADDON_NAME=OLD_KAFKA -a mackerel
手順 5: 新しいアドオンに十分な履歴データが含まれるまで待つ
新しいアドオンが保持期間より長い期間にわたって書き込みを受信すると、両方のアドオンが同じデータを表すようになります。 これは、コンシューマーを古いアドオンから新しいアドオンに切り替えることができることを示します。
$ heroku config:set CONSUMER_ADDON_NAME=KAFKA -a mackerel
手順 6: 古いアドオンへの生成を停止する
新しいアドオンからの消費が適切に行われるようになったら、古いアドオンへの生成を停止できます。
$ heroku config:set PRODUCER_ADDON_NAMES=KAFKA -a mackerel
手順 7: 古いアドオンを破棄する
アプリが古いアドオンから消費しなくなっているため、このアドオンを安全に破棄できます。
$ heroku addons:destroy OLD_KAFKA_URL -a mackerel