Durability & Performance Options¶
概要¶
同期または* Eager Replication *は、トランザクションをコミットする前に、クラスターの少なくとも2つのノード間で同期します。これにより、アプリケーションに関連する3つのプロパティが提供されますが、これらは関連していますが、すべて個別に実装できます。
耐久性:マルチプルのノードへの書き込みにより、クラッシュ障害性が向上 また、クラッシュおよびリスタート後にデータを回復できます。
可視性:クライアント、データベースへのコミット確認付き いくつかのコミットされたトランザクションの即時可視性を保証します ノードのセット。
コミット後の競合なし:クライアントはトランザクションに依存して、 最終的に、さらに競合することなくすべてのノードに適用されるか、または クライアントにエラーを直接通知するアボート。
BDRはPostgres自分自身のsynchronous_commitオプションと統合され、
BDRノード間で使用できる同期レプリケーションのバリアントを提供します。
BDRは、2つの追加のレプリケーションモードも提供します。
最大1回コミット(CAMO)。この機能は、知っていることで問題を解決します トランザクションがコミット(および複製)されているかどうか COMMIT中の特定のエラー。通常、次のことを知るのはハードかもしれません COMMITが処理されたかどうか。この機能により、アプリケーションは 新しいデータベースコネクションがノードへの場合でも、何が起こったかを調べる 以前の接続よりも。この機能の詳細については、 Commit At Most Onceの章。
熱心なレプリケーション。これはレプリケーションを避けるためのオプショナル機能です 競合。すべてのトランザクションはすべてのノードに同時に適用され、 レプリケーションの競合が検出されない場合にのみコミットします。この機能は パフォーマンスを低下させますが、非常に強力な一貫性保証を提供します。 この機能の詳細については、Eager All-Node Replicationを参照してください。 章。
Postgres自分自身は(PSR)を提供します。これは単方向ですが、 BDRと組み合わせて使用できるものを提供します。
この章では、同期的またはeagerreplicationのさまざまな形式とそのタイミングの側面について説明します。
比較¶
BDRで利用可能な同期レプリケーションのほとんどのオプションは、異なるレベルの同期を可能にし、パフォーマンスとノードまたはネットワークの停止に対する保護との間で異なるトレードオフを提供します。
次の表は、トランザクションが発行されたオリジンノードからCOMMIT確認を受信した後、複製されたピアノードからクライアントが期待できるものをまとめたものです。
Variant |
Mode |
Received |
Visible |
Durable |
|---|---|---|---|---|
PGL/BDR |
off (default) |
no |
no |
no |
PGL/BDR |
remote_write (2) |
yes |
no |
no |
PGL/BDR |
on (2) |
yes |
yes |
yes |
PGL/BDR |
remote_apply (2) |
yes |
yes |
yes |
PSR |
remote_write (2) |
yes |
no |
no (1) |
PSR |
on (2) |
yes |
no |
yes |
PSR |
remote_apply (2) |
yes |
yes |
yes |
CAMO |
remote_write (2) |
yes |
no |
no |
CAMO |
remote_commit_async (2) |
yes |
yes |
no |
CAMO |
remote_commit_flush (2) |
yes |
yes |
yes |
Eager |
n/a |
yes |
yes |
yes |
(1)OSに書き込まれ、OSの実行が継続し、 Postgresがクラッシュします。*
(2)設定によりローカルモードに切り替えられない限り(許可されている場合)
synchronous_replication_availabilityからasync'、それ以外の場合 非同期BDRのデフォルトの値が適用されます。*
受信により、同等なは最終的なトランザクションのすべての変更を、それ以上の通信を必要とせずに、つまりネットワークの完全または部分的な停止に直面することなく最終的に適用できるようになります。同期的と見なされるすべてのモードがこの保護を提供します。
可視性は、トランザクションがリモートで適用されたことを意味し、同時トランザクションとの可能な競合は解決されました。永続性がない場合、つまり、トランザクションを永続化する前に、ピアノードのクラッシュがこのノードを元に戻す可能性があります(そして、変更を再送信して再適用する必要があります)。
耐久性は、同等なのストレージに関連し、同等なのクラッシュとリカバリ後のデータの損失に対する保護を提供しノード。クラッシュの前にトランザクションがすでに可視されていた場合、再び可視されるように回復されます。それ以外の場合、トランザクションのペイロードは永続化され、同等なはトランザクションを最終的に(データの再ノードを必要とせずに)適用できます。
操作の内部タイミング¶
さまざまなモードがどのように機能するかをよりよく理解するには、PSRとBDRがトランザクションをかなり異なって適用することを理解することが役立ちます。
物理的ストリーミングレプリケーションでは、操作のオーダーは次のとおりです。
オリジンはコミットレコードをWALにフラッシュし、トランザクションを作成します ローカルに可視
同等なは変更を受信し、書き込みを発行しノード
同等なは受信した変更をディスクにフラッシュします
同等なは変更を適用し、トランザクションをローカルに可視します
BDRでは、操作のオーダーが異なります。
オリジンはコミットレコードをWALにフラッシュし、トランザクションを作成します ローカルに可視
同等なはメモリの適用キューへの変更を受信しノード
同等なは変更を適用し、トランザクションをローカルに可視します
同等なはディスクにフラッシュすることでトランザクションを永続化します
CAMOおよびEager All Node Replicationの場合、トランザクションをローカルで表示する前に、オリジンノードが確認を待つことにノートしてください。操作のオーダーは次のとおりです。
オリジンは、準備または事前コミットレコードをWALにフラッシュします
同等なはメモリの適用キューへの変更を受信しノード
同等なは変更を適用し、トランザクションをローカルに可視します
同等なはディスクにフラッシュすることでトランザクションを永続化します
オリジンはコミットし、トランザクションをローカルに可視します
次の表は、違いをまとめたものです。
Variant |
Order of apply vs persist on peer nodes |
Replication before or after origin WAL commit record write |
|---|---|---|
PSR |
persist first |
after |
BDR |
apply first |
after |
CAMO |
apply first |
before (triggered by pre-commit) |
Eager |
apply first |
before (triggered by prepare) |
設定¶
次の表は、デフォルト値(req)またはオプション(opt)に設定する必要があるが、特定のバリアントに影響する構成設定の概要を示しています。
setting (GUC) |
PSR |
PGL |
CAMO |
Eager |
|---|---|---|---|---|
synchronous_standby_names |
req |
req |
n/a |
n/a |
synchronous_commit |
opt |
opt |
n/a |
n/a |
synchronous_replication_availability |
opt |
opt |
opt |
n/a |
bdr.enable_camo |
n/a |
n/a |
req |
n/a |
bdr.commit_scope |
n/a |
n/a |
n/a |
req |
bdr.global_commit_timeout |
n/a |
n/a |
opt |
opt |
計画的なシャットダウンと再起動¶
PGLまたはCAMOをremote_writeと組み合わせて使用する場合は、計画的なシャットダウンまたはリスタートに注意する必要があります。デフォルトでは、適用キューはシャットダウン前に消費されます。ただし、immediateシャットダウンモードでは、キューはシャットダウンに破棄され、停止したノードはキュー内のトランザクションを「忘れる」ことになります。別のノードで同時に障害が発生すると、両方のノードで障害が発生したかのように、データが失われる可能性があります。
適用キューがディスクにフラッシュされるように保証には、メンテナンスタスクにsmartまたはfastのいずれかのシャットダウンを使用してください。これにより、必要な同期レベルが維持され、データの損失が防止されます。
BDRを使用した同期レプリケーション¶
使用法¶
BDRを使用して同期レプリケーションを有効にするには、関連するBDR同等なのapplicationnameをtosynchronous_standby_namesに追加する必要があります。
FIRST xまたはANY xの使用は、これが非BDRスタンバイノードの要件と競合しない場合、多くの柔軟性を提供します。
追加された同期レベルは、synchronous_commitを使用してトランザクションごとに構成できます。デフォルトはonです。つまり、synchronous_standby_namesに追加すると、すでに同期レプリケーションが有効になっています。
synchronous_commitをlocalまたはoffに設定すると、同期レプリケーションがオフになります。
BDRはトランザクションを永続化する前に適用するため、値onとremote_applyは同等です(論理複製の場合)。
制限¶
BDRは、物理ストリーミングレプリケーションと同じ構成(および内部メカニズム)を使用するため、 BDRノード間の同期レプリケーションを構成する際に(物理的、非BDR )スタンバイのニーズ性を考慮するニーズがあります。