Durability and performance options

概要

EDB Postgres Distributedを使用すると、 コミットスコープ を使用して、耐久性、一貫性、可用性、およびパフォーマンスのニーズに基づいて、いくつかのレプリケーション構成から選択できます。

基本的な構成では、 EDB Postgres Distributedは非同期レプリケーションを使用します。ただし、コミットスコープは、デフォルトとトランザクションごとの動作の両方を変更できます。組み込みの物理または論理レプリケーションと同じ方法で、標準のsynchronous_standby_names を使用して、レガシーPostgres同期レプリケーションを構成することもできます。ただし、コミットスコープを使用すると、レプリケーション動作をはるかに柔軟に制御できます。

さまざまな同期設定は、関連するアプリケーションに関連する3つのプロパティに影響しますが、すべて個別に実装できます。

  • 耐久性:複数のノードに書き込むと、クラッシュ回復力が向上し、クラッシュして再起動した後にデータを回復できます。

  • 可視性 :クライアントへのコミット確認により、データベースはいくつかのノードセットでコミットされたトランザクションの即時の可視性を保証します。

  • 競合処理 :競合はコミット後に楽観的に処理でき、コミットタイムスタンプに基づいてトランザクションがレプリケートされるときに競合が解決されます。または、プリコミットで悲観的に処理できます。クライアントは、トランザクションが最終的にすべてのノードに適用されることを信頼できます。これ以上競合することはありません。アボートして、クライアントにエラーを直接通知できます。

コミットスコープを使用すると、トランザクションの持続性を制御する2つの方法を使用できます。

  • Group Commit 。このオプションは、トランザクションがコミット可能と見なされる前にコンセンサスに達する必要があるノードとノード数、およびレプリケーションのどの段階でコミットされたと見なされるかを制御します。このオプションを使用すると、トランザクションの可視性の順序を制御することもできます。

  • CAMO/failoverオプションを使用したpgbench 。このオプションは、クライアントがコンセンサスの一部であるGroup Commitのバリアントです。

  • Lag Control 。このオプションは、コミットの続行を許可する前に、レプリケーションに関してノードからどれだけ遅れることができるかを制御します。

Postgresは physical streaming replication を提供します

(PSR)単方向ですが、 synchronous variant を提供します。下位互換性のため、PGDは引き続き synchronous_commit およびsynchronous_standby_names を使用した同期レプリケーションの構成をサポートしています。

PGDを使用したレガシー同期レプリケーション を参照してくださいが、代わりに Group Commit

の使用を検討してください。

用語と定義

PGDノードは、トランザクションのレプリケーション中にさまざまな役割を果たします。これらはトランザクションごとに暗黙的に割り当てられ、同時トランザクションでも関係ありません。

** オリジン*は、クライアントまたはアプリケーションからトランザクションを受信するノードです。最初にトランザクションを処理するのはノードであり、他のPGDノードへのレプリケーションを開始し、確認またはエラーでクライアントに応答します。

** パートナー*ノードは、グループコミット要件に従ってトランザクションを確認することが期待されるPGDノードです。

** コミットグループ*は、コミットに関与するすべてのPGDノード、つまり、オリジンとそのすべてのパートナーノードのグループであり、少数またはすべてのピアノードになります。

比較

PGDで利用可能な同期レプリケーションのほとんどのオプションは、さまざまなレベルの同期を可能にし、パフォーマンスと、ノードまたはネットワークの停止に対する保護との間のさまざまなトレードオフを提供します。

次の表は、トランザクションが発行されたオリジンノードからCOMMIT確認を受信した後、クライアントがレプリケートされたピアノードに期待できることをまとめたものです。 Mode列は、バリアントに応じて異なる意味をとります。 PSRとPGDを使用したレガシー同期レプリケーションの場合、 synchronous_commit 設定を指します。コミットスコープの場合、

commit scope configuration の確認要件を指します。

Variant

Mode

Received

Visible

Durable

PSR Async

off (default)

no

no

no

PGD Async

off (default)

no

no

no

PGD Lag Control

'ON received' nodes

no

no

no

PGD Lag Control

'ON replicated' nodes

no

no

no

PGD Lag Control

'ON durable' nodes

no

no

no

