Transaction streaming#
論理レプリケーションでは、トランザクションはパブリッシャーで同時にデコードされますが、トランザクションがコミットされるまでサブスクライバーに送信されません。変更がlogical_decoding_work_mem
PostgreSQL
13以降を超える場合、それらはディスクにあふれます。これは、特に大規模なトランザクションの場合、サブスクライバーに到達するまでにある程度の遅延が発生し、パブリッシャーで追加のI/Oを必要とする場合があることを意味します。
PostgreSQL 14以降、パブリッシャーでコミットされる前に、オプションでトランザクションをデコードして、サブスクライバーに送信できます。サブスクライバは、着信した変更をステージングファイルまたはファイルセットに保存し、トランザクションがコミットするときに適用します、またはトランザクションがアボートする場合は破棄します。これにより、トランザクションがコミットされるとすぐに、サブスクライバーにトランザクションを適用できるようになります。
PGDの機能強化#
PostgreSQLのビルトイントランザクションストリーミングには、次の制限があります。
パブリッシャーのディスクに変更をスピルする必要はありませんが、各サブスクライバーのディスクに変更を書き込む必要があります。
トランザクションが中止される場合、作業各サブスクライバが受け取った変更および関連するストレージI/Oは無駄になります。
ただし、 PGDはパラレル適用をサポートし、各サブスクライバーでマルチプルのライタプロセスを有効にします。この機能を活用して、次の機能強化を提供します。
デコードされたトランザクションは、サブスクライバーのライタに直接ストリーミングできます。
デコードされたトランザクションは、サブスクライバーのディスクに保存する必要はありません。
サブスクライバーへのトランザクションの適用を開始する前に、トランザクションがコミットされるのを待機する必要はありません。
注意事項#
Parallel applyを有効にする必要があります。
多数の小規模で競合するトランザクションで構成されるワークロードは、ライター間で頻繁なデッドロックを発生させる可能性があります。
注釈
ライタへの直接ストリーミングはまだ実験的な機能です。注意して使用してください。具体的には、ストリーミングのコミットタイムスタンプを利用できない可能性があるため、競合解決ではうまく機能しない可能性があります。トランザクションはオリジンでまだコミットされていない可能性があります。
構成#
2つの場所でトランザクションストリーミングを構成します。
ノードレベルで、 GUC bdr.default_streaming_mode を使用
グループレベルで、ファンクション bdr.alter_node_group_option() を使用
bdr.default_streaming_modeを使用したノード構成#
許可される値は次のとおりです。
offwriterfileauto
デフォルト値はauto です。
この設定の変更を有効にするには、サブスクリプションごとにpglogicalレシーバープロセスを再起動します。
これは、サーバーを再起動することで実現できます。
bdr.default_streaming_mode がoff
以外の値に設定されている場合、サブスクライバーはパブリッシャーにトランザクションストリーミングを要求します。これが提供される方法は、グループ構成設定によっても異なります。詳細は、
bdr.default_streaming_modeを使用したノード構成 を参照してください。
bdr.alter_node_group_option()を使用したグループ構成#
ファンクションでパラメーターstreaming_mode を使用できます
bdr.alter_node_group_option()
グループトランザクションストリーミング構成を設定します。
許可される値は次のとおりです。
offwriterfileautodefault
デフォルト値はdefault です。
現在の設定の値は、ビュー
bdr.node_group の列node_group_streaming_mode
に含まれています。返される値は単一のchar型で、使用可能な値はD
default 、W writer 、 F file 、 A auto
、およびO off です。
構成設定の効果#
トランザクションストリーミングは、GUC bdr.default_streaming_mode
によってサブスクライバーレベルで制御されます。トランザクションストリーミングを無効にするoff
に設定されていない限り、サブスクライバーはトランザクションストリーミングを要求します。
パブリッシャーがトランザクションストリーミングを提供できる場合、トランザクションサイズがlogical_decoding_work_mem
で設定されたしきい値を超えるたびに、トランザクションをストリーミングします。通常、パブリッシャーは、トランザクションがファイルにストリーミングされるか、ライタにストリーミングされるかを制御できません。
COPYなどの一部の状況を除き
、サブスクライバーがトランザクションをライタにストリーミングすることを示唆する場合があります可能であれば。
サブスクライバーは、パブリッシャーから受け取ったトランザクションをライタまたはファイルにストリーミングできます。決定はいくつかの要素に基づいて行われます。
Parallel applyがオフ
num_writers = 1の場合、ファイルにストリーミングされます。ライタ0は常に非ストリーミングトランザクション用に予約されています。Parallel applyがオンになっているが、すべてのライターがすでにビジー状態である場合、新しいトランザクションはファイルにストリーミングされます。 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- 完全に受信されたストリーミングトランザクションの数。