Transaction streaming¶
論理レプリケーションでは、トランザクションはパブリッシャーで同時にデコードされますが、トランザクションがコミットされるまでサブスクライバーには送信されません。変更がlogical_decoding_work_mem
(PostgreSQL
13以降)を超える場合、それらはディスクに書き込まれます。つまり、特に大規模なトランザクションでは、サブスクライバーに到達するまでに遅延があり、パブリッシャーで追加のI
/ Oが必要になる場合があります。
PostgreSQL 14以降、トランザクションは、パブリッシャーでコミットされる前に、オプションでデコードしてサブスクライバーに送信できます。サブスクライバーは、着信変更をステージングファイル(またはファイルのセット)に保存し、トランザクションがコミットするときにそれらを適用します(またはトランザクションがアボートする場合は破棄します)。これにより、トランザクションがコミットされるとすぐに、サブスクライバーにトランザクションを適用できます。
PGDの機能強化¶
PostgreSQLの組み込みトランザクションストリーミングには、次の制限があります。
パブリッシャーのディスクに変更を書き込む必要はなくなりましたが、各サブスクライバーのディスクに変更を書き込む必要があります。
トランザクションが中止された場合、作業(各サブスクライバーが受け取った変更と関連するストレージI / O)は無駄になります。
ただし、バージョン3.7以降、PGDは並列適用をサポートし、各サブスクライバーで複数のライタプロセスを有効にします。この機能を活用して、次の拡張機能を提供します。
デコードされたトランザクションは、サブスクライバーのライタに直接ストリーミングできます。
デコードされたトランザクションは、サブスクライバーのディスクに保存する必要はありません。
サブスクライバーでトランザクションの適用を開始する前に、トランザクションがコミットするのを待つ必要はありません。
注意事項¶
パラレル適用を有効にする必要があります。
多くの小さくて競合するトランザクションで構成されるワークロードは、ライター間で頻繁にデッドロックを引き起こす可能性があります。
注釈
ライタへのダイレクトストリーミングはまだ実験的な機能です。注意して使用してください。具体的には、ストリーミングのコミットタイムスタンプを利用できない場合があるため、競合解決ではうまく機能しない場合があります。 (トランザクションはオリジンでまだコミットされていない可能性があります。)
構成¶
次の2つの場所でトランザクションストリーミングを構成します。
ノードレベルで、GUC bdr.default_streaming_mode を使用
グループレベルで、関数 bdr.alter_node_group_config()を使用したグループ構成 を使用
bdr.default_streaming_modeを使用したノード構成¶
許可される値は次のとおりです。
offwriterfileauto
デフォルト値はauto です。
この設定を変更するには、設定を有効にするには、サブスクリプションごとにpglogicalレシーバープロセスを再起動する必要があります。サーバーの再起動でこれを実現できます。
bdr.default_streaming_mode がoff
以外の値に設定されている場合、サブスクライバーはパブリッシャーからのトランザクションストリーミングを要求します。これがどのように提供されるかは、グループ構成設定によっても異なります。詳細は bdr.default_streaming_modeを使用したノード構成 を参照してください。
bdr.alter_node_group_config()を使用したグループ構成¶
関数 bdr.alter_node_group_config()を使用したグループ構成 でパラメーターstreaming_mode を使用できます
グループトランザクションストリーミング構成を設定します。
許可される値は次のとおりです。
offwriterfileautodefault
デフォルト値はdefault です。
現在の設定の値は、ビュー bdr.node_group_config の列
node_group_streaming_mode
に含まれています。返される値は単一のchar型で、可能な値は次のとおりです
構成設定の効果¶
トランザクションストリーミングは、GUC bdr.default_streaming_mode
によってサブスクライバーレベルで制御されます。トランザクションストリーミングを無効にするoff
に設定されていない限り、サブスクライバーはトランザクションストリーミングを要求します。
パブリッシャーがトランザクションストリーミングを提供できる場合、トランザクションサイズがlogical_decoding_work_mem
で設定されたしきい値を超えるたびにトランザクションをストリーミングします。パブリッシャーは通常、トランザクションがファイルにストリーミングされるかライタにストリーミングされるかを制御できません。一部の状況(COPYなど)を除き、サブスクライバーがトランザクションをライタにストリーミングすることを示唆する場合があります(可能な場合)。
サブスクライバーは、パブリッシャーから受け取ったトランザクションをライタまたはファイルにストリーミングできます。この決定は、いくつかの要因に基づいています。
並列適用がオフ(
num_writers = 1)の場合、ファイルにストリーミングされます。 (ライタ0は常に非ストリーミングトランザクション用に予約されています。)並列適用がオンになっているが、すべてのライターがストリーミングされたトランザクションの処理ですでにビジー状態である場合、新しいトランザクションはファイルにストリーミングされます。 PGDライタのステータスを確認するには、 PGDライターの監視 を参照してください。
ライタへのストリーミングが可能な場合(つまり、無料のライタが利用可能である場合)、トランザクションをライタにストリーミングするかファイルにストリーミングするかは、次の表のようにグループとノードの設定の組み合わせに基づいて決定されます。
Group |
Node |
Streamed to |
|---|---|---|
off |
(any) |
(none) |
(any) |
off |
(none) |
writer |
file |
file |
file |
writer |
file |
default |
writer |
writer |
default |
file |
file |
default |
auto |
writer |
auto |
(any) |
writer |
グループ構成がauto
に設定されている場合、またはグループ構成がdefault
でノード構成がauto
の場合、パブリッシャーがこれを行うことを示唆した場合にのみ、トランザクションはライタにストリーミングされます。
現在、パブリッシャーは、サブスクライバーが次のトランザクションタイプのライタにストリーミングするようにヒントしています。これらは競合がないことが知られており、ライタが安全に処理できます。
COPYCREATE INDEX CONCURRENTLY
モニタリング¶
bdr.stat_subscription を使用して、トランザクションストリーミングの使用を監視できます
サブスクライバーノードの機能。
nstream_writer—ライタにストリーミングされたトランザクションの数。nstream_file—ファイルにストリーミングされたトランザクションの数。nstream_commit—コミットされたストリーミングトランザクションの数。nstream_abort—中止されたストリーミングトランザクションの数。nstream_start—開始されたストリーミングトランザクションの数。nstream_stop—完全に受信されたストリーミングトランザクションの数。