Commit scopes

コミットスコープにより、アプリケーションはEDB Postgres Distributedの耐久性と一貫性をきめ細かく制御できます。

コミットスコープは、 COMMIT レプリケーションの動作を説明する名前付きルールです。実際の動作は、コミットスコープが

、またはこれらの組み合わせを使用するかどうかによって異なります。

構成

Group Commitを使用するには、最初にコミットスコープを定義します。これにより、トランザクションのコミットに関与するPGDノードが決定されます。スコープを確立したら、次のようにGroup Commitを使用するようにトランザクションを構成できます。

BEGIN;
SET LOCAL bdr.commit_scope = example_scope;
...
COMMIT;

トランザクションがデータを書き込む前に、コミットスコープを設定する必要があります。

この例では、以前にコミットスコープを次のように定義している可能性があります。

SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := example_bdr_group,
    rule := ANY 2 (example_bdr_group) GROUP COMMIT,
    wait_for_ready := true
);

この例では、 example_bdr_group という名前付けの ノードグループ が存在し、少なくとも2つのPGDノードをメンバーとして直接またはサブグループに含めることを前提としています。 example_scope でコミットされたトランザクションでは、グループ内のPGDノードからの追加の確認が1つ必要です。起点ノードとともに、これはグループ外の「ANY 2」ノードを占め、トランザクションはコミット後に可視で耐久性があることが保証されます。

オリジングループ

コミットスコープのルールは、トランザクションがコミットされるノード、つまりトランザクションの起点として機能するノードによって異なる場合があります。これをアプリケーションに対して透過的にするために、PGDでは、コミットスコープでトランザクションの発生元に応じて異なるルールを定義できます。

たとえば、ノードが左側と右側の2つのデータセンターにまたがるEDB Postgres分散クラスターを検討します。トップレベルのPGDノードグループの名前がtop_group であると仮定します。次のコマンドを使用して、サブグループを設定し、ローカルデータセンター内のすべてのノードがトランザクションを確認する必要があるコミットスコープを作成しますが、リモートからは1つのノードのみを確認できます。

- - create sub-groups
SELECT bdr.create_node_group(
    node_group_name := left_dc,
    parent_group_name := top_group,
    join_node_group := false
);
SELECT bdr.create_node_group(
    node_group_name := right_dc,
    parent_group_name := top_group,
    join_node_group := false
);

- - create a commit scope with individual rules
- - for each sub-group
SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := left_dc,
    rule := ALL (left_dc) GROUP COMMIT AND ANY 1 (right_dc) GROUP COMMIT,
    wait_for_ready := true
);
SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := right_dc,
    rule := ANY 1 (left_dc) GROUP COMMIT AND ALL (right_dc) GROUP COMMIT,
    wait_for_ready := true
);

現在、 left_dc の一部であるノードでexample_scope を使用すると、最初のスコープが使用されます。 right_dc の一部であるノードで同じスコープを使用すると、2番目のスコープが使用されます。これは、アプリケーションでスコープ名をいじることなく、逆スコープを作成する効果的な方法です。

各グループは、 bdr.alter_node_group_option 管理インターフェイスを使用して指定されたデフォルトのコミットスコープを持つこともできます。

上記のスコープをこれらのグループのノードで発生するすべてのトランザクションのデフォルトのスコープにすることは次のとおりです。

SELECT bdr.alter_node_group_option(
  node_group_name := left_dc,
  config_key := default_commit_scope,
  config_value := example_scope
);
SELECT bdr.alter_node_group_option(
  node_group_name := right_dc,
  config_key := default_commit_scope,
  config_value := example_scope
);

確認レベル

PGDノードは、トランザクションの確認をさまざまなタイミングで送信できます。保護レベルを上げる際に、確認ノードの観点から、これらは次のとおりです。

  • received —リモートPGDノードは、ローカルアプリケーションを開始する前に、トランザクションを受信した直後に確認します。

  • replicated —トランザクションの変更を適用した後、ディスクにフラッシュする前に確認します。

  • durable —すべての変更がディスクにフラッシュされた後、トランザクションを確認します。

  • visible (デフォルト)—すべての変更がディスクにフラッシュされ、同時実行トランザクションから見えるようになった後、トランザクションを確認します。

コミットスコープのルールでは、次のように、これらの確認レベルをON を括弧で囲んでノードグループ定義に追加できます。

  • ANY 2 (right_dc) ON replicated

  • ALL (left_dc) ON visible (デフォルト)

  • ALL (left_dc) ON received AND ANY 1 (right_dc) ON durable

リファレンス

コミットスコープの文法

コミットスコープの文法は次のように構成されています。

commit_scope:
    confirmation [AND ...]

