Configuring PG Failover Slots

プライマリ インスタンスと、高可用性 (フェールオーバーまたはスイッチオーバー) の目的で使用されるスタンバイの両方で、shared_preload_libraries に拡張機能を追加する必要があります。

postgresql.conf で次の構成オプションを使用して、PG フェールオーバー スロットの動作を構成できます。構成オプションには、pg_failover_slots.synchronize_slot_names のように接頭辞 pg_failover_slots. が付きます。

synchronize_slot_names

このフィジカル スタンバイと同期するように論理スロットを設定できるオプション。

スロット フィルターを使用して、同期するスロットを選択します。これらのスロット フィルターは、具体的に名前が付けられたスロット、 SQL LIKE 式に一致する名前を持つスロット、またはスロットが使用しているプラグインの名前と一致させることができます。スロット フィルターを key:value ペアとして定義します。キーは次のいずれかになります。

  • name —正確なスロット名 (name:my_slot など) に一致します。

  • name_like — name_like:change_% など、 SQL LIKE 式に一致する任意のスロット名に一致します。

  • plugin — plugin:test_decoding などの名前付きプラグインを使用して任意のスロットに一致します。

キーを指定しない場合、システムはデフォルトで name として解釈します。したがって、my_slot は name:my_slot と同等です。

コンマ区切りの文字列値でスロット フィルターを組み合わせることができます。 my_slot,name_like:change_%,plugin:test_decoding を設定すると、my_slot という名前のスロット、名前が change_ で始まるすべてのスロット、および test_decoding プラグインを使用したすべてのスロットが同期されます。

pg_failover_slots.synchronize_slot_names が空の文字列に設定されている場合、スロットは同期されません。

pg_failover_slots.synchronize_slot_names のデフォルト値は name_like:% で、すべての論理レプリケーション スロットに一致し、すべてのスロットを同期します。

drop_extra_slots

pg_failover_slots.synchronize_slot_names フィルターを使用して、プライマリで見つからないスタンバイの余分なスロットに何が起こるかを制御します。 true (デフォルト) に設定すると、それらは削除されます。それ以外の場合は保持されます。

プライマリ DSN

スロット情報をフェッチするときにプライマリに接続するために使用する接続文字列を指定します。

空の場合 (デフォルト)、primary_conninfo と同じ接続文字列を使用します。

!!!注: 接続文字列にパスワード フィールドがある場合、primary_conninfo は使用できません。パスワードは PostgreSQL によって難読化され、PG フェールオーバー スロットは実際にはパスワードを見ることができません。この場合、pg_failover_slots.primary_dsn を構成する必要があります。

スタンバイスロット名

フェイルオーバー候補のストリーミング物理レプリカが、サブスクライバーに表示される前にすべての変更を受信してフラッシュしたことを確認します。このオプションは、論理スロットのコンシューマーのスタンバイへのフェイルオーバー時にコミットが消失しないことを保証します。

コンマ区切りの pg_failover_slots.standby_slot_names リストに名前が含まれているレプリケーション スロットは、プライマリの walsender によって特別に扱われます。

論理レプリケーション walsender は、walsender が論理レプリケーション スロットの変更を送信する前に、すべてのローカル変更が送信され、pg_failover_slots.standby_slot_names のレプリケーション スロットにフラッシュされることを保証します。事実上、スロットの名前付きリストと walsender からの論理的にデコードされたストリームのすべてのコンシューマとの間に同期レプリケーション バリアを提供します。

pg_failover_slots.standby_slot_names で任意のレプリケーション スロットを一覧表示できます。論理スロットと物理スロットの両方が機能しますが、通常は物理スロットに使用されます。

このセーフガードがないと、次の 2 つの異常が発生する可能性があります。コミットがサブスクライバーによって受信され、フェールオーバー候補がまだ受信されていないため、フェールオーバー時にプロバイダーから消失する可能性があります。

  • 1 つまたは複数のサブスクライバーの場合、サブスクライバーは変更を適用した可能性がありますが、新しいプロバイダーは、受信した変更と競合する新しいトランザクションを実行する可能性があります。これは、プロバイダーに関する限り発生したことがないためです。

  • 2 つ以上のサブスクライバーの場合、フェールオーバー時に、すべてのサブスクライバーが変更を適用するわけではありませんでした。コミットを受信しなかったサブスクライバーは現在コミットを取得する方法がないため、サブスクライバーは一貫性のない、和解できない状態になっています。

pg_failover_slots.standby_slot_names を設定すると、設計上、プロバイダーのフェイルオーバー候補のレプリカが追いついていない場合、サブスクライバーはプロバイダーに遅れをとります。したがって、監視は不可欠です。

スタンバイ_スロット_最小_確認済み

データが論理レプリケーション スロットを介して送信される前に確認する必要がある pg_failover_slots.standby_slot_names の数を制御します。 -1 (デフォルト) を設定すると、pg_failover_slots.standby_slot_names のすべてのエントリを待機するように指定されます。