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