WALストリーミング
-----------------

Barmanは、ユーザーが標準の\ ``archive_command``
戦略に加えて、PostgreSQLサーバーから継続的なWALストリーミングを追加できることにより、目標復旧ポイントRPOを削減できます。

Barmanは[``pg_receivewal``
][25]に依存しており、ネイティブストリーミングレプリケーションプロトコルを利用し、PostgreSQLサーバーマスターまたはスタンバイからトランザクションログを継続的に受信します。
PostgreSQL 10より前では、\ ``pg_receivewal``
の名前は\ ``pg_receivexlog`` でした。

..  IMPORTANT::
   Barmanでは、`pg_receivewal` が同じサーバーにインストールされていることが必要です。下位互換性があるため、`pg_receivewal` の最新バージョンをインストールすることをお勧めします。それ以外の場合、ユーザーはBarmanサーバーに`pg_receivewal` の複数のバージョンをインストールし、構成ファイルの`path_prefix` オプションを使用してサーバーの特定のバージョンを適切にポイントできます。

トランザクションログのストリーミングを有効にするには、次のことを行う必要があります。

1. 前述のようにストリーミング接続をセットアップします

2. ``streaming_archiver`` オプションを\ ``on`` に設定します

``cron`` コマンドは、前述の要件が満たされている場合、 ``receive-wal``
コマンドの実行を介してログストリーミングを透過的に管理します。これは推奨されるシナリオです。

ただし、ユーザーは\ ``receive-wal`` コマンドを手動で実行できます。

.. code:: bash

   barman receive-wal <server_name>

..  NOTE::
   `receive-wal` コマンドはフォアグラウンドプロセスです。

トランザクションログは、 ``streaming_wals_directory``
構成オプションで指定されたディレクトリに直接ストリーミングされ、
``archive-wal`` コマンドでアーカイブされます。

``streaming_archiver_name`` パラメーターで指定しない限り、
BarmanはWALストリーマープロセスの\ ``application_name``
を\ ``barman_receive_wal``
に設定し、PostgreSQLサーバーの\ ``pg_stat_replication``
システムビューでそのステータスをモニタできます。

レプリケーションスロット
^^^^^^^^^^^^^^^^^^^^^^^^

レプリケーションスロットは、PostgreSQLサーバーがすべてのアーカイバーが受信するまでWALファイルを削除しないようにする自動方法です。
Barmanは、このメカニズムを使用してPostgreSQLからトランザクションログを受信します。

レプリケーションスロットの詳細については、[PostgreSQL
documentation][replication-slots]で見つけることができます。

ストリーミング接続のみに基づいてバックアップアーキテクチャをベースにすることもできます。このシナリオは、DockerベースのPostgreSQLサーバーを構成し、
Windowsで実行されているPostgreSQLサーバーを操作するのに役立ちます。

..  IMPORTANT::
   現時点では、 Windowsサポートはまだ実験的であり、継続的インテグレーションシステムの一部ではありません。

WALストリーミングを構成する方法
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

最初に、トランザクションログファイルをBarmanサーバーにストリーミングするようにPostgreSQLサーバーを構成する必要があります。

BarmanからPostgreSQLサーバーへのストリーミング接続を構成するには、サーバー構成ファイルに次の行を含めて、\ ``streaming_archiver``
を有効にする必要があります。

.. code:: ini

   streaming_archiver = on

レプリケーションスロット推奨を使用する予定がある場合、ストリーミングベースのトランザクションログアーカイブのセットアップに重要なもう1つのオプションは\ ``slot_name``
オプションです。

.. code:: ini

   slot_name = barman

このオプションは、
Barmanが使用するレプリケーションスロットの名前を定義します。レプリケーションスロットを使用する場合、これは必須です。

レプリケーションスロット名を構成するときに、次のコマンドを使用してBarmanのレプリケーションスロットを手動で作成できます。

.. code:: bash

   barman@backup$ barman receive-wal --create-slot pg
   Creating physical replication slot barman on server pg
   Replication slot barman created

Barman
2.10以降、次の設定を使用してレプリケーションスロットを自動的に作成するようにBarmanを構成できます。

.. code:: ini

   create_slot = auto

