Group Commit¶
Group Commitの目標は、単一ノードの障害または一時的な停止が発生した場合のデータ損失から保護することです。これを実現するには、 COMMIT時にトランザクションを正常に受信して確認するために複数のPGDノードを要求します。
要件¶
通常の操作中、Group Commitはアプリケーションに対して透過的です。フェールオーバー中に進行中であったトランザクションは、アプリケーションまたは中間のプロキシによってトリガーまたは統合される調整フェーズを必要とします。このアクティビティは現在、オリジンノードが回復したとき、またはクラスターから分離したときにのみ発生します。この動作は、Postgresのレガシービルトイン同期レプリケーションの場合と同じです。
Group
Commitでコミットされたトランザクションは、その下で2フェーズコミットを使用します。したがって、ノードごとに発生するそのようなすべてのトランザクションを処理するのに十分な高さにmax_prepared_transactions
を構成します。
構成¶
Group Commitを使用するには、最初に commitスコープへの移行 を定義します。コミットスコープは、トランザクションのコミットに関与するPGDノードを決定します。
動作¶
Group Commitの動作は、コミットスコープによって適用される構成によって異なります。
決定をコミットする¶
Group Commitを構成して、group 、partner 、およびraft
の3つの異なる方法でコミットを決定できます。
グループコミットの決定は、耐久性の目的で使用されるのと同じコミットスコープグループ設定を使用して指定されたコンセンサスを通じて行われます。違いは、コミットの決定はPREPAREレプリケーションに基づいて行われるのに対し、耐久性はCOMMIT(PREPARED)レプリケーションをチェックすることです。
- パートナーの決定は、
Commit At Most Once が使用するものです。このアプローチは、ノードグループに2つのデータノードがある場合にのみ機能します。これら2つのノードはお互いのパートナーであり、オリジンではなくレプリカが何かをコミットするかどうかを決定します。このアプローチでは、アプリケーションが何らかの形でコンセンサスの一部であるため、
- CAMOトランザクションプロトコルを使用して正しく動作するようにアプリケーションを変更する必要があります。このアプローチの詳細については、
CAMO/failoverオプションを使用したpgbench を参照してください。
raftオプションは、ビルトインのRaftコンセンサスを使用して、コミットを実行できるかどうかを決定します。現在、グローバルRaftが使用されています。これが機能するには、クラスター全体のノードの大部分が機能する必要があります。
競合の解決¶
競合解決はasync またはeager です。
- 非同期とは、PGDが特定のノードに構成された行レベルの解決を使用して、レプリケーション中に楽観的な競合解決を行うことを意味します。これは、元のトランザクションがコミットされたか進行中かに関係なく発生します。非同期競合解決がどのように機能するかの詳細は、
CRDTデータ型を使用した列の競合の処理 を参照してください。
Eagerは、競合が(COMMITに関する合意の一部として)熱心に解決され、競合するトランザクションがシリアル化エラーで中止されることを意味します。このアプローチは、パフォーマンスを犠牲にして、非同期解決よりも優れた分離を提供します。 Eager競合解決の仕組みの詳細については、 Eager conflict resolution を参照してください。
中止¶
COMMITでコンセンサスを取得できないトランザクションが永久にハングするのを防ぐために、
ABORT ON
句でタイムアウトを指定できます。タイムアウト後、トランザクションアボートが要求されます。アボート要求が送信された時点でトランザクションのコミットがすでに決定されている場合、クライアントがアボートメッセージを受信する場合でも、トランザクションは最終的にCOMMITします。
制限事項¶
Group
CommitトランザクションはまだDDLを実行できず、明示的な2フェーズコミットをサポートしていません。将来のリリースでは、それらが許可される可能性があります。ただし、
TRUNCATE コマンドは許可されます。
可用性が低下した場合に非同期操作に切り替えるためのDEGRADE TO
句とCAMOトランザクションのみを組み合わせることができます。
EagerおよびCAMOトランザクションは、現在、デコードワーカー機能またはトランザクションストリーミングとの組み合わせでサポートされていません。
Eagerを使用したインストールでは、PGDノードグループでenable_wal_decoder
およびstreaming_mode を無効にしておく必要があります。
同期レプリケーションは、Group
Commitとは異なるトランザクション確認のメカニズムを使用します。この2つは互換性がありません。一緒に使用しないでください。したがって、グループコミットトランザクションを行うときは常に、synchronous_standby_names
でPGDノードが構成されていないことを確認してください。
現在、 Raftのコミットの決定は非常に遅く、非常に低いTPSを生成します。 PGD
4以前のEager All-Node Replication動作を取得するには、 eager conflict
resolution設定でのみ使用することをお勧めします。
同じトランザクションで異なるコミット決定オプションを組み合わせることはサポートされていません。同じトランザクションで異なる競合解決オプションを組み合わせることもサポートされていません。