Degrading commit scope rules
============================

``SYNCHRONOUS COMMIT`` および\ ``CAMO``
には、それぞれ、特定のパフォーマンスしきい値を超えたときにトランザクションの要件を低下させるオプション機能があります。
``GROUP COMMIT``
は機能を低下させることはできませんが、タイムアウトで中断することはできます。

ノードがトランザクションを適用しており、そのトランザクションがタイムアウトした場合、単にロールバックするのではなく、完了するトランザクションの要件を低下させるプロセスをトリガーすると役立つ場合があります。

``DEGRADE ON``
は、トランザクションのコミットスコープルールを正常に低下させるためのルートを提供します。最も単純では、
``DEGRADE ON``
は、タイムアウトと、コミットスコープが正常に低下できるコミットスコープ操作の2番目のセットを取得します。

たとえば、20ミリ秒または30ミリ秒のタイムアウト後、コミットスコープを満たすための要件は\ ``ALL (node_group_name) SYNCHRONOUS COMMIT``
から\ ``MAJORITY (node_group_name) SYNCHRONOUS COMMIT``
に低下し、トランザクションがより安定して適用されるようになります。

degrade句がトリガーされるように、書き込みリーダーがトランザクションのオリジネーターであることを必要とすることもできます。これは、たとえば2つのデータノードと1つの監視ノードがある「スプリットブレインシナリオ」で役立つ場合があります。
2つのデータノードの間でネットワークが分割され、両方のデータノードへの接続があると仮定すると、監視ノードとのraft選挙を介してリーダーに選ばれるのは一方だけであるため、一方のみが機能低下することは許可されます。

動作
----

一般化された\ ``DEGRADE``
句がトランザクションに適用されたときにどのように動作するかについては、2つの部分があります。

コミット中に1回、処理中のコミットがコミットスコープルールを満たす応答を待機している間、PGDはタイムアウトをチェックし、タイムアウトが満了している場合、処理中のコミットは\ ``DEGRADE``
のコミットスコープルールを待機するように再構成されます。条項。実際、この時点で、
``DEGRADE``
句のコミットスコープルールは既に満たされている可能性があります。

このメカニズムだけでは、目的の動作には不十分です。これだけでは、すべてのトランザクション接続の問題により低下することが確実なトランザクションも含めて、低下モードがキックインする前にタイムアウトが満了するのを待機する必要があり、パフォーマンスに重大な影響を与えるためです。このような劣化クラスターシナリオ。

これを回避するために、PGDマネージャープロセスは定期的に5秒ごとに接続と適用レート
`bdr.node_replication_rates <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/catalogs-visible/#bdrnode_replication_rates>`_ 
のものをチェックし、レプリケーションの現在の状態に基づいて、その時点で低下するコミットスコープがある場合、それらは自動的に低下—その後の処理時にそのコミットスコープを使用するトランザクションは、タイムアウトを待機する代わりに低下ルールを使用します—レプリケーションが再び十分に迅速に移動していることをマネージャープロセスが検出するまで。

同期コミットとグループコミット
------------------------------

``SYNCHRONOUS COMMIT`` と\ ``GROUP COMMIT`` は両方とも\ ``timeout``
および\ ``require_write_lead``
パラメーターを持ち、デフォルトはそれぞれ\ ``0`` および\ ``false``
です。デフォルトの\ ``0``
では即時低下が発生するため、おそらく常に\ ``timeout``
を設定する必要があります。デグレードモードに切り替えるために、書き込みリーダーがトランザクションのオリジネーターであることを要求することもできます。ここでも、デフォルトは\ ``false``
です。 ``SYNCHRONOUS COMMIT`` の場合、 ``timeout``
および\ ``require_write_lead``
はデグレードに適用され、\ ``GROUP COMMIT``
の場合、これらのパラメーターはアボートに適用されます。他のノードからの確認を待機する前にプライマリで既にコミットされているため、
``GROUP COMMIT``
コミットスコープはデグレードできず、\ ``SYNCHRONOUS COMMIT``
コミットスコープはアボートできません。

``SYNCHRONOUS COMMIT``
には、どのルールに低下できるかに関するオプションもあります。これは、どのルールから低下するかによって異なります。

まず、非同期操作に低下させることができます。

.. code:: sql

   ALL (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO ASYNC

同じコミットスコープ種類のより制限の低いコミットグループに低下することもできます。これも種類が\ ``SYNCHRONOUS_COMMIT``
または\ ``GROUP COMMIT``
のいずれかである場合に限ります。たとえば、次のように機能を低下させることができます。

.. code:: sql

   ALL (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO MAJORITY (left_dc) SYNCHRONOUS COMMIT

または次のように。

.. code:: sql

   ANY 3 (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO ANY 2 (left_dc) SYNCHRONOUS COMMIT

ただし、 ``SYNCHRONOUS COMMIT`` から\ ``GROUP COMMIT``
に低下することはできません。

CAMO
----

:ref:`Commit At Most Once <Commit At Most Once>` は、同じ\ ``timeout`` および\ ``require_write_lead``
パラメーター同じデフォルトでそれぞれ\ ``0`` および\ ``false``
をサポートしますが、オプションは非同期オペレーションに低下するだけであるという点で簡単です。

.. code:: sql

   ALL (left_dc) CAMO DEGRADE ON (timeout=20ms, require_write_lead=true) TO ASYNC

繰り返しになりますが、デフォルトは\ ``0`` であるため、 ``timeout``
パラメーターを設定する必要があります。

機能低下イベントの監視
----------------------

`bdr.stat_commit_scope <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/catalogs-visible/#bdrstat_commit_scope>`_ を使用して、機能低下イベントを追跡します。
3つの主要なメトリックは、機能低下動作の可視性を提供します。

- ``ndegrades``
  は、トランザクションごとの機能低下イベントを追跡します。コミット中にバックエンドが低下タイムアウトに達し、その特定のトランザクションを正常に低下させるたびにインクリメントされます。このメトリックは、機能の低下が発生した個々のトランザクションの合計数を示します。

- ``nconfig_degrades``
  は、構成レベルの状態の縮退モードへの変更を追跡します。バックグラウンドワーカーマネージャープロセスが、ノードの可用性チェックに基づいて、コミットスコープの共有状態を低下に切り替えるときにインクリメントします。これは、コミットスコープ構成自分自身が縮退状態になった回数を示し、復旧するまでの後続のすべてのトランザクションに影響を与えます。

- ``last_state_change_time``
  は、最後の構成レベルの状態変更のタイムスタンプを記録します劣化した状態への移行または回復。このメトリックを使用して、コミットスコープが通常と機能低下の間で最後に移行したときを正確に特定し、他のシステムイベントまたは停止との相関を追加します。

モニタリングクエリの例
^^^^^^^^^^^^^^^^^^^^^^

機能低下イベントや最新の構成レベルの状態変更を含むコミットスコープの統計を表示します。

.. code:: sql

   SELECT
     commit_scope_name,
     ndegrades,
     nconfig_degrades,
     last_state_change_time,
     CASE
       WHEN last_state_change_time IS NULL THEN never degraded
       WHEN age(now(), last_state_change_time) < interval 5 seconds THEN recently changed
       ELSE stable for  || age(now(), last_state_change_time)::text
     END AS state_change_info
   FROM bdr.stat_commit_scope
   WHERE ndegrades > 0 OR nconfig_degrades > 0
   ORDER BY last_state_change_time DESC NULLS LAST;

これらのメトリックは、トラブルシューティングの時間的コンテキストとともに、トランザクションごとの即時フォールバックと長期的な状態管理の低下動作の両方に対する完全な可視性を提供します。
