Transaction streaming
=====================

論理レプリケーションでは、トランザクションはパブリッシャーで同時にデコードされますが、トランザクションがコミットされるまでサブスクライバーに送信されません。変更が\ ``logical_decoding_work_mem``
PostgreSQL
13以降を超える場合、それらはディスクにあふれます。これは、特に大規模なトランザクションの場合、サブスクライバーに到達するまでにある程度の遅延が発生し、パブリッシャーで追加のI/Oを必要とする場合があることを意味します。

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

PGDの機能強化
-------------

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

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

-  トランザクションが中止される場合、作業各サブスクライバが受け取った変更および関連するストレージI/Oは無駄になります。

ただし、バージョン3.7以降、
PGDはパラレル適用をサポートし、各サブスクライバーでマルチプルのライタプロセスを有効にします。この機能を活用して、次の機能強化を提供します。

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

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

-  サブスクライバーへのトランザクションの適用を開始する前に、トランザクションがコミットされるのを待機する必要はありません。

注意事項
^^^^^^^^

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

-  多数の小規模で競合するトランザクションで構成されるワークロードは、ライター間で頻繁なデッドロックを発生させる可能性があります。

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

構成
----

2つの場所でトランザクションストリーミングを構成します。

-  ノードレベルで、 GUC :ref:`bdr.default_streaming_mode <bdr.default_streaming_mode>` を使用

-  グループレベルで、ファンクション :ref:`bdr.alter_node_group_config()を使用したグループ構成 <bdr.alter_node_group_config()を使用したグループ構成>` を使用

bdr.default_streaming_modeを使用したノード構成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

-  ``off``

-  ``writer``

-  ``file``

-  ``auto``

デフォルト値は\ ``auto`` です。

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

``bdr.default_streaming_mode`` が\ ``off``
以外の値に設定されている場合、サブスクライバーはパブリッシャーにトランザクションストリーミングを要求します。これが提供される方法は、グループ構成設定によっても異なります。詳細は、
:ref:`bdr.default_streaming_modeを使用したノード構成 <bdr.default_streaming_modeを使用したノード構成>` を参照してください。

bdr.alter_node_group_config()を使用したグループ構成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ファンクションでパラメーター\ ``streaming_mode`` を使用できます
:ref:`bdr.alter_node_group_config()を使用したグループ構成 <bdr.alter_node_group_config()を使用したグループ構成>` 

グループトランザクションストリーミング構成を設定します。

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

-  ``off``

-  ``writer``

-  ``file``

-  ``auto``

-  ``default``

デフォルト値は\ ``default`` です。

現在の設定の値は、ビュー
:ref:`bdr.node_group_config <bdr.node_group_config>` の列\ ``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などの一部の状況を除き
、サブスクライバーがトランザクションをライタにストリーミングすることを示唆する場合があります可能であれば。

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

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

-  並列適用がオンになっているが、すべてのライターがすでにビジー状態である場合、新しいトランザクションはファイルにストリーミングされます。
   PGDライタのステータスを確認するには、
:ref:`PGDライターのモニタリング <PGDライターのモニタリング>` を参照してください。

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

.. csv-table::
  :header: Group,Node,Streamed to
  :widths: 12,25,15
  :align: left
  :class: longtable

  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``

モニタリング
------------

:ref:`bdr.stat_subscription <bdr.stat_subscription>` を使用して、トランザクションストリーミングの使用をモニタできます。

サブスクライバノード上のファンクション。

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

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

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

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

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

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