【JPUG主催】PostgreSQLカンファレンス2020【11月13日開催】
他のバージョンの文書 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

46.3. ストリーミングレプリケーションプロトコル

ストリーミングレプリケーションを初期化するために、フロントエンドは開始メッセージにてreplicationパラメータを送信します。 これはバックエンドに対して、SQL文ではなく小規模なレプリケーションコマンド群を発行できるようになる、walsenderモードに入るように伝えます。 walsenderモードでは簡易問い合わせプロトコルのみを使用することができます。 walsenderモードで受け付けられるコマンドは以下の通りです。

IDENTIFY_SYSTEM

サーバに自身を識別することを要求します。 サーバは以下の2つのフィールドを持つ単一行の結果セットをもって応答します。

systemid

クラスタを識別する一意なシステム識別子です。 これを使用してスタンバイを初期化するために使用するベースバックアップが同じクラスタに由来していることを検査することができます。

timeline

現在のTimelineIDです。 同様にスタンバイがマスタと一貫性を持つことを検査するために使用されます。

START_REPLICATION XXX/XXX

サーバに対して、WALのストリーミングをXXX/XXX WAL時点から開始するよう指示します。 サーバが、例えば、要求されたWALの断片がすでに回収されているなど、エラーを返すことがありえます。 成功時サーバはCopyOutResponseメッセージで応答し、フロントエンドに対するWALのストリーミングを開始します。 WALのストリーミングは接続が壊れるまで継続され、他に受け付けられるコマンドはありません。

WALデータはCopyDataメッセージ群として送信されます。 (これにより他の情報を混在させることができます。 具体的にはサーバはストリーム開始後に失敗が起きた場合にErrorResponseメッセージを送信することができます。) CopyDataメッセージのペイロードは以下の書式に従います。

XLogData (B)

Byte1('w')

このメッセージをWALデータとして識別します。

Byte8

このメッセージ内のWALの開始点。 書式はXLogRecPtrです。

Byte8

サーバ上の現在のWAL終了点。 書式はXLogRecPtrです。

Byte8

トランザクションの時点でのサーバのシステム時刻。 書式はTimestampTzです。

Byten

WALデータストリームの断片。

単一のWALレコードが2つのCopyDataメッセージに分かれることはありません。 しかしWALレコードがWALページ境界を跨る場合、継続レコードを用いてすでに分割されていますので、ページ境界で分割することができます。 言い換えると、先頭の主WALレコードとその継続レコードは、別のCopyDataメッセージとして分かれることがありえます。

WALデータ内のすべてのフィールドと上記ヘッダが送信元サーバ用の書式であることに注意してください。 エンディアンやタイムスタンプの書式は受信側が送信元のシステム識別子が自身のpg_controlの内容と一致するかどうかを検証しない限り予測できません。

WAL送信プロセスが(postmasterの停止中に)正常に終了する場合、終了前にCommandCompleteメッセージを送信します。 当然ながら異常終了の場合にはこれは送信されないかもしれません。