commit_scope_operation:
    commit_scope_group [ ON { received|replicated|durable|visible } ] commit_scope_kind

commit_scope_group:
{ ANY num (node_group [, ...])
  | MAJORITY (node_group [, ...])
  | ALL (node_group [, ...]) }

commit_scope_kind:
{ GROUP COMMIT [ ( group_commit_parameter = value ) ] [ ABORT ON ( abort_on_parameter = value ) ]
  | CAMO [ DEGRADE ON ( degrade_on_parameter = value ) TO ASYNC ]
  | LAG CONTROL [ ( lag_control_parameter = value ) ] }

パラメーター

  • node_group —ノードグループの名前。

``(group_commit_parameter=value)``—GroupCommitのオプション。 transaction_tracking (ブール値)—トランザクションのステータスを追跡するかどうかを指定します。 ``conflict_resolution``(列挙)—競合の処理方法を指定します。可能な値は、``async``、競合解決ポリシーを使用してレプリケーション中に競合を非同期的に解決することを意味する、または``eager``、競合するトランザクションの1つを中止することにより、COMMIT中に競合が積極的に解決されることを意味します。 commit_decision (列挙)— COMMITの決定がどのように行われるかを指定します。値group は、 commit_scope_group 仕様が耐久性だけでなくCOMMITの決定にも影響することを意味します。値partner は、パートナーノードがトランザクションをコミットできるかどうかを決定することを意味します。この値は2つのデータノードグループでのみ許可されます。値 raft は、 commit_scope_group コンセンサスとは独立してRaftコンセンサスを使用してCOMMIT決定が行われることを意味します。

``ABORTON(abort_on_parameter=value)``—タイムアウト時の自動トランザクションアボートを許可します。 timeout (インターバル)—ミリ秒単位のタイムアウト(他の単位を受け入れます)。

``DEGRADEON(degrade_on_parameter=value)``—タイムアウト時に非同期操作への低下を許可します timeout (インターバル)ミリ秒単位のタイムアウト(他の単位を受け入れます)。その後、操作は非同期になります。 * require_write_lead (ブール値)—ノードが非同期モードに切り替えることができる書き込みリードでなければならないかどうかを指定します。

``(lag_control_parameter=value)``—ラグ制御のオプション: max_lag_size (int) WALバイトに基づいた最大許容ラグ。 ``max_lag_time``(インターバル)—ウォールクロックサンプリングに基づく最大許容ラグ。 max_commit_delay (インターバル)—ラグ制限内に維持しようとするためにコミットに注入できる最大遅延。

注釈

CAMO コミットスコープの種類は、ほとんどが`GROUP COMMIT (transaction_tracking = true, commit_decision = partner)` の構文糖衣で、 DEGRADE ON 句が追加されています。 GROUP COMMIT は最終的に`DEGRADE ON` 句も取得することが予想され、CAMO 構文は非推奨になります。

注釈

synchronous_standby_names とcommitスコープの文法は似ていますが、前者は起点ノードを説明しませんが、後者は説明します。したがって、たとえば synchronous_standby_names = 'ANY 1 (..)' は`ANY 2 (...)` のコミットスコープと同等です。この選択により、多数決についての推論が容易になり、オリジンノードがトランザクションの耐久性と可視性にも貢献することを反映しています。

コミットスコープルールの追加

関数bdr.add_commit_scope は、指定されたコミットスコープ名とオリジンノードグループのルールを作成します。ルールがEDB Postgres分散クラスター内のすべてのノードで同じである場合、トップレベルのノードグループに対してこの関数を1回呼び出すだけで、コミットスコープを完全に定義できます。

または、同じ commit_scope_name で複数回呼び出すことができますが、起点ノードグループと、トランザクションの起点によって異なるコミットスコープのルールが異なります。

概要

bdr.add_commit_scope(
    commit_scope_name NAME,
    origin_node_group NAME,
    rule TEXT
    wait_for_ready boolean DEFAULT true)

コミットスコープルールの変更

コミットスコープ内の単一のオリジンノードグループの特定のルールを変更するには、関数bdr.alter_commit_scope を使用できます。

概要

bdr.alter_commit_scope(
    commit_scope_name NAME,
    origin_node_group NAME,
    rule TEXT)

コミットスコープルールの削除

bdr.remove_commit_scope を使用して、コミットスコープ内の単一のルールを削除できます。コミットスコープに複数のルールを定義する場合、ルールごとに1回この関数を呼び出して、コミットスコープ全体を完全に削除する必要があります。

概要

bdr.remove_commit_scope(
    commit_scope_name NAME,
    origin_node_group NAME)

注釈

ノードグループによってまだデフォルトとして使用されているコミットスコープを削除することは許可されていません。