Origin groups#

コミットスコープのルールは、トランザクションがコミットされるノード、つまりトランザクションのオリジンとして機能するノードに依存する場合があります。そのノードが属するグループツリーの下部のグループは、トランザクションの オリジングループ です。これをアプリケーションに対して透過的にするために、PGDではコミットスコープがトランザクションのオリジングループに応じて異なるルールを定義できます。

たとえば、2つのデータセンター左側left_dc と右側right_dc にまたがるノードを含むEDB Postgres Distributedクラスターを検討します。トップレベルの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
);

ORIGIN_GROUP#

ORIGIN_GROUP を使用してコミットスコープルールを作成するときに、トランザクションのオリジングループを動的に参照することもできます。

これにより、上記のexample_scope のような特定のコミットスコープルールを作成でき、2つのルールではなく1つのルールを指定するだけで指定がさらに簡単になります。

たとえば、再びright_dc のノードから発生したトランザクションで、トランザクションがコミットされる前にright_dc のすべてのノードで確認し、left_dc の任意の1で確認したいとします。また、再びleft_dc で発生したトランザクションの場合、トランザクションがコミットされる前にleft_dc のすべてのノードとright_dc の任意の1ノードで確認したいとします。上記では、example_scope を定義するときにこのために次の2つのルールを使用しました。

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
);

ただし、 ORIGIN_GROUP では、次の単一ルールコミットスコープexample_scope_2 を追加して使用するだけで、上記のexample_scope で使用した2つの個々のルールと同じ効果があります。

SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope_2,
    origin_node_group := top_group,
    rule := ALL ORIGIN_GROUP GROUP COMMIT (commit_decision=raft) AND ANY 1 NOT ORIGIN_GROUP GROUP COMMIT;
    wait_for_ready := true
);

example_scope_2 では、トランザクションがleft_dc から発生した場合、 ORIGIN_GROUP はleft_dc にマップされ、NOT ORIGIN_GROUP はright_dc にマップされます。同様に、トランザクションがright_dc から発生した場合、 ORIGIN_GROUP はright_dc にマップされ、NOT ORIGIN_GROUP はleft_dc にマップされます。したがって、1つのルールを指定するだけで、2つの効果が得られます。

さらにサブグループ、たとえばtop_group の3番目の子middle_dc を追加した場合、上記のexample_scope_2 によると、left_dc から生成されたトランザクションの場合、 left_dc のすべてのノードにright_dc の任意の1を加え、middle_dc の任意の1を前に確認する必要があることに注意してください。トランザクションがコミットされます。もちろん、right_dc で発生したトランザクションの場合、right_dc のすべてのノードとleft_dc の任意の1ノード、およびmiddle_dc の任意の1ノードは、トランザクションがコミットされる前に確認する必要があります。最後に、 middle_dc はtop_group の子であるため、 example_scope_2 は、 middle_dc で発生したトランザクションの場合、 middle_dc のすべてのノードとleft_dc の任意の1ノード、およびright_dc の任意の1ノードが、トランザクションがコミットされる前に確認する必要があることも意味します。