Heroku のストリーミングデータコネクター
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年12月08日(金)
この記事では、Heroku Postgres イベント用に Change Data Capture (CDC) を設定し、Private Space または Shield Private Space にプロビジョニングされた Apache Kafka on Heroku アドオンにそれらのイベントをストリーミングする方法について説明します。このプロセスは、大きく分けて 3 つの手順で構成されます。
- Private Space または Shield Private Space にアプリを作成する
- Private または Shield の Heroku Postgres アドオンと、Private または Shield の Apache Kafka on Heroku アドオンを新しいアプリにプロビジョニングする。
- ストリーミングデータコネクターを作成して Postgres から Kafka への CDC イベントを有効にする。
ストリーミングデータコネクターを最適に設定する方法についての詳細は、「Heroku のストリーミングデータコネクターのベストプラクティス」を参照してください。
Heroku アプリの設定
まず、Private Space または Shield Private Space を作成します。Space が利用可能になったら、その Space にアプリを作成できます。
$ heroku spaces:create --region virginia --team my-team-name --space myspace
$ heroku spaces:wait --space myspace
$ heroku apps:create --space myspace my-cdc-app
Heroku アドオンの設定
次に、2 つの Private または Shield のデータアドオンをアプリにアタッチする必要があります。
Postgres アドオンはバージョン 10 以上である必要があります。Kafka アドオンはバージョン 2.3 以上である必要があります。
$ heroku addons:create heroku-postgresql:private-7 --as DATABASE --app my-cdc-app
$ heroku addons:create heroku-kafka:private-extended-2 --as KAFKA --app my-cdc-app
アドオンのプロビジョニングの進行状況は、次のようにして監視できます。
$ heroku addons:wait --app my-cdc-app
アドオンが利用可能になったら、スキーマとデータを Postgres データベースにインポートします。
Heroku のストリーミングデータコネクターの設定
Private Space または Shield Private Space アプリで Heroku Postgres アドオンと Apache Kafka on Heroku アドオンを設定したら、コネクターをプロビジョニングできます。
最初に、CLI プラグインをインストールします。
$ heroku plugins:install data
コネクターを作成するには、いくつかの情報を収集する必要があります。
- Kafka アドオンの名前
- Postgres アドオンの名前
- そこで発生したイベントをキャプチャする Postgres テーブルの名前
- (オプション) キャプチャイベントから除外する列の名前
Postgres データベースでイベントをキャプチャするためには、いくつかの要件が満たされている必要があります。
- データベースのエンコードが UTF-8 であること
- その時点でテーブルが存在していること
- テーブルにプライマリキーがあること
- テーブルがパーティション分割されていないこと
- テーブル名に
[a-z,A-Z,0–9,\_]
以外の文字が含まれていないこと - Kafka Formation で直接の Zookeeper アクセスが無効になっていること
キャプチャするテーブルの選択には注意が必要です。1 つのコネクターでは、多くのテーブルからの大量のイベントを処理しきれない場合があります。
次に、コネクターを作成できます。Postgres アドオンと Kafka アドオンの名前に加えて、データベースキャプチャイベントに含める完全修飾テーブルのリストが必要です。
$ heroku data:connectors:create \
--source postgresql-neato-98765 \
--store kafka-lovely-12345 \
--table public.posts --table public.users
プロビジョニングの完了まで約 15 ~ 20 分かかることがあります。コネクターのプロビジョニングの進行状況は、次のようにして監視できます。
$ heroku data:connectors:wait gentle-connector-1234
ストリーミングデータコネクターでは、データの変更をキャプチャするために選択したテーブルごとに、Kafka クラスターにトピックが作成されます。コネクターが利用可能になったら、新しく作成された Kafka トピックなどの詳細を表示できます。
$ heroku data:connectors:info gentle-connector-1234
=== Data Connector status for gentle_connector_1234
Name: gentle_connector_1234
Status: available
=== Configuration
Table Name Topic Name
public.posts gentle_connector_1234.public.posts
public.users gentle_connector_1234.public.users
これらのトピックは次のパラメータで設定されます。
partition_count
: 32replication_factor
: 3cleanup_policy
: deleteretention_time_ms
: 1209600000
プリンシパル (Kafka ユーザー) は、ストリーミングデータコネクターによって作成されたテーブルトピックに対して、Read
および Describe
アクセス権を持ちます。Write
、Delete
、および Alter
操作は拒否されます。
この機能によって、各コネクターのハートビートトピックも作成されます。プリンシパルは、ハートビートトピックに対しても Read
および Describe
アクセス権を持ちます。
コネクターの管理
作成したコネクターを管理するために、いくつかの操作を実行できます。
一時停止または再開
新しいイベントの処理を一時停止できます。コネクターを一時停止すると、再開するまでの間、追加のレコードのポーリングが停止されます。2 つの状態は、次のようにして簡単に切り替えることができます。
# to pause
$ heroku data:connectors:pause gentle-connector-1234
# to resume
$ heroku data:connectors:resume gentle-connector-1234
通常の動作では、コネクターはコネクターが一時停止している間に発生した変更イベントを失うことはありません。コネクターは Postgres データベースのレプリケーションスロットを使用して進捗を追跡し、再開時にデータを失うことなく中止したところから取得します。
コネクターを「一時停止」状態にしたまま数時間放置しないでください。一時停止したコネクターによって WAL が削除されず、それによってプライマリデータベースにリスクが生じる可能性があります。コネクターを長期間一時停止したままにするよりは、破棄することをお勧めします。
コネクターが一時停止中に発生した変更イベントは、Kafka に送達されることが保証されません。フェイルオーバーが発生した場合 (システム障害または定期的なメンテナンスによる)、コネクターの一時停止後の変更イベントは失われます。
稼働中のデータベースでコネクターが非常に長期間一時停止する場合、レプリケーションスロットにより Postgres では未読のログ先行書き込み (WAL) が削除されません。その結果、WAL ドライブがいっぱいになり、データベースがシャットダウンする原因となります。自動化のおかげでこれらの状況は一般的に事前に検出されますが、最悪の場合、データベースを保護するためにレプリケーションスロットを削除する必要があります。そのようなまれな場合、変更イベントは Kafka に送達されません。
設定の更新
コネクターに関連付けられた特定のプロパティを CLI から変更できます。これらのプロパティには以下の値が含まれます。
プロパティ | 設定可能な値 | デフォルト値 | 詳細 |
---|---|---|---|
decimal.handling.mode |
precise 、double 、string |
precise |
ドキュメント |
hstore.handling.mode |
map 、json |
map |
ドキュメント |
time.precision.mode |
adaptive 、adaptive_time_microseconds 、connect |
adaptive |
ドキュメント |
interval.handling.mode |
numeric 、string |
numeric |
ドキュメント |
tombstones.on.delete |
true 、false |
true |
ドキュメント |
binary.handling.mode |
bytes 、base64 、hex |
bytes |
ドキュメント |
たとえば、tombstones.on.delete
を false
に更新できます。
$ heroku data:connectors:update gentle-connector-1234 \
--setting tombstones.on.delete=false
コネクターを操作するときは、推奨されるベストプラクティスについて理解しておくことをお勧めします。
Heroku によって管理される設定
ほとんどの設定プロパティは Heroku によって完全に管理され、必要に応じて変更されます。
プロパティ | 管理される値 | 詳細 |
---|---|---|
heartbeat.interval.ms |
60 秒 | ドキュメント |
テーブルおよび除外される列を更新する
除外される列のほかに、コネクターの Postgres テーブルも変更できます。
たとえば、public.parcels
テーブルを追加し、public.posts
テーブルを削除できます。
$ heroku data:connectors:update gentle-connector-1234 \
--add-table public.parcels \
--remove-table public.posts
新しいテーブルは、設定に概略を示すものと同じ要件に従う必要があります。
同様に、除外される列を追加および削除できます。
$ heroku data:connectors:update gentle-connector-1234 \
--exclude-column public.parcels.address \
--remove-excluded-column public.posts.keys
コネクターの破棄
コネクターの破棄を CLI から実行できます。
このコマンドによって、イベントの生成に使用される Kafka トピックは破棄されません。トピックのライフサイクルは別途管理する必要があります。
$ heroku data:connectors:destroy gentle-connector-1234