Commit scopes#

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

コミットスコープは、トランザクションがコミットされるときのシステムの動作を記述する一連のルールです。実際の動作は、コミットスコープのルールがどの種類のコミットスコープを使用するかによって異なります

グループコミット 、 Commit At Most Once 、 遅延制御 、 PGD Synchronous Commit またはこれらの組み合わせ。

ほとんどのコミットスコープの種類はトランザクションの処理を制御しますが、Lag Controlは例外で、遅いまたはキューアップされているレプリケーション操作に応じてシステムのパフォーマンスを動的に調整します。ただし、通常は他のコミットスコープ種類と組み合わせて使用されます

コミットスコープ構造#

すべてのコミットスコープには名前commit_scope_name があります。

各コミットスコープには1つ以上のルールがあります。

コミットスコープ内の各ルールには、コミットスコープルールを一意に識別するorigin_node_group があります。

origin_node_group はPGDグループであり、トランザクションのオリジネーターであるときにこのルールを適用するノードを定義します。

最後に、これらのトランザクションに適用されるコミットスコープまたはコミットスコープ種類の組み合わせを定義するルールがあります。

したがって、コミットスコープに次のルールがある場合

Origin_node_group := ‘example_bdr_group’、rule := ‘MAJORITY (example_bdr_group) GROUP COMMIT’,

次に、ルールは、example_bdr_group のノードがトランザクションを発行したときに適用されます。

ルール自分自身は、指定されたグループのノードの数を指定します変更-MAJORITY (example_bdr_group) -その後にコミットスコープの種類自分自身-GROUP COMMIT が続きます。これは、 example_bdr_group の任意の2つのノードが変更を確認する必要があることを意味します 変更がコミットされたと考えられる前に。

コミットスコープの選択方法#

変更が発生すると、 PGDはトランザクションまたはノードに使用するコミットスコープを検索します。

トランザクションがコミットスコープを指定している場合、そのスコープが使用されます。

指定しない場合、システムはデフォルトのコミットスコープを検索します。デフォルトのコミットスコープはグループレベルの設定です。システムはグループツリーを参照します。ノードのグループを含むグループツリーの下部から始めて上へ、default_commit_scope設定が定義されているグループを検索します。このコミットスコープが使用されます。

default_commit_scopeが見つからない場合、ノードのGUC、 bdr.commit_scopeが使用されます。そして、それが設定されていないか、local に設定されている場合、コミットスコープは適用されず、PGDの非同期レプリケーションが使用されます。

コミットスコープはローカルでなく、コミットが実行されているノードがorigin_node_groupに直接的または間接的に関連していない場合、使用されません。

コミットスコープの作成#

bdr.add_commit_scope を使用して、ルール例をコミットスコープに追加します。例

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

これにより、example_bdr_group から発生したトランザクションのルールMAJORITY (example_bdr_group) GROUP COMMIT がexample_scope と呼ばれるスコープに追加されます。

example_scope に以前にルールが存在しなかった場合、このルールを追加するとスコープが存在します。

ルールが追加されるときは、origin_node_groupが既に存在する必要があります。そうしない場合、追加操作全体がエラーで破棄されます。

ルールが評価されます。ルールが存在しないグループを記載しているか、グループの設定がグループのノードの他の構成設定と互換性がない場合、警告が表示されますが、ルールは追加されます。

ルールが追加されると、コミットスコープが使用できるようになります。

wait_for_ready は、ルールが関連するノードに追加されるまで、bdr.add_commit_scope() 呼び出しをブロックするかどうかを制御します。設定はデフォルトでtrueであり、省略できます。

コミットスコープを使用する#

この例のスコープを使用するには、トランザクション内でbdr.commit_scope を設定できます

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

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

bdr.alter_node_group_option を使用して、グループまたはサブグループのデフォルトとしてコミットスコープを設定できます。

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

グループまたはサブグループのデフォルトを完全にクリアするには、 default_commit_scope 値をlocal に設定します。

SELECT bdr.alter_node_group_option(
  node_group_name := example_bdr_group,
  config_key := default_commit_scope,
  config_value := local
);

PGD CLIを使用してこの変更を行うこともできます。

pgd set-group-options example-bdr-group --option default_commit_scope=example_scope

また、PGD CLIを使用して値をlocal に設定することにより、デフォルトをクリアできます。

pgd set-group-options example-bdr-group --option default_commit_scope=local

最後に、次を使用してノードのデフォルトのcommit_scopeを設定できます。

SET bdr.commit_scope = example_scope;

PGDのデフォルトの非同期レプリケーションを使用するには、 bdr.commit_scope からlocal を設定します。

オリジングループ#

コミットスコープのルールは、トランザクションがコミットされるノード、つまりトランザクションのオリジンとして機能するノードに依存する場合があります。これをアプリケーションに対して透過的にするために、 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 (commit_decision=raft) 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 (commit_decision=raft),
    wait_for_ready := true
);

次に、 left_dc の一部であるノードでexample_scope を使用すると、最初のスコープが使用されます。 right_dc の一部であるノードで同じスコープを使用すると、2番目のスコープが使用されます。 left_dc およびright_dc オリジンルールを1つのコミットスコープ名で組み合わせることで、アプリケーションはどちらかのデータセンターでexample_scope を使用するだけで、そのデータセンターに適切な動作を取得できます。

各グループは、 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
);