Commit scope rules#
コミットスコープルールは、コミットスコープメカニズムの中核です。これらは、コミットスコープが適用する内容を定義します。
コミットスコープルールは、組み合わせて動作する1つ以上の操作で構成されます。ルール間でANDを使用します。
各オペレーションは、コミットスコープグループ、オプションの確認レベル、および独自のパラメーターを持つことができるコミットスコープの種類の2つまたは3つの部分で構成されています。
commit_scope_group [ confirmation_level ] commit_scope_kind
完全な正式な構文図は、 Commit scopes リファレンスで入手できます。
MAJORITY ORIGIN GROUP QUORUM COMMIT ABORT ON (timeout = 6s)
などの一般的なコミットスコープルールは、そのコンポーネントに分割できます。
MAJORITY ORIGIN GROUP
は、コミットスコープグループであり、どのノードが応答して、トランザクションを処理したことを確認する必要があるかを指定します。この例では、元のノードのグループ内のノードの大部分が確認する必要があります。
確認レベルが指定されていません。これは、デフォルトvisible
が使用されることを意味します。 visible
を使用すると、ノードは、すべてのトランザクションの変更がディスクにフラッシュされ、他のトランザクションから可視されると確認します。
このオペレーションの最後の部分はコミットスコープの種類です。この例では
QUORUM COMMIT です。 QUORUM COMMIT
は、ノードがコミットする前にすべての参加ノードを調整する同期2フェーズコミットです。
ABORT ON
句は必須で、トランザクションを中止する前にクォーラムを待機する時間を設定します。
コミットスコープグループ#
コミットスコープグループには、 ANY 、ALL
、およびMAJORITY
の3種類があります。これらのすべての後には、かっこ内の1つ以上のグループのリストが続きます。グループのこのリストを組み合わせて、この操作が適用されるノードのプールを作成します。このリストには、NOT
を付けることができます。これは、プールをリストにない他のすべてのグループに反転します。
ANY nの後には、整数値nが続きます。これは、リストされたグループのノード内のnノードに変換されます。ALLの後にはグループが続き、リストされたグループのノード内のすべてのノードに変換されます。MAJORITYはグループが続き、マジョリティを与えるには、リストされたグループのノードの半分に1つを加えたものを必要とすることを意味します。ANY n NOTの後には、整数値nが続きます。これは、リストされたグループのノードにないnノードに変換されます。ALL NOTの後にはグループが続き、リストされたグループのノードにないすべてのノードに変換されます。MAJORITY NOTはグループが続き、マジョリティを与えるには、リストされたグループのノードにないノードの半分と1を必要とすることを意味します。
上記の式はすべて、評価時にグループ内のデータノードのみを考慮します。 Witnessノードおよびその他の非データノードは無視されます。
確認レベル#
PGDノードは、さまざまなタイミングでトランザクションの確認を送信できます。保護レベルが増加すると、確認ノードの観点から、これらは次のとおりです。
received- リモートPGDノードは、ローカルアプリケーションを開始する前に、トランザクションを受信した直後に確認します。replicated- トランザクションの変更を適用した後、ディスクにフラッシュする前に確認します。durable- すべての変更がディスクにフラッシュされた後、トランザクションを確認します。visibleデフォルト-すべての変更がディスクにフラッシュされ、同時トランザクションに可視された後、トランザクションを確認します。
コミットスコープのルールでは、次のようにON
のかっこ内のノードグループ定義にこれらの確認レベルを追加できます。
ANY 2 (right_dc) ON replicatedALL (left_dc) ON visibleデフォルトALL (left_dc) ON received AND ANY 1 (right_dc) ON durable
注釈
PostgreSQLの`synchronous_standby_names` 機能に慣れている場合は、 synchronous_standby_names とコミットスコープの文法は似ているように見えますが、微妙な違いがあることに注意してください。前者は起点ノードを考慮しませんが、後者は考慮します。たとえば、 synchronous_standby_names = 'ANY 1 (..)' は、ANY 2 (...) のコミットスコープと同等です。この違いにより、マジョリティに関する推論が簡単になり、起点ノードがトランザクションの耐久性と可視性にも貢献することを反映しています。
コミットスコープの種類#
現在、4つのコミットスコープ種類があります。以下は概要と、詳細へのリンクです。
同期コミット#
同期コミットは、ネイティブのPostgres synchronous_commit
オプションのように動作するように設計されたコミットスコープオプションですが、コミットスコープ環境内から使用できます。これは、オプションのDEGRADE ON
句をサポートする同期非2フェーズコミットオペレーションです。このオプションの前にあるコミットスコープグループは、
SYNCHRONOUS COMMIT が使用するグループと確認要件を制御します。
詳細については、 Synchronous Commit を参照してください。
クォーラムコミット#
クォーラムコミットは、ノードがコミットする前にすべての参加ノードを調整する同期2フェーズコミットです。すべての参加ノードは一緒にコミットまたはロールバックします。ノードがローカルにコミットできる前に、クォーラムコミットは熱心な競合解決を使用して、事実後解決するのではなく不一貫性を防止します。サポートされているコミットスコープグループは、ALL
、MAJORITY ORIGIN GROUP 、MAJORITY CLUSTER
、およびMAJORITY FOR EACH GROUP です。
詳細については、 How Quorum Commit works を参照してください。
CAMO#
Commit At Most OnceまたはCAMOにより、クライアント/アプリケーション、オリジンノード、およびパートナーノードは、トランザクションが最大1回データベースにコミットされることを保証できます。クライアントはプロセスに関係するため、 CAMOプロセスに参加するにはアプリケーションを変更する必要があります。
詳細については、 Commit At Most Once を参照してください。
ラグコントロール#
ラグ制御を使用すると、システムのレプリケーションパフォーマンスが指定された制限を超えると、データベースとのクライアントの相互作用にコミット遅延を自動的に挿入し、クライアントにバックプレッシャーを提供できます。 Lag Controlには、適用できる最大コミット遅延を設定するパラメーターがあります。また、そのコミット遅延の増加をトリガーするキューサイズまたは処理時間の面でも制限があります。
詳細については、 Lag Control を参照してください。
コミットスコープルールは、組み合わせて動作する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を超える遅延がある場合に、コミット遅延の押し上げを開始する遅延制御を追加します。この操作の組み合わせにより、ノードに遅延が発生しているときに遅延制御が動作できます。