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 のものをチェックし、レプリケーションの現在の状態に基づいて、その時点で低下するコミットスコープがある場合、それらは自動的に低下—その後の処理時にそのコミットスコープを使用するトランザクションは、タイムアウトを待機する代わりに低下ルールを使用します—レプリケーションが再び十分に迅速に移動していることをマネージャープロセスが検出するまで。
同期コミットとグループコミット#
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
には、どのルールに低下できるかに関するオプションもあります。これは、どのルールから低下するかによって異なります。
まず、非同期操作に低下させることができます。
ALL (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO ASYNC
同じコミットスコープ種類のより制限の低いコミットグループに低下することもできます。これも種類がSYNCHRONOUS_COMMIT
またはGROUP COMMIT
のいずれかである場合に限ります。たとえば、次のように機能を低下させることができます。
ALL (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO MAJORITY (left_dc) SYNCHRONOUS COMMIT
または次のように。
ANY 3 (left_dc) SYNCHRONOUS COMMIT DEGRADE ON (timeout=20s) TO ANY 2 (left_dc) SYNCHRONOUS COMMIT
ただし、 SYNCHRONOUS COMMIT からGROUP COMMIT
に低下することはできません。
CAMO#
Commit At Most Once は、同じtimeout およびrequire_write_lead
パラメーター同じデフォルトでそれぞれ0 およびfalse
をサポートしますが、オプションは非同期オペレーションに低下するだけであるという点で簡単です。
ALL (left_dc) CAMO DEGRADE ON (timeout=20ms, require_write_lead=true) TO ASYNC
繰り返しになりますが、デフォルトは0 であるため、 timeout
パラメーターを設定する必要があります。
機能低下イベントの監視#
bdr.stat_commit_scope を使用して、機能低下イベントを追跡します。 3つの主要なメトリックは、機能低下動作の可視性を提供します。
ndegradesは、トランザクションごとの機能低下イベントを追跡します。コミット中にバックエンドが低下タイムアウトに達し、その特定のトランザクションを正常に低下させるたびにインクリメントされます。このメトリックは、機能の低下が発生した個々のトランザクションの合計数を示します。nconfig_degradesは、構成レベルの状態の縮退モードへの変更を追跡します。バックグラウンドワーカーマネージャープロセスが、ノードの可用性チェックに基づいて、コミットスコープの共有状態を低下に切り替えるときにインクリメントします。これは、コミットスコープ構成自分自身が縮退状態になった回数を示し、復旧するまでの後続のすべてのトランザクションに影響を与えます。last_state_change_timeは、最後の構成レベルの状態変更のタイムスタンプを記録します劣化した状態への移行または回復。このメトリックを使用して、コミットスコープが通常と機能低下の間で最後に移行したときを正確に特定し、他のシステムイベントまたは停止との相関を追加します。
モニタリングクエリの例#
機能低下イベントや最新の構成レベルの状態変更を含むコミットスコープの統計を表示します。
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;
これらのメトリックは、トラブルシューティングの時間的コンテキストとともに、トランザクションごとの即時フォールバックと長期的な状態管理の低下動作の両方に対する完全な可視性を提供します。