CDC Failover support#
!!!警告 可用性 これは、PGD 5.7以降の機能です。 PGDの以前のバージョンではサポートされていません。
背景#
PGDの以前のバージョンでは、データベース内のデータに発生した論理変更のフィードを提供できるノードに論理レプリケーションスロットを作成できました。これらの論理レプリケーションスロットはノードに対してローカルであり、レプリケートされていません。特定のノードで変更をレプリケートするだけでなく、クラスター内のノードフェールオーバーが発生した場合に課題が発生しました。そのシナリオでは、障害が発生したノードの論理レプリケーションのコンシューマには、別のノードに消費を継続するスロットのレプリカがありません。
この問題へのソリューションは、サブスクライバ専用ノードを中間として使用して設計できますが、論理レプリケーションのコストが大幅に増加します。
CDCフェイルオーバーのサポート#
このニーズに対応するために、PGD 5.7ではCDCフェールオーバーのサポートを導入しています。これは、クラスター全体で自動論理スロットレプリケーションをアクティブにするオプションで有効な機能です。これにより、論理スロットのレプリケーションのコンシューマは、障害が発生したときに任意のノードから変更データを受信できます。
CDCフェールオーバーの仕組み#
CDCフェールオーバーサポートが有効になっているノードで論理スロットが作成されると、スロットはクラスター全体でレプリケートされます。これは、クラスター内の任意のノードでスロットを使用できることを意味します。ノードに障害が発生すると、クラスター内の別のノードからスロットが消費される可能性があります。これにより、論理レプリケーションストリームを中断せずに継続できます。
ただし、スロットのコンシューマがクラスター内の別のノードに接続する場合、コンシューマが以前に持っていた接続はPGDによって閉じられます。これは、スロットがマルチプルのノードから同時に消費されないようにするためです。バックグラウンドで、PGDはRaftコンセンサスプロトコルを使用して、スロットが一度に1つのノードからのみ使用されるようにします。これは、スプリットブレインシナリオでは、一度に1つのスロットのみが消費されるという保証が当てはまらないことを意味します。
現在、CDCフェールオーバーのサポートは、トップグループオプションによって制御されるグローバルオプションです。
failover_slot_scope
トップグループオプションは、現在、論理スロットのレプリケーションを無効にするローカルに設定またはデフォルトで設定できます。または、PGDデータベースで作成されるすべての非一時論理スロットのレプリケーションを有効にするglobal
。
一時論理スロットは、有効期間がそれらを作成したセッションにスコープされ、そのセッションが終了すると消えるため、レプリケートされません。
少なくとも1回の配信保証#
CDCフェールオーバーサポートは、コンシューマーがすべての変更を少なくとも1回受信できるようにするための手順を実行します。これは、配信が確認されるまでスロットを抑制することにより行われ、その時点でスロットは非同期方法ですべてのノードで進められます。スロットが消費されていたノードに障害が発生した場合、スロットはコンシューマがクラスター内のノードに接続するまで保持されます。これにより、スロットが進行できます。
1回限りの配信#
現在、正確に1回だけの配信を保証する方法はなく、使用するアプリケーションが、以前に完了したトランザクションの破棄を管理することを期待しています。
CDCフェールオーバーサポートの有効化#
CDCフェールオーバーのサポートを有効にするには、 SQLコマンドを実行し、次のパラメーターを使用して bdr.alter_node_group_option ファンクションを呼び出します。
select bdr.alter_node_group_option(<top-level group name>,
failover_slot_scope,
global);
<top-level group name>
をクラスターのトップレベルグループの名前に置き換えます。
名前がわからない場合は、 `` bdr.node_group `` で0に等しいnode_group_parent_idを持つグループです。次のものも使用できます。
SELECT bdr.alter_node_group_option(
node_group_name,
failover_slot_scope,
global)
from bdr.node_group
where node_group_parent_id=0;
正しいトップレベルグループのオプションを設定していることを確認するため。
有効にすると、次のものが使用できます。
SELECT pg_create_logical_replication_slot(myslot,
test_decoding);
新しいグローバルにレプリケートされたスロットを作成するには。
オプションがglobal
に設定される前に作成された論理レプリケーションスロットはレプリケートされないことに注意してください。新しいスロットのみが複製されます。
フェールオーバースロットは、レプリケーション接続でCREATE_REPLICATION_SLOT
コマンドを使用して作成することもできます。
フェイルオーバースロットのステータスは、 bdr.failover_replication_slots テーブルで追跡されます。
Postgres 17+でのCDCフェールオーバーのサポート#
Postgres
17以降では、フェイルオーバーのサポートが追加され、failover
という名前のpg_create_logical_replication_slot
のオプションを介してスタンバイを再開できるようになりました。この新しい設定では、
failover_slot_scope の設定に関係なく、 failover をtrue
に設定する必要があります。
SELECT pg_create_logical_replication_slot(myslot,
test_decoding,
failover=>true);
制限事項#
CDCフェールオーバースロットのサポートには、特定の制限があります。
CDCフェールオーバースロットのサポートには、PGDの最新バージョン5.7+とPostgres-ExtendedまたはEPASの最新のマイナーリリース2025年2月利用可能:raw-latex:が必要です。
CDCフェールオーバーのサポートはグローバルオプションであり、スロットごとに設定することはできません。ただし、 CDCフェールオーバーの有効なステータスの変更は、以前にプロビジョニングされたスロットには影響しないため、それを有効にして
globalに設定し、レプリケートスロットを作成してから無効にしてlocalに設定して、単一のレプリケートスロットを作成することは可能です。CDCフェールオーバーのサポートは、一時的なスロットではサポートされていません。
CDCフェールオーバーのサポートは、
failoverオプションをfalseに設定して作成されたスロットではサポートされていません。CDCフェールオーバーのサポートは、EDB Postgres Advanced ServerおよびEDB Postgres Extended Serverでのみ動作します。コミュニティPostgresインストールではサポートされていません。
オプションが有効になっている場合、既存のスロットはフェールオーバースロットに自動的に変換されません。
pg_logical_slot_get_changes()などのPostgresのビルトイン機能は使用できますが、スロットが他の場所でデコードされていないことは保証されず、クラスター全体でレプリケーションの進行状況を正確に更新できません。したがって、デコードされた変更を受信するファンクションに依存しないことをお勧めします。