Controlling replication lag#

地理的な場所間のネットワーク遅延は、リージョン間のレプリケーションが単一の場所内よりも本質的に遅いことを意味します。管理されないまま放置されると、レプリケーションラグが蓄積し、目標復旧ポイントRPOをリスクにさらし、正常なノードのディスク領域を消費し、クラスターパフォーマンスを低下させます。

PGDは、クロスリージョン遅延を管理するための2つの補完ツールを提供します。書き込みスループットを調整してリモートノードが遅延しないようにするLag Controlと、レプリケーションメッシュを追加せずにリージョンの読み取りトラフィックをオフロードするサブスクライバ専用ノードです。

遅延制御を使用する#

Lag Controlは、レプリケーションラグが定義された制限を超えると、オリジンノードの書き込みトランザクションにわずかな遅延を自動的に挿入するコミットスコープの種類です。これにより、着信書き込み速度が遅くなり、ダウンストリームノードが追いつく時間が与えられます。

PGDコミット遅延は0ミリ秒で始まります。十分なノードの遅延が構成された制限内にある場合、遅延は0またはそれに近いままです。制限を超過すると、クラスターが追いつくまで遅延が増加します。遅延は、トランザクションがコミットしてロックを解放した後に適用されるため、同時トランザクションはブロックされません。

遅延制御の構成#

ほとんどのジオレプリケーション展開では、オリジングループ用に同期コミットスコープが既に構成されています。 AND を使用して同じルールにリモートグループにLAG CONTROL を追加して、同期耐久性がローカルに適用され、遅延調整がクロスリージョンに適用されるようにします。

SELECT bdr.create_commit_scope(
    commit_scope_name := geo_scope_lag,
    origin_node_group := <top_group>,
    rule := ALL ORIGIN_GROUP SYNCHRONOUS COMMIT AND ANY 1 NOT ORIGIN_GROUP LAG CONTROL (max_commit_delay=500ms, max_lag_time=30s),
    wait_for_ready := true
);

同期コミット要件なしでラグ調整のみが必要な場合は、両方でLAG CONTROL を使用します。

SELECT bdr.create_commit_scope(
    commit_scope_name := geo_scope_lag_only,
    origin_node_group := <top_group>,
    rule := ALL ORIGIN_GROUP LAG CONTROL (max_commit_delay=500ms, max_lag_time=30s) AND ANY 1 NOT ORIGIN_GROUP LAG CONTROL (max_commit_delay=500ms, max_lag_time=30s),
    wait_for_ready := true
);

主要なパラメーターは次のとおりです。

  • max_commit_delay クライアントの書き込みトランザクションに注入できる最大遅延。これは難しい天井です。遅延がこの値を超えることはありません。

  • max_lag_time 時間で表される許容可能なレプリケーション遅延。これはソフトリミットです。

  • max_lag_size WALバイトとして表される許容可能なレプリケーションラグ。これもソフトリミットです。

遅延制御では十分でない場合#

コミット遅延が一貫して構成された上限にあり、遅延がまだ制限を超えている場合は、書き込みスループットが使用可能なクロスリージョン帯域幅に対して基本的に高すぎることを示しています。次を検討します。

  • クロスリージョンネットワーク帯域幅の増加。

  • 大規模な大量ロード操作を、より長いコミット遅延を持つ小さなトランザクションに分割します。

  • すべてのテーブルをクロスリージョンにレプリケートする必要があるかどうかの確認。

ルーティングしきい値の設定#

ルーティングしきい値は、遅延ノードが書き込みおよび読み取りルーティングから削除されるタイミングを制御します。ノードの遅延が設定されたしきい値を超えると、接続マネージャーは追いつくまでトラフィックのルーティングを停止します。どちらのしきい値のデフォルト値は-1 で、チェックを無効にします。値はバイト単位です。

遅延がしきい値を超えたときにノードを書き込みリーダー資格から削除するようにroute_writer_max_lag を設定します。

SELECT bdr.alter_node_group_option(
    node_group_name := <group_name>,
    config_key := route_writer_max_lag,
    config_value := 16777216
);

