このトピックでは、PolarDB for PostgreSQL(Oracle 互換) の論理レプリケーションスロットのフェールオーバー機能について説明します。プライマリノードに障害が発生した場合、この機能により、論理レプリケーションスロットがプライマリノードからスタンバイノードに同期されます。
前提条件
PolarDB for PostgreSQL(Oracle 互換) クラスタは、PolarDB for PostgreSQL(Oracle 互換) 1.0(リビジョンバージョン 1.1.27 以降)を実行しています。
SHOW polar_version 文を実行して、クラスタのリビジョンバージョンを表示します。必要に応じて、リビジョンバージョンをアップグレードします。
背景情報
PostgreSQL のストリーミングレプリケーションプロトコルによると、プライマリノードの論理レプリケーションスロットは、スタンバイノードとして機能する読み取り専用ノードに同期されません。フェールオーバーが発生した場合、論理レプリケーションスロットは失われ、その結果、論理サブスクリプションが中断されます。この問題を解決するために、PolarDB for PostgreSQL(Oracle 互換) は、論理レプリケーションスロットのフェールオーバーをサポートすることでシステムを強化しています。
物理レプリケーションスロットのフェールオーバーはサポートされていません。
詳細については、PostgreSQL の「論理デコードの概念」の「レプリケーションスロット」セクションをご参照ください。
論理レプリケーションスロットのフェールオーバー機能を有効または無効にする
polar_failover_slot_mode パラメーターを設定することで、論理レプリケーションスロットのフェールオーバー機能を有効または無効にすることができます。有効な値は次のとおりです。
sync:論理レプリケーションスロットのフェールオーバーを有効にし、同期モードに設定します。
説明同期モードでは、クラスタのフェールオーバー中に論理レプリケーションでデータが失われません。
これは、論理レプリケーションクライアントがスタンバイノードよりも早く変更を受け取らないようにすることで実現されます。ただし、長時間切断と再接続、またはスタンバイノードの再構築が発生した場合、タイムウィンドウが大きくなり、プライマリストレージ間の同期レイテンシが比較的高くなり、論理レプリケーションクライアントがスタンバイノードよりも早く変更を受け取る可能性があります。このタイムウィンドウ中にフェールオーバーが発生した場合、論理レプリケーションでデータが失われる可能性があります。さらに、新しいプライマリノードで生成されたデータも失われる可能性があります。
このようなデータ損失を回避するには、お問い合わせいただき、polar_priority_replication_force_wait パラメーターを on に設定してください。これにより、スタンバイノードが切断された場合、プライマリノードはスタンバイノードが再接続または再構築されるまで、論理レプリケーションクライアントに変更を送信しません。ただし、これは論理レプリケーションの可用性を低下させます。注意して進めてください。
async(デフォルト):論理レプリケーションスロットのフェールオーバーを有効にし、非同期モードに設定します。
説明非同期モードでは、HA クラスタのフェールオーバー中に論理レプリケーションでデータが失われません。ただし、重複データが論理レプリケーションクライアントに送信される場合があります。フェールオーバーの完了後、クライアントが新しいプライマリよりも新しいデータを持っている場合、クライアントはフェールオーバー中に失われたデータ(存在する場合)を保持している可能性があります。
不整合なデータがビジネスに影響を与える場合は、同期モードを使用することをお勧めします。
off:論理レプリケーションスロットのフェールオーバーを無効にします。