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