遅延がしきい値を超えたときに読み取りルーティングからノードを削除するようにroute_reader_max_lag を設定します。

SELECT bdr.alter_node_group_option(
    node_group_name := <group_name>,
    config_key := route_reader_max_lag,
    config_value := 16777216
);

現在のしきい値を確認します。

SELECT node_group_name, route_writer_max_lag, route_reader_max_lag
FROM bdr.node_group_routing_config_summary;

チューニングレプリケーションの適用#

変更をより速く適用すると、書き込み量が多い場合の遅延が削減されます。ノードグループレベルで並列適用ワーカーの数 num_writers 、ストリーミングモードstreaming_mode 、および意図的な適用遅延apply_delay を構成します。詳細は、 Replication and sequence tuning を参照してください。

レプリケーションラグのモニタリング#

次のビューを使用して、クラスター全体の現在の遅延を確認します。

  • ノードごとの現在のレプリケーションレートと推定キャッチアップ時間を確認します。

SELECT target_name, replay_lag, replay_lag_bytes, apply_rate, catchup_interval
FROM bdr.node_replication_rates;
  • ノードごとにサブスクリプションステータスと最後に適用されたトランザクションタイムスタンプを確認します。

SELECT origin_name, target_name, subscription_status, last_xact_replay_timestamp
FROM bdr.subscription_summary;
  • 詳細なLSNレベル情報については、スロットラグを確認します。

SELECT target_name, state, replay_lag_bytes, replay_lag_size
FROM bdr.node_slots
ORDER BY replay_lag_bytes DESC;

遅延情報の精度は、各ノードがクラスターの残りの部分にレプリケーション位置をブロードキャストする頻度を制御する構成パラメーターであるbdr.replay_progress_frequency に依存します。デフォルトは60秒です。 遅延モニタリングの応答性を高めるには、この値を低くします。更新の頻度が高いと、少量のネットワークオーバーヘッドが追加されることに注意してください。

サブスクライバー専用ノード#

リージョンのユーザーがデータの読み取りがほとんどで、書き込みがほとんどない場合、そのリージョンにサブスクライバ専用ノードを追加すると、完全なアクティブロケーションをコストせずに読み取りレイテンシを大幅に削減できます。

サブスクライバー専用ノードはクラスターからレプリケートされた変更を受け取りますが、書き込みを発生せず、レプリケーションメッシュまたはRaftコンセンサスに参加しないため、軽量で追加が簡単です。 詳細は、 Subscriber-only nodes and groups を参照してください。

サブスクライバー専用ノードの追加#

  1. トップレベルグループの下に加入者専用のサブグループを作成します。

SELECT bdr.create_node_group(
    node_group_name := <read_region>,
    parent_group_name := <top_group>,
    node_group_type := subscriber-only
);
  1. サブスクライバ専用ノードとして新しいノードを作成します。

SELECT bdr.create_node(
    node_name := <so_node>,
    dsn := host=<so_host> dbname=<dbname> port=5444,
    node_type := subscriber-only
);
  1. アクティブなデータノード別の加入者専用ノードではないのDSNをエントリポイントとして使用して、新しいノードを加入者専用サブグループに参加させます。

SELECT bdr.join_node_group(
    dsn := host=<data_node_host> dbname=<dbname> port=5444,
    node_group_name := <read_region>
);

サブスクライバー専用ノードへのルーティング読み取り#

接続マネージャーは、読み取り専用トラフィックをサブスクライバー専用ノードにルーティングできます。読み取りリージョン内のノードの読み取り専用エンドポイントを使用するようにアプリケーションの接続文字列を構成します。

読み取り専用ルーティングの構成の詳細については、 Connection Manager Authentication を参照してください。

加入者専用ノードの制限#

  • サブスクライバー専用ノードは書き込みを受け入れることができません。書き込もうとすると失敗します。

  • 彼らはRaftコンセンサスに参加しないため、コミットスコープの確認のクォーラムにカウントされません。

  • ネットワークの状況によっては、サブスクライバ専用ノードのレプリケーションラグがアクティブノードよりも高くなる場合があります。