Commit scopes#

コミットスコープにより、アプリケーションはEDB Postgres Distributedの耐久性と一貫性に関する詳細な制御を提供します。

コミットスコープは、 COMMITレプリケーションの動作を記述する名前付けルールです。実際の動作は、コミットスコープが グループコミット 、 Commit At Most Once 、 遅延制御 、またはこれらの組み合わせを使用するかどうかによって異なります。

構成#

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

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

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

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

``( lag_control_parameter = value )`` — Lag Controlのオプション max_lag_size (int) — WALバイトに基づいた最大許容遅延。 ``max_lag_time`` (インターバル) —壁時計サンプリングに基づいた最大許容遅延。 max_commit_delay インターバル—遅延制限内に保つようにコミットに注入できる最大遅延。

注釈

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

注釈

synchronous_standby_names およびコミットスコープの文法は似ているように見えますが、前者はオリジンノードを考慮していませんが、後者は考慮します。したがって、たとえば 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)

注釈

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