さまざまなホストからのストリーミングWALとバックアップBarman 3.10.0以降
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Barmanは、WALセグメントをストリーミングするための\ ``pg_receivewal``
プロセスを作成するときに\ ``streaming_conninfo``
で定義された接続情報を使用し、レプリケーションスロットのステータスを確認するときに\ ``conninfo``
を使用します。 ``conninfo`` および\ ``streaming_conninfo``
はバックアップを取るときにも使用されるため、このデフォルト構成では、
BarmanにWALをストリーミングし、同じホストからバックアップを取得します。

プライマリからストリーミングされるWALと、スタンバイからバックアップがソースされるなど、代替構成が必要な場合、次のオプションを使用して実現できます。

-  ``wal_streaming_conninfo``
   ストリーミングレプリケーションプロトコルを介してWALセグメントを受信するとき、およびWALの受信に使用されるレプリケーションスロットのステータスを確認するときに、
   Barmanが\ ``streaming_conninfo`` の代わりに使用する接続文字列。

-  ``wal_conninfo``
   WALストリーミングステータスを監視し、関連するチェックを実行するためのオプションの接続文字列。設定されている場合、
   Barmanはレプリケーションスロットのステータスを確認するときに\ ``wal_streaming_conninfo``
   の代わりにこれを使用します。

次の制限が適用され、チェック中にBarmanによって強制されます。

-  ``wal_streaming_conninfo`` および\ ``wal_conninfo``
   によって定義された接続は、 ``streaming_conninfo``
   および\ ``conninfo``
   接続が到達するのと同じクラスターに属するPostgreSQLインスタンスに到達する必要があります。

-  ``wal_streaming_conninfo``
   接続文字列は、ストリーミングレプリケーション接続を作成できる必要があります。

-  ``wal_streaming_conninfo`` *または* ``wal_conninfo``
   設定されている場合
   、設定を読み取り、レプリケーションスロットのステータスを確認するための十分な権限が必要です。必要な権限は次のいずれかです。

   -  ``pg_monitor`` ロール.
   -  ``pg_read_all_settings`` および\ ``pg_read_all_stats``
      ロールの両方。
   -  ``superuser`` ロール。

..  IMPORTANT::
   クラスター内の*任意の*PostgreSQLインスタンスからWALをストリーミングすることは可能ですが、スタンバイからWALをストリーミングするときにWALセグメントが失われるリスクがあります、そのようなスタンバイが独自の上流ソースに追いつけない場合。このため、WALは常にプライマリから直接ストリーミングすることを*強くお勧めします。

リカバリーを含む部分的なWALファイルの制限
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``pg_receivewal`` の標準動作は、WALセグメント名の後に\ ``.partial``
サフィックスが付いているファイルにトランザクション情報を書き込むことです。

Barmanは、部分ファイルがサーバーの\ ``streaming_wals_directory``
にあることを想定しています。完了すると、\ ``pg_receivewal``
は\ ``.partial``
サフィックスを削除して次のサフィックスを開き、永続的なストレージと圧縮のためにBarmanの\ ``archive-wal``
コマンドにファイルを配信します。

マスターPostgreSQLサーバーに突然の回復不能な障害が発生した場合、
Barmanにストリーミングされた\ ``.partial``
ファイルには、標準のアーカイバーPostgreSQLの\ ``archive_command``
を介してBarmanに配信できなかった非常に重要な情報が含まれています。

Barman 2.10の時点で、 ``get-wal`` コマンドは、 ``--partial/-P``
オプションを介して現在の\ ``.partial``
WALファイルのコンテンツを返すことができます。これは、完全またはポイント・インタイムまでのリカバリの場合に特に役立ちます。したがって、
``get-wal`` を有効にして\ ``--standby-mode`` を使用せずに\ ``recover``
コマンドを実行した場合、 Barmanは\ ``restore_command``
リカバリオプションの\ ``barman-wal-restore`` に\ ``-P``
オプションを自動的に追加します。これはリモートの\ ``get-wal``
コマンドに中継します。

``get-wal`` は、
WALファイルが既にBarmanに出荷されているが、まだアーカイブされていない場合、
``incoming`` ディレクトリも検索します。
