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