ユーザログを抽出できるように、以下のPostgreSQLのパラメータを設定してください。
これらは、すべてのインスタンスで設定してください。
logical以上を設定してください。ただし、ロジカルレプリケーションスロットを作成する必要はありません。
alwaysを設定してください。スタンバイでもユーザログを抽出するためです。
PostgreSQLのマニュアルに従って適切なアーカイブのためのコマンドを設定してください。ただし、このときに以下の2つ条件を満たすようにしてください。
アーカイブ(例えばcpコマンド)が失敗したときに、pg_ctl stop -m immediateを実行するようにしてください。
コピー先のファイル名は、「%f」にしてください。
userlogを追記してください。これを指定することで抽出デーモンプロセスが動作できるようになります。userlogを追記したときには、次にインスタンスを再起動する前にpgx_userlog_controlコマンドを使ってユーザログ抽出の制御ファイルを初期化する必要があります。この手順は次のステップで説明します。
抽出デーモンは、PostgreSQLの各種の内部状態を取得するために、サーバプログラミングインタフェース(SPI)を用いてPostgreSQLに内部接続します。これによって、max_connectionsで管理されるエントリを1個消費します。本パラメータの見積もりに1を加算するようにしてください。
以下のユーザログ抽出のためのパラメータを設定してください。
これらのパラメータのうち、userlog.standby_namesだけがreloadによる値変更の反映が可能です。これ以外はすべてインスタンスの再起動が必要です。
各パラメータの型を括弧内に示してあります。この型の意味はPostgreSQLと同じです。
抽出ファイルの出力先のディレクトリを指定してください。
userlog.archive_directoryとは異なるディレクトリを指定してください。同じ場合にはエラーになります。
アーカイブファイルの出力先のディレクトリを指定してください。
あるインスタンスから見て、レプリケーションの直接的な下流となりえるインスタンスの名前を指定してください。
インスタンスの名前とは、各インスタンスのprimary_conninfoに指定したレプリケーション接続文字列のapplication_nameに指定した名前のことです。すべてのインスタンスで異なる名前を付けてください。
このパラメータはインスタンスがレプリケーションの上流側として動作するときに参照されます。上流側のインスタンスは、ここに書かれたすべての下流側のスタンバイが通知してくる、スタンバイが書き込み同期したログ位置のうちの最も古いログ位置までを抽出対象とします。これによる効果は、“1.4 レプリケーションとの関係”を参照してください。
下流側のスタンバイとのレプリケーション接続が切断されたならば、再び接続されて新たなログ位置が通知されるまで、以前のログ位置を記憶します。つまり、下流側のスタンバイを再度起動してレプリケーションを再接続させるか、userlog.standby_namesからそのスタンバイを除名してリロードするまで抽出が進まなくなります。これは、スタンバイを一時的に停止するときに役立ちます。
自分自身、および、上流側に対して一度もレプリケーション接続が成立していない下流側のスタンバイについては、制御の対象から除外されます。そのため、パラメータの名前にはスタンバイとありますが、自分自身や、将来接続してくる可能性のあるすべてのインスタンスや、まったく無関係の名前を列挙することも可能です。
注意
PostgreSQLでは、ユーザアプリケーションから物理および論理レプリケーション接続することが可能です。これらのアプリケーションで使用するapplication_nameと、各サーバ間のレプリケーション接続のapplication_nameが同名にならないようにしてください。同様に環境変数APPNAMEとfallback_application_nameも注意してください。PostgreSQLは同名の接続を許容しますが、抽出デーモンはこれらを区別できないからです。
仮に、誤って同名の接続がなされた場合でも、ユーザログの抜けがないように、これらのすべてのレプリケーション先でのWAL書き込みが完了するところまで抽出を待ち合わせます。しかし、それはシステム全体の設計上、予期しない動作となっているかもしれないので、注意してください。
抽出デーモンは、スタンバイにおけるWALの書き込み位置を知るために、SPI(Server Program Interface)を介してSQL接続を確立します。インスタンスのスーパーユーザとして接続するので認証情報は必要としませんが、接続先のデータベースには存在するデータベースを指定する必要があります。デフォルトは“postgres”です。このデータベースはインスタンス生成時にデフォルトで作られますが、これを意図的に削除した場合には、その他の存在するデータベース名を本パラメータに指定してください。
他にもユーザログ抽出を制御するパラメータがあります。ただし、これらの設定は必須ではありません。
1つのトランザクションが出力できるユーザログの総サイズを、このパラメータで制限することができます。
あるユーザログを挿入しようとしたときに、そのユーザログを含めた総サイズが本パラメータに指定した値を超えるときには、挿入ファンクションがSQLSTATE:54000を返してエラーとなり、トランザクションが内部的にABORTして以降SQLを実行できなくなるので、明示的にROLLBACK文を実行してトランザクションを終了してください。54000は、program_limit_exceededとして定義しているSQLSTATEです。このパラメータに0を指定すると総サイズを制限しません。デフォルトは0です。PostgreSQLの他のパラメータのように単位(kB、MB、など)を付加することができます。
注意
例えば、pgx_emit_userlog()の引数にtext型のデータを与えた場合には、データベースの文字符合化方式に変換した後の長さで制限されます。
抽出デーモンがアーカイブディレクトリを監視する間隔です。この監視によって次のアーカイブファイルが生成されたことを検知して、次の抽出ファイルを作成します。単位は秒です。デフォルトは1です。userlog.write_retry_numによる抽出ファイルのリトライの間隔も、本パラメータの値を使用します。
抽出デーモンによる抽出ファイルの作成失敗の許容回数です。指定された回数を超えて失敗すると抽出デーモンは自らを停止します。特別な値として-1を指定すると無制限に許容します。0を指定したならば、単に一度の失敗も許容しないことを意味します。デフォルトは0です。