第2章 PostgreSQL の Debezium コネクター
Debezium の PostgreSQL コネクターは、PostgreSQL データベースのスキーマで行レベルの変更を監視および記録できます。
PostgreSQL サーバー/クラスターに初めて接続すると、すべてのスキーマの整合性スナップショットが読み込まれます。スナップショットが完了すると、コネクターは PostgreSQL 9.6 以降にコミットされた変更を継続的にストリーミングし、対応する insert、update、および delete イベントを生成します。各テーブルのすべてのイベントは、アプリケーションやサービスで簡単に使用できる個別の Kafka トピックに記録されます。
2.1. 概要
PostgreSQL の 論理デコード 機能はバージョン 9.4 で最初に導入されました。は、トランザクションログにコミットされた変更の抽出と、出力プラグイン を使用してユーザーフレンドリーな方法でこれらの変更の処理を可能にするメカニズムです。クライアントが変更を使用できるようにするには、PostgreSQL サーバーを実行する前にこの出力プラグインをインストールし、レプリケーションスロットと共に有効にする必要があります。
PostgreSQL コネクターには、サーバーの変更の読み取りおよび処理を可能にするために連携する 2 つの異なる部分が含まれています。
- PostgreSQL サーバーにインストールおよび設定する必要がある論理デコード出力プラグイン。
- PostgreSQL JDBC ドライバーを介して PostgreSQL の ストリーミングレプリケーションプロトコル を使用して、プラグインによって生成された変更を読み取る Java コード(実際の Kafka Connect コネクター)
その後、コネクターは受信したすべての行レベルの insert、update、および delete 操作の 変更イベント を生成し、個別の Kafka トピックの各テーブルの変更イベントをすべて記録します。クライアントアプリケーションは、対象のデータベーステーブルに対応する Kafka トピックを読み取り、これらのトピックに表示されるすべての行レベルのイベントに対応します。
通常、PostgreSQL は一定期間後に WAL セグメントをパージします。つまり、コネクターにはデータベースに加えられたすべての変更の完全な履歴はありません。そのため、PostgreSQL コネクターが最初に特定の PostgreSQL データベースに接続すると、データベーススキーマごとに 整合性スナップショット を実行して起動します。コネクターは、スナップショットの完成後に、スナップショットが作成された正確な時点から変更のストリーミングを続行します。これにより、すべてのデータの一貫したビューから開始しますが、スナップショットの実行中に加えられた変更を失うことなく読み取りを続行します。
コネクターはフォールトトラレントでもあります。コネクターは変更を読み取り、イベントを生成すると、各イベントで write-ahead ログの位置を記録します。コネクターが何らかの理由で停止した場合(通信障害、ネットワークの問題、クラッシュなど)、再起動時に最後に停止した場所で WAL の読み取りを続行します。これにはスナップショットが含まれます。コネクターの停止時にスナップショットが完了しなかった場合、再起動時に新しいスナップショットが開始されます。
2.1.1. 論理デコード出力プラグイン
pgoutput
論理デコーダーは、Debezium の Tecnhology Preview リリースで唯一対応している論理デコーダーです。
PostgreSQL 10+ の標準的な論理デコードプラグインである pgoutput
は Postgres コミュニティーにより維持され、Postgres によって 論理レプリケーション にも使用されます。pgoutput
プラグインは常に存在します。つまり、追加のライブラリーがインストールされず、コネクターは raw レプリケーションイベントストリームを変更イベントに直接解釈します。
コネクターの機能は、PostgreSQL の論理デコード機能に依存します。コネクターによっても反映される以下の制限事項に注意してください。
- 論理デコードは DDL の変更をサポートしません。これは、コネクターが DDL の変更イベントをコンシューマーに報告できないことを意味します。
-
論理デコードレプリケーションスロットは
プライマリー
サーバーでのみサポートされます。つまり、PostgreSQL サーバーのクラスターがある場合、コネクターはアクティブなプライマリー
サーバー上でのみ実行できます。hot
またはwarm
スタンバイのレプリカでは実行できません。プライマリー
サーバーが失敗するか降格されると、コネクターは停止します。プライマリー
が回復した後、コネクターを再起動することができます。別の PostgreSQL サーバーがプライマリー
に昇格された場合は、コネクターを再起動する前にコネクター設定を調整する必要があります。問題が 発生したときのコネクターの動作について、詳しく確認し てください。
Debezium は現在、UTF-8 文字エンコーディングのデータベースのみをサポートします。1 バイト文字エンコーディングでは、拡張 ASCII コード文字を含む文字列を正しく処理できません。