Commit scopes
=============

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

コミットスコープは、トランザクションがコミットされるときのシステムの動作を記述する一連のルールです。実際の動作は、コミットスコープのルールがどの種類のコミットスコープを使用するかによって異なります
 :ref:`グループコミット <グループコミット>`  、 :ref:`Commit At Most Once <Commit At Most Once>`  、 :ref:`遅延制御 <遅延制御>`  、
 :ref:`PGD Synchronous Commit <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``
を使用して、ルール例をコミットスコープに追加します。例

.. code:: sql

   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``
を設定できます

.. code:: sql

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

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

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

.. code:: sql

   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`` に設定します。

.. code:: sql

   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を設定できます。

.. code:: sql

   SET bdr.commit_scope = example_scope;

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

オリジングループ
----------------

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

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

.. code:: sql

   - - 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``
管理インターフェイスを使用して指定されたデフォルトのコミットスコープを持つこともできます。

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

.. code:: sql

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