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

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

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

構成
----

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

.. code:: sql

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

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

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

.. code:: sql

   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つのノードのみを確認します。

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

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

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

確認レベル
^^^^^^^^^^

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``
インターバル—遅延制限内に保つようにコミットに注入できる最大遅延。

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

..  Note::
   `synchronous_standby_names` およびコミットスコープの文法は似ているように見えますが、前者はオリジンノードを考慮していませんが、後者は考慮します。したがって、たとえば `synchronous_standby_names = 'ANY 1 (..)'` は、 `ANY 2 (...)` のコミットスコープと同等です。この選択により、マジョリティに関する推論が簡単になり、起点ノードがトランザクションの耐久性と可視性にも貢献することを反映しています。

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

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

または、同じ\ ``commit_scope_name``
ではあるが、トランザクションのオリジンによって異なるオリジンノードグループとコミットスコープのルールを使用して、複数回呼び出すこともできます。

概要
^^^^

.. code:: sql

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

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

コミットスコープ内のシングルオリジンノードグループの特定のルールを変更するには、ファンクション
``bdr.alter_commit_scope`` を使用できます。

.. _概要-1:

概要
^^^^

.. code:: sql

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

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

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

.. _概要-2:

概要
^^^^

.. code:: sql

   bdr.remove_commit_scope(
       commit_scope_name NAME,
       origin_node_group NAME)

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