Transaction streaming

ロジカルレプリケーションでは、トランザクションはパブリッシャーで同時にデコードされますが、トランザクションがコミットされるまでサブスクライバーに送信されません。変更がlogical_decoding_work_mem(PostgreSQL 13以降)を超える場合、変更はディスクに書き込まれます。これは、特にラージトランザクションでは、サブスクライバーに到達する前に多少の遅延が発生し、パブリッシャーで追加のI / Oが必要になる場合があることを意味します。

PostgreSQL 14以降、オプションでトランザクションをデコードし、パブリッシャーでコミットする前に*サブスクライバーに送信できます。サブスクライバーは、着信した変更をステージングファイル(またはファイルのセット)に保存し、トランザクションのコミット時にそれらを適用します(または、トランザクションが中断した場合は破棄します)。これにより、トランザクションがコミットされるとすぐに、サブスクライバーにトランザクションを適用できます。

この機能は、 PostgreSQL 14(EPAS 14およびEDB Postgres Extended 14を含む)から利用でき、 EDB Postgres Extended 13にバックポートされています。

BDRの機能強化

上記のように、PostgreSQLのビルトイントランザクションストリーミングには次の制限があります。

  • パブリッシャーのディスクに変更をスピルする必要はもうありませんが、変更は 各サブスクライバーのディスクに書き込まれる

  • トランザクションが中断した場合、作業(各サブスクライバーが受信した変更 関連付けられたストレージI / O)は無駄になります

ただし、バージョン3.7以降、 BDRはParallel Applyをサポートし、各サブスクライバーでマルチプルのライタープロセスを有効にします。これにより、以下の機能強化が提供されます。

  • デコードされたトランザクションは、サブスクライバー上のライタに直接ストリーミングできます。

  • デコードされたトランザクションは、サブスクライバーのディスク上に保存する必要はありません

  • 適用を開始する前にトランザクションがコミットのを待つ必要はありません サブスクライバーでのトランザクション

警告

  • 並列適用を有効にする必要があります

  • ワークロードが多数の小規模で競合するトランザクションで構成されている場合、これは

    • 作家間の頻繁なデッドロック

ライタ ectへのストリーミングはまだ実験的な機能であり、

注意して使用してください。具体的には、ストリーミングのコミットタイムスタンプが利用できない可能性があるため(トランザクションがオリジンでまだコミットされていない可能性があるため)、競合解決ではうまく機能しない可能性があります。

設定

トランザクションストリーミングは、次の2つの場所で構成されます。

bdr.default_streaming_modeを使用したノード設定

許可される値は次のとおりです。

  • off

  • writer

  • file

  • auto

デフォルト値はautoです。

有効にするには、この設定を変更するには、各サブスクリプションのpglogicalレシーバプロセスをリスタートする必要があります。これは、serverrestartで実現できます。

bdr.default_streaming_modeがoff以外の値に設定されている場合、サブスクライバーはパブリッシャーからのトランザクションストリーミングを要求します。これがどのように提供されるかは、グループ構成設定にも依存します。詳細については、以下のセクションXXXを参照してください。

bdr.alter_node_group_config()を使用したグループ設定

ファンクションbdr.alter_node_group_config()のパラメータstreaming_modeを使用して、グループトランザクションストリーミング構成を設定できます。

許可される値は次のとおりです。

  • off

  • writer

  • file

  • auto

  • default

デフォルト値はdefaultです。

現在の設定の値は、ビューのnode_group_streaming_mode列に含まれています。返される値は単一のchar型であり、可能な値は()、()、()、()および()です。

構成設定の効果

トランザクションストリーミングは、GUCbdr.default_streaming_modeによってサブスクライバーレベルで制御されます。 off(transactionstreamingを無効にする)に設定しない限り、サブスクライバーはトランザクションストリーミングを要求します。

パブリッシャーがトランザクションストリーミングを提供できる場合、トランザクションサイズがinlogical_decoding_work_memで設定されたしきい値を超えるたびに、トランザクションをウィルストリームします。パブリッシャーは通常、トランザクションをファイルにストリーミングするかライタにストリーミングするかを制御できません。状況(COPYなど)を除き、トランザクションをライタにストリームするようサブスクライバーにヒントを与える場合があります(可能な場合)。

サブスクライバーは、パブリッシャーから受け取ったトランザクションをライタまたはファイルにストリームできます。決定はいくつかの要因に基づいています。

  • 並列適用がオフの場合(num_writers = 1)、ファイルにストリーミングされます (ライタ0は常に非ストリーミングトランザクション用に予約ています)

  • 並列適用がオンになっているが、すべてのライターがストリーミングのハンドリングですでに忙しい場合 トランザクションの場合、新しいトランザクションはファイルにストリーミングされます。見る [bdr.writers] (モニタリング.md#Monitoring BDR Writers)でBDRを確認します ライタのステータス。

ライタへのストリーミングが可能な場合(つまり、フリーのライタが利用できる場合)、トランザクションをライタまたはファイルにストリームするかどうかの決定は、次の表のグループとノードの設定の組み合わせに基づきます。

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である場合、パブリッシャーがこれを行うことを示唆した場合にのみ、トランザクションがライタにストリーミングされることに注意してください。

現在、パブリッシャーは、次のトランザクションタイプについてライタにストリームするようにサブスクライバーにヒントを提供します。

  • COPY

  • CREATE INDEX CONCURRENTLY

監視

トランザクションストリーミングの使用は、サブスクライバノードのbdr.stat_subscription関数を介して監視できます。

  • nstream_writer-ライタにストリーミングされたトランザクションの数

  • nstream_file-ファイルにストリーミングされたトランザクションの数

  • nstream_commit-コミットされたストリーミングトランザクションの数

  • nstream_abort-中止されたストリーミングトランザクションの数

  • nstream_start-開始されたストリーミングトランザクションの数

  • nstream_stop-完全に受信されたストリーミングトランザクションの数