Parallel Apply

Parallel Applyとは何ですか?

パラレル適用は、PGDノードがサブスクリプションごとに複数のライターを使用できるようにするPGDの機能です。通常、この動作により、サブスクリプションのスループットが向上し、レプリケーションのパフォーマンスが向上します。

パラレル適用が動作している場合、サブスクリプションからのトランザクションの変更は、複数のライターによって書き込まれます。ただし、各ライタは、トランザクションの最終コミットがオリジンノードで実行されるコミット順序に違反しないことを保証します。違反がある場合、エラーが生成され、トランザクションをロールバックできます。

このメカニズムは、以前は、トランザクションがコミットを保留しており、別のトランザクションが変更する必要がある行を変更し、保留中のトランザクションが実行する前に起点ノードで他のトランザクションが実行された場合、結果のエラーがデッドロックとして現れる可能性があることを意味していました。保留中のトランザクションがロック要求を取り出しました。

さらに、エラーを処理すると、デッドロックの検出にかかる時間、クライアントがトランザクションのロールバックにかかる時間、既に適用されている変更の間接ガベージコレクションにかかる時間、および時間の組み合わせにより、レプリケーションラグが増加する可能性があります。仕事のやり直しに。

これが、PGD 5.2で導入されたParallel Applyのデッドロック緩和が役立つ場所です。任意のトランザクションについて、パラレル適用は今後の書き込みを確認し、潜在的な競合がある場合は、競合がなくなるまでトランザクションを保留します。

Parallel Applyの構成

PGD 5のパラレル適用を制御する2つの変数、 bdr.max_writers_per_subscription (デフォルトは8)および bdr.writers_per_subscription (デフォルトは2)。

bdr.max_writers_per_subscription = 8
bdr.writers_per_subscription = 2

この構成では、各サブスクリプションに2つのライターが提供されます。ただし、状況によっては、システムがサブスクリプションに最大8つのライターを割り当てる場合があります。

bdr.max_writers_per_subscription は、サーバーの再起動でのみ変更できます。

次の方法で、再起動せずに特定のサブスクリプションの bdr.writers_per_subscription を変更できます。

  1. bdr.alter_subscription_disable を使用してサブスクリプションを停止します。

1.新しい値を設定します。

  1. bdr.alter_subscription_enable を使用してサブスクリプションを再開します。

ただし、最初に、 select * from bdr.subscription を使用してサブスクリプションの名前を確立します。この例では、サブスクリプション名はbdr_bdrdb_bdrgroup_node2_node1 です。

SELECT bdr.alter_subscription_disable (bdr_bdrdb_bdrgroup_node2_node1);

UPDATE bdr.subscription
SET num_writers = 4
WHERE sub_name = bdr_bdrdb_bdrgroup_node2_node1;

SELECT bdr.alter_subscription_enable (bdr_bdrdb_bdrgroup_node2_node1);

Parallel Applyをいつ使用するか

パラレル適用はデフォルトで常にオンになっており、ほとんどの操作で、オンのままにすることをお勧めします。

PGD 5.2から、 Parallel ApplyはCAMOで動作します。 Group CommitまたはEager Replicationを使用している場合は無効にする必要があります。

PGD 5.1以前は、グループコミット、 CAMO 、および一括レプリケーションでパラレル適用を使用しないでください。これらのシナリオでは、 Parallel Applyを無効にする必要があります。 PGD 5.1以前を使用しているときに多数のデッドロックが発生している場合は、パラレル適用を無効にするか、アップグレードを検討することもできます。

パラレル適用のモニタリング

Parallel Applyのデッドロック緩和をサポートするために、PGD 5.2は

bdr.stat_subscription に列を追加します。新しい列はnprovisional_waits

、ntuple_waits 、およびncommmit_waits です。 nprovisional_waits 値は、同時適用トランザクションによって実行されている同じタプルに対する操作の数を反映します。これらは暫定的な待機であり、実際にはまだ待機していませんが、待機できます。

適用操作がデッドロックの緩和策の影響を受ける場合、それらは安全に適用され、 ntuple_waits でカウントされるまで待機します。コミットされる前に待機した完全に適用されたトランザクションは、 ncommit_waits でカウントされます。

パラレル適用の無効化

Parallel Applyを無効にするには、 bdr.writers_per_subscription を1に設定します。