PGD Lag Control

'ON visible' nodes

no

no

no

PSR Sync

remote_write (2)

yes

no

no (1)

PSR Sync

on (2)

yes

no

yes

PSR Sync

remote_apply (2)

yes

yes

yes

PGD Group Commit

'ON received' nodes

yes

no

no

PGD Group Commit

'ON replicated' nodes

yes

no

no

PGD Group Commit

'ON durable' nodes

yes

no

yes

PGD Group Commit

'ON visible' nodes

yes

yes

yes

PGD CAMO

'ON received' nodes

yes

no

no

PGD CAMO

'ON replicated' nodes

yes

no

no

PGD CAMO

'ON durable' nodes

yes

no

yes

PGD CAMO

'ON visible' nodes

yes

yes

yes

PGD Legacy Sync (3)

remote_write (2)

yes

no

no

PGD Legacy Sync (3)

on (2)

yes

yes

yes

PGD Legacy Sync (3)

remote_apply (2)

yes

yes

yes

  • (1)OSに書き込まれ、OSが実行されたままでPostgresのみがクラッシュする場合。

  • (2)synchronous_replication_availability をasync' に設定してローカルモード(許可されている場合)に切り替えない限り、それ以外の場合は非同期PGDのデフォルトの値が適用されます。

(3)代わりにGroupCommitの使用を検討してください。

受信により、正常に動作しているピアが、ネットワーク全体または部分的な停止に直面した場合でも、それ以上の通信を必要とせずに最終的にトランザクションを適用できることが保証されます。この確認には永続ストレージが関係しないため、ピアノードのクラッシュには引き続きトランザクションの再送信が必要な場合があります。同期と見なされるすべてのモードがこの保護を提供します。

可視性は、トランザクションがリモートで適用されたことを意味します。他のすべてのクライアントは、すべてのノードでトランザクションの結果を確認し、コミットがオリジンノードによって確認された直後にこの保証を提供します。可視性がなければ、接続されている他のクライアントはトランザクションの結果を表示できず、古い読み取りが発生する可能性があります。

耐久性はピアノードのストレージに関連し、ピアノードのクラッシュと回復後のデータの損失に対する保護を提供します。これは、データの受信(物理ストリーミングレプリケーションなど)または可視性(Group Commitなど)に関連する可能性があります。前者はクラッシュ後の再送信の必要性を排除し、後者は再起動後も可視性が維持されることを保証します。

操作の内部タイミング

さまざまなモードがどのように機能するかをよりよく理解するには、PSRとPGDがトランザクションを異なる方法で適用することを理解すると役立ちます。

物理ストリーミングレプリケーション、操作の順序は次のとおりです。

  • OriginはコミットレコードをWALにフラッシュし、トランザクションをローカルで見えるようにします。

  • ピアノードは変更を受け取り、書き込みを発行します。

  • ピアは、受け取った変更をディスクにフラッシュします。

  • ピアは変更を適用し、トランザクションをローカルで見えるようにします。

PGDでは、操作の順序が異なります。

  • OriginはコミットレコードをWALにフラッシュし、トランザクションをローカルで見えるようにします。

  • ピアノードは、メモリ内の適用キューへの変更を受け取ります。

  • ピアは変更を適用し、トランザクションをローカルで見えるようにします。

  • ピアは、ディスクにフラッシュすることによりトランザクションを永続化します。

Group Commit、 CAMO、およびEagerの場合、オリジンノードはトランザクションをローカルで可視化する前に特定の数の確認を待機します。操作の順序は次のとおりです。

  • Originは、準備またはプリコミットレコードをWALにフラッシュします。

  • ピアノードは、メモリ内の適用キューへの変更を受け取ります。

  • ピアは変更を適用し、トランザクションをローカルで見えるようにします。

  • ピアは、ディスクにフラッシュすることによりトランザクションを永続化します。

  • Originはコミットしてトランザクションをローカルで可視にします。

次の表は、違いをまとめたものです。

Variant

Order of apply vs persist

Replication before or after commit

PSR

persist first

after WAL flush of commit record

PGD Async

apply first

after WAL flush of commit record

PGD Lag Control

apply first

after WAL flush of commit record

PGD Group Commit

