3.2.4.2. ストリーミングの変更
通常、PostgreSQL コネクターは、接続している PostgreSQL サーバーからの変更の大部分の時間ストリーミングを行います。このメカニズム は、特定の場所( Log Sequence Numbers
または短い LSN)でサーバーのトランザクションログにコミットされる際にクライアントがサーバーからの変更を受け取ることができる PostgreSQL のレプリケーションプロトコルに依存します。
サーバーがトランザクションをコミットすると、別のサーバープロセスが 論理デコードプラグインからコールバック関数を呼び出します。この関数はトランザクションの変更を処理し、それらを特定の形式(Debezium プラグインの場合はProtobuf または JSON)に変換して出力ストリームに書き込み、クライアントが消費できる出力ストリームに書き込みます。
PostgreSQL コネクターは PostgreSQL クライアントとして動作し、これらの変更を受け取ると、イベントが Debezium がイベントの LSN 位置を含むイベントの 作成、更新、または 削除 に変換されます。PostgreSQL コネクターは、これらの変更イベントを Kafka Connect フレームワークに転送し(同じプロセスで実行)、適切な Kafka トピックに非同期的に書き込みます。Kafka Connect は、Debezium に各イベントと共に含まれるソース固有の位置情報の オフセット を使用します。Kafka Connect では、別の Kafka トピックに最新のオフセットが定期的に記録されます。
Kafka Connect が正常にシャットダウンすると、コネクターを停止し、すべてのイベントを Kafka にフラッシュし、各コネクターから受信した最後のオフセットを記録します。再起動すると、Kafka Connect は各コネクターの最後に記録されたオフセットを読み取り、そのコネクターからコネクターを起動します。PostgreSQL コネクターは、各変更イベントに記録された LSN をオフセットとして使用し、再起動時に PostgreSQL サーバーがその位置の直後にイベントを送信するようにします。
PostgreSQL コネクターは、論理デコーダープラグインによって送信されるイベントの一部としてスキーマ情報を取得します。この情報は JDBC メタデータ(サイドチャネル)から取得されるため、唯一の例外は、プライマリーキーを構成する列に関する情報です。(PK コラムの追加、削除、名前変更による)テーブルのプライマリーキー定義が変更された場合、JDBC のプライマリーキー情報が論理デコードイベントの変更データと同期されず、一貫性のないキー構造で少数のメッセージが作成されます。この場合は、コネクターを再起動し、メッセージの再処理により問題が解決されます。この問題を回避するには、主に以下の操作シーケンスを使用して、プライマリーキー構造への更新を Debezium と同期することが推奨されます。
- データベースまたはアプリケーションを読み取り専用モードに切り替えます。
- 残りのすべてのイベントを Debezium が処理できるようにします。
- Debezium の停止
- プライマリーキー定義の更新
- データベースまたはアプリケーションを読み取り/書き込み状態にし、Debezium を再び起動します。