Commit scope rules
==================

コミットスコープルールは、コミットスコープメカニズムの中核です。これらは、コミットスコープが適用する内容を定義します。

コミットスコープルールは、組み合わせて動作する1つ以上の操作で構成されます。ルール間でANDを使用します。

各オペレーションは、コミットスコープグループ、オプションの確認レベル、および独自のパラメーターを持つことができるコミットスコープの種類の2つまたは3つの部分で構成されています。

::

   commit_scope_group [ confirmation_level ] commit_scope_kind

完全な正式な構文図は、 `Commit scopes <https://www.enterprisedb.com/docs/pgd/latest/reference/commit-scopes#commit-scope-syntax>`_ リファレンスで入手できます。

``ANY 2 (group) GROUP COMMIT``
などの一般的なコミットスコープルールは、そのコンポーネントに分割できます。
``ANY 2 (group)``
は、ルールに、どのノードが応答して、トランザクションを処理したことを確認する必要があるかを指定するコミットスコープグループです。この例では、名前付けグループの任意の2つのノードが確認する必要があります。

確認レベルが指定されていないため、デフォルトが使用されます。ルール全体を次のように考えることができます。

::

   ANY 2 (group) ON visible GROUP COMMIT

``visible``
設定は、すべてのトランザクションの変更がディスクにフラッシュされ、他のトランザクションから可視されると、ノードが確認できることを意味します。

このオペレーションの最後の部分はコミットスコープの種類です。この例では
``GROUP COMMIT`` です。 ``GROUP COMMIT``
は、名前付けグループ内の2つのノードが、トランザクションの変更をフラッシュして可視にしたことを確認したときに確認される同期2フェーズコミットです。

コミットスコープグループ
------------------------

コミットスコープグループには、 ``ANY`` 、\ ``ALL``
、および\ ``MAJORITY``
の3種類があります。これらのすべての後には、かっこ内の1つ以上のグループのリストが続きます。グループのこのリストを組み合わせて、この操作が適用されるノードのプールを作成します。このリストには、\ ``NOT``
を付けることができます。これは、プールをリストにない他のすべてのグループに反転します。
Witnessノードはデータを複製しないため、このプールに含めることはできません。

-  ``ANY n`` の後には、整数値\ ``n``
   が続きます。これは、リストされたグループのノード内の\ ``n``
   ノードに変換されます。

-  ``ALL``
   の後にはグループが続き、リストされたグループのノード内のすべてのノードに変換されます。

-  ``MAJORITY``
   はグループが続き、マジョリティを与えるには、リストされたグループのノードの半分に1つを加えたものを必要とすることを意味します。

-  ``ANY n NOT`` の後には、整数値\ ``n``
   が続きます。これは、リストされたグループのノードにない\ ``n``
   ノードに変換されます。

-  ``ALL NOT``
   の後にはグループが続き、リストされたグループのノードにないすべてのノードに変換されます。

-  ``MAJORITY NOT``
   はグループが続き、マジョリティを与えるには、リストされたグループのノードにないノードの半分と1を必要とすることを意味します。

確認レベル
----------

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``

..  Note::
   PostgreSQLの`synchronous_standby_names` 機能に慣れている場合は、 `synchronous_standby_names` とコミットスコープの文法は似ているように見えますが、微妙な違いがあることに注意してください。前者は起点ノードを考慮しませんが、後者は考慮します。たとえば、 `synchronous_standby_names = 'ANY 1 (..)'` は、`ANY 2 (...)` のコミットスコープと同等です。この違いにより、マジョリティに関する推論が簡単になり、起点ノードがトランザクションの耐久性と可視性にも貢献することを反映しています。

コミットスコープの種類
----------------------

現在、4つのコミットスコープ種類があります。以下は概要と、詳細へのリンクです。

SYNCHRONOUS_COMMIT
^^^^^^^^^^^^^^^^^^

同期コミットは、ネイティブのPostgres ``synchronous_commit``
オプションのように動作するように設計されたコミットスコープオプションですが、コミットスコープ環境内から使用できます。
``GROUP COMMIT`` とは異なり、これは同期非2フェーズコミット操作です。
``GROUP COMMIT`` と同様に、オプションの\ ``DEGRADE ON``
句をサポートします。このオプションの前にあるコミットスコープグループは、
``SYNCHRONOUS_COMMIT`` が使用するグループと確認要件を制御します。

詳細については、 :ref:`Synchronous Commit <Synchronous Commit>` を参照してください。

グループコミット
^^^^^^^^^^^^^^^^

グループコミットは、コミットスコープグループの要件に従って確認される同期の2フェーズコミットです。
``GROUP COMMIT`` には、以下を制御するオプションがあります。

-  中断に対するトランザクションを追跡するかどうかブール値、デフォルトはオフ

-  競合を解決する方法 ``async`` または\ ``eager``
   、デフォルトは\ ``async``

-  コンセンサスを取得する方法 ``group`` 、\ ``partner`` または\ ``raft``
   、デフォルト\ ``group``

詳細については、 :ref:`グループコミット <グループコミット>` を参照してください。

CAMO
^^^^

Commit At Most
OnceまたはCAMOにより、クライアント/アプリケーション、オリジンノード、およびパートナーノードは、トランザクションが最大1回データベースにコミットされることを保証できます。クライアントはプロセスに関係するため、
CAMOプロセスに参加するにはアプリケーションを変更する必要があります。

詳細については、 :ref:`Commit At Most Once <Commit At Most Once>` を参照してください。

ラグコントロール
^^^^^^^^^^^^^^^^

ラグ制御を使用すると、システムのレプリケーションパフォーマンスが指定された制限を超えると、データベースとのクライアントの相互作用にコミット遅延を自動的に挿入し、クライアントにバックプレッシャーを提供できます。
Lag
Controlには、適用できる最大コミット遅延を設定するパラメーターがあります。また、そのコミット遅延の増加をトリガーするキューサイズまたは処理時間の面でも制限があります。

詳細については、 :ref:`遅延制御 <遅延制御>` を参照してください。

結合ルール
----------

コミットスコープルールは、組み合わせて動作する1つ以上の操作で構成されます。
ANDを使用して1つのルールを形成します。例

::

   MAJORITY (Region_A) SYNCHRONOUS_COMMIT AND ANY 1 (Region_A) LAG CONTROL (MAX_LAG_SIZE = 50MB)

最初の操作は、\ ``Region_A`` の大部分に対する同期コミットを設定します。
2番目の操作は、 ``Region_A``
のノードのいずれかが50MBを超える遅延がある場合に、コミット遅延の押し上げを開始する遅延制御を追加します。この操作の組み合わせにより、ノードに遅延が発生しているときに遅延制御が動作できます。