apply first

before COMMIT on origin

PGD CAMO

apply first

before COMMIT on origin

構成

PGDでの他の管理操作と同様に、 SQL関数を使用してコミットスコープを構成します。

たとえば、 example_group PGDグループの大部分のノードでグループコミットを行う基本的なコミットスコープを定義できます。

SELECT bdr.add_commit_scope(
  commit_scope_name := example_scope,
  origin_node_group := example_group,
  rule := ANY MAJORITY (example_group) GROUP COMMIT,
  wait_for_ready := true
);

次に、トランザクションごとにまたはグローバルに構成変数(GUC)bdr.commit_scope をそのコミットスコープに設定することにより、コミットスコープを使用できます。

BEGIN;
SET LOCAL bdr.commit_scope = example_scope;
...
COMMIT;

特定のPGDグループのデフォルトのコミットスコープを設定することもできます。

SELECT bdr.alter_node_group_option(
  node_group_name := example_group,
  config_key := default_commit_scope,
  config_value := example_scope
);

default_commit_scope は、指定された起点ノードが属するグループツリーで下から上にチェックされます。 default_commit_scope は特別な値local に設定できません。これは、コミットスコープがbdr.commit_scope 構成パラメーターを使用する方法がないことを意味します。

説明されているすべてのオプションを含むコミットスコープ言語の完全な詳細については、

commitスコープへの移行 を参照してください。

Postgres構成パラメーター

次の表に、デフォルト以外の値(req)に設定する必要がある構成設定と、オプション(opt)であるが特定のバリアントに影響を与える構成設定の概要を示します。

Setting (GUC)

Group Commit

Lag Control

PSR (1)

Legacy Sync

synchronous_standby_names

n/a

n/a

req

req

synchronous_commit

n/a

n/a

opt

opt

synchronous_replication_availability

n/a

n/a

opt

opt

bdr.commit_scope

opt

opt

n/a

n/a

計画的なシャットダウンと再起動

受信確認でGroup Commitを使用する場合は、計画的なシャットダウンまたは再起動に注意してください。デフォルトでは、適用キューはシャットダウン前に消費されます。ただし、 immediate シャットダウンモードでは、シャットダウン時にキューが破棄され、停止したノードがキュー内のトランザクションを「忘れ」ます。起点ノードの同時障害は、両方のノードに障害が発生したかのように、データの損失につながる可能性があります。

適用キューがディスクにフラッシュされるようにするには、メンテナンスタスクにsmart またはfast shutdownを使用します。このアプローチにより、必要な同期レベルが維持され、データの損失が防止されます。

PGDを使用したレガシー同期レプリケーション

注釈

代わりに Group Commit の使用を検討してください。

使用法

PGDを使用して同期レプリケーションを有効にするには、関連するPGDピアノードのアプリケーション名をsynchronous_standby_names に追加する必要があります。 FIRST x またはANY x の使用は、非PGDスタンバイノードの要件と競合しない場合、ある程度の柔軟性を提供します。

追加したら、 synchronous_commit を使用して、トランザクションごとの同期レベルを構成できます。デフォルトはon です。この設定は、アプリケーション名をsynchronous_standby_names に追加すると既に同期レプリケーションが有効になっていることを意味します。 synchronous_commit をlocal またはoff に設定すると、同期レプリケーションがオフになります。

PGDはトランザクションを永続化する前に適用するため、値 on および remote_apply 論理レプリケーションと同等です。

commitスコープへの移行

synchronous_commit およびsynchronous_standby_names とは無関係に、PGDのグループコミット機能を構成します。代わりに、 bdr.commit_scope GUCを使用すると、トランザクションごとにスコープを選択できます。また、各ノードでsynchronous_standby_names を個別に構成する代わりに、Group Commitはグローバルに同期されたコミットスコープを使用します。

注釈

synchronous_standby_names とcommitスコープの文法は似ていますが、前者は起点ノードを説明しませんが、後者は説明します。したがって、たとえば、 synchronous_standby_names = 'ANY 1 (..)' は`ANY 2 (...)` のコミットスコープと同等です。この選択により、多数決についての推論が容易になり、オリジンノードがトランザクションの耐久性と可視性にも貢献することを反映しています。