Configuring routing#

地域分散PGDクラスターでは、ルーティングによって、どのノードが書き込みを受け入れるかが決まります。 PGD 6は、各Postgresインスタンス内で実行されるConnection Managerを使用して、これを処理します。書き込む必要があるアプリケーションは、接続マネージャーの読み取り/書き込みポートに接続する必要があります。これは、接続をノードグループの現在の書き込みリーダーにルーティングします。

場所全体で書き込みリーダーシップがどのように構造化されるかは、ローカルルーティングを構成するかグローバルルーティングを構成するかによって異なります。

  • ローカルルーティング 各場所に独自の書き込みリーダーを与えます。アプリケーションが場所Aのノードに接続すると、接続マネージャーはそれを場所Aの書き込みリーダーにルーティングし、書き込み遅延を低く保ちます。すべての場所が同時に書き込みを受け入れます。これは、クロスロケーションの競合が可能であることを意味します。

  • グローバルルーティング クラスター全体の単一の書き込みリーダーを指定します。ノードの接続マネージャーは、アプリケーションがどの場所にあるかに関係なく、そのクラスター全体のリーダーに書き込み接続をルーティングします。これにより、クロスロケーションの競合が排除されますが、リモート場所からの書き込みがクロスロケーションの遅延が発生することを意味します。

2つのノードグループ Postgres設定 制御書き込みリーダー選択

  • enable_raft —グループがRaftコンセンサスに参加するかどうか

  • enable_routing —グループが独自の書き込みリーダーを選択するかどうか

PGDでは、クラスターには、すべての場所のすべてのノードにまたがる単一のトップレベルグループと、ロケーションごとにサブグループがあります。 enable_routing 設定は、ルーティングがローカルかグローバルかを決定します。

Top-level group enable_routing

Subgroup enable_routing

Local routing (default)

off

on

Global routing

on

off

enable_raft は、トップレベルグループとサブグループの両方で常にon であり、構成間で変更する必要はありません。

ローカルルーティングはデフォルトであり、明示的な構成は必要ありません。グローバルルーティングの場合、トップレベルグループにenable_routing=on を設定し、各サブグループにenable_routing=off を設定します。

グローバルルーティングは、監視ロケーションを含む Three data groups, active-active-active パターン、 Multiple locations, data residency パターン、または Two data groups, active-active パターンでのみ使用できます。監視がないと、2つのデータグループ設定で1つの場所を失うと、Raftマジョリティがブレイクし、クラスター全体の書き込みリーダーを選択または維持することが不可能になります。

構成例#

ローカルルーティング#

各ロケーションサブグループは、独自の書き込みリーダーを選択します。トップレベルグループは、書き込みリーダー選挙に参加しません。

- - Top-level group does not elect a write leader
SELECT bdr.alter_node_group_option(top_group, enable_routing, false);

- - Each subgroup elects its own write leader
SELECT bdr.alter_node_group_option(location_a, enable_routing, true);
SELECT bdr.alter_node_group_option(location_b, enable_routing, true);

接続マネージャーは、書き込みをローカル書き込みリーダーにルーティングし、各場所の書き込み遅延を低く保ちます。

グローバルルーティング#

トップレベルグループは、クラスター全体の単一の書き込みリーダーを選択します。場所サブグループは、自分自身を選択しません。

- - Top-level group elects the cluster-wide write leader
SELECT bdr.alter_node_group_option(top_group, enable_routing, true);

- - Subgroups do not elect their own write leaders
SELECT bdr.alter_node_group_option(location_a, enable_routing, false);
SELECT bdr.alter_node_group_option(location_b, enable_routing, false);

すべての書き込みは、単一のクラスター全体の書き込みリーダーにルーティングされます。リモートロケーションでは、クロスロケーションの書き込みレイテンシーが発生しますが、クロスロケーションの競合はありません。

接続マネージャーの調整#

接続マネージャーには、地域分散展開のために確認する重要な設定がいくつかあります。

  • read_write_port およびread_only_port — 接続マネージャーがそれぞれ書き込みトラフィックと読み取りトラフィックをリッスンするポート。これらがすべての場所で一貫して構成されていることを確認します。

  • read_write_max_client_connections およびread_only_max_client_connections — 受け入れられるクライアント接続の数を制限します。ロケーションごとの接続数が多い地理分散クラスターでは、これらを調整することによりリソースの枯渇を防ぎます。

  • read_write_consensus_timeout — コンセンサスを失った後、書き込み接続の受け入れを停止するまでに接続マネージャーが待機する時間。デフォルトは0 で、すぐに停止することを意味します。地理的分散クラスターでは、クロスロケーションのレイテンシーにより、真の障害ではない短いコンセンサス中断が発生する場合があります。一時的なネットワークイベント中の不要な書き込みの中断を回避するために、短いタイムアウトを設定することを検討します。

  • read_only_consensus_timeout — 読み取り専用接続の場合、上記と同じ。

オプションの完全なリストについては、 Configuring Connection Manager を参照してください。

ルート優先度の設定#

ルート優先度は、グループ内の書き込みリーダーとしてどのノードを優先するかを制御します。値が大きいほど、優先度が高いことを意味します。書き込みリーダーシップが通常の条件でアプリケーショントラフィックの近くにあり、必要な場合にのみリモートノードに移動するように、ローカルノードに高い優先度を割り当てます。

SELECT bdr.alter_node_option(
    node_name := <node_name>,
    config_key := route_priority,
    config_value := 1
);

優先度スキームを文書化して、運用チームが場所を超えて予想されるフェイルオーバー動作を理解できるようにします。

現在の設定の確認#

すべてのグループの現在のRaftとルーティング設定を確認します。

SELECT node_group_name,
       node_group_enable_raft,
       node_group_enable_routing
FROM bdr.node_group;

現在の書き込みリーダーを表示します。

SELECT node_group_name, write_lead
FROM bdr.node_group_routing_summary;