2.2.4. PostgreSQL コネクターの仕組み
2.2.4.1. スナップショット
ほとんどの PostgreSQL サーバーは WAL セグメントにデータベースの完全な履歴を保持しないよう設定されているため、PostgreSQL コネクターは WAL を読み取るだけでデータベースの履歴全体を確認できません。そのため、デフォルトではコネクターは初回起動時にデータベースの最初の 整合性スナップショット を実行します。各スナップショットは以下の手順で設定されます(組み込みスナップショットモードを使用する場合、カスタム スナップショットモードはこれを上書きする可能性があります)。
-
SERIALIZABLE、READ ONLY、DEFERRABLE 分離レベルでトランザクションを開始し、 このトランザクション内の後続のすべての読み取りがデータの単一バージョンに対して実行されるようにします。他のクライアントによる後続の
INSERT
、UPDATE
、DELETE
操作によるデータへの変更は、このトランザクションでは認識されません。 -
スナップショットの実行中に、監視されるテーブルごとに
ACCESS SHARE MODE
ロックを取得し、テーブルの構造が変更されないようにします。これらのロックは、操作中にテーブルのINSERTS
、UPDATES
、DELETES
が実行されないようにしないことに注意してください。この手順は、エクスポートしたスナップショットモードを使用してロックのないスナップショット を許可する場合、省略 されます。 - サーバーのトランザクションログの現在の位置を読み取ります。
-
すべてのデータベーステーブルとスキーマをスキャンし、各行の
READ
イベントを生成し、そのイベントを適切なテーブル固有の Kafka トピックに書き込みます。 - トランザクションをコミットします。
- コネクターオフセットにスナップショットの正常な完了を記録します。
コネクターに障害が発生した場合、コネクターのリバランスが発生した場合、または 1 の開始後、ステップ 6 の完了前に停止した場合、コネクターは再起動後に新しいスナップショットを開始します。コネクターが最初のスナップショットを完了すると、PostgreSQL コネクターはステップ 3 の実行時に読み取られた位置からのストリーミングを続行し、更新を見逃さないようにします。何らかの理由でコネクターが再び停止した場合、再起動時に、最後に停止した場所から変更のストリーミングを続行します。
2 つ目のスナップショットモードでは、コネクターは 常 にスナップショットを実行できます。この動作は、起動時に 常 にスナップショットを実行するようコネクターに指示します。スナップショットの完了後に、上記の手順 3 からの変更のストリーミングを続行します。このモードは、WAL セグメントが削除され、使用できなくなったことが確認された場合や、新しいプライマリーがプロモートされた後にクラスターに障害が発生した場合に、コネクターが新しいプライマリーがプロモートされた後に行われた可能性のある変更に見逃さないようにする場合に使用できます。
3 つ目のスナップショットモードは、スナップショットを実行し ないようにコネクター に指示します。この方法で新しいコネクターを設定すると、が以前の保存済みオフセットから変更のストリーミングを続行するか、PostgreSQL の論理レプリケーションスロットがサーバー上で最初に作成された時点から開始します。このモードは、対象のすべてのデータがまだ WAL に反映されている場合にのみ便利です。
4 番目のスナップショットモードは、初期のみ で、データベーススナップショットを実行し、その他の変更をストリーミングする前に停止します。コネクターが起動していても、停止前にスナップショットを完了しなかった場合、コネクターはスナップショットプロセスを再起動し、スナップショットが完了すると停止します。
エクスポートさ れた 5 番目のスナップショットモードは、レプリケーションスロットが作成された時点に基づいてデータベーススナップショットを実行します。このモードは、ロックのない方法でスナップショットを実行するのに最適です。