無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

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

IDENTIFY_SYSTEM

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

systemid

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

timeline

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

xlogpos

現在のxlogの書き出し位置です。 ストリーミングを開始できるトランザクションログの既知の位置を得る際に有用です。

TIMELINE_HISTORY tli

サーバに時系列(timeline)に対する時系列履歴ファイル tli を送るよう要求する。

filename

例えば00000002.historyのような、時系列履歴ファイルの名前。

content

時系列履歴ファイルの内容。

START_REPLICATION XXX/XXX TIMELINE tli

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

もしクライアントが最新ではないけれどもサーバの履歴の一部である時系列を要求するとしたら、サーバは要求された開始点からサーバが他の時系列に切り替わる時点まで、その時系列の全てのWALをストリームします。 もしクライアントがある古い時系列の正確な終端のストリーミングを要求した場合、サーバはCOPYモードに移行せず即座にCommandCompleteで応答します。

最新でない時系列上の全てのWALのストリーミングを終えた後、サーバはCOPYモードを抜ける事によりストリーミングを終了します。クライアントは同様COPYモードを抜けることでこのことを認識すると、サーバはこのサーバの履歴における次の時系列を示す一つの行と二つの列からなる結果セットを送信します。 最初の列は次の時系列のIDで、第二の列は切り替えが起こるXLOGの位置です。 通常、切り替え位置はストリームされたWALの最終です。しかし、それ自身昇格する以前に再生されていない古い時系列から何らかのWALをサーバが送出するきわどい状況があります。 最終的にサーバはCommandCompleteメッセージを送出し、新規のコマンドを受け付ける準備が整います。

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

XLogData (B)

Byte1('w')

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

Int64

このメッセージ内のWALの開始点。

Int64

サーバ上の現在のWAL終了点。

Int64

送信時点のサーバシステム時刻で、2000-01-01の午前零時からのマイクロ秒。

Byte n

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

単一のWALレコードは決して二つのXLogDataメッセージに渡って分割されることはありません。WALレコードがWALページの境界を跨ぐとき、そしてその結果、連続レコードにより既に分割されていれば、ページ境界において分割される事は可能です。 言い換えれば、最初の中心的なWALレコードとその連続レコードは別個のXLogDataメッセージで送信できます。

プライマリキープアライブメッセージ(B)

Byte1('k')

このメッセージを送信元キープアライブとして識別します。

Int64

サーバ上のWALの現時点の終端。

Int64

送信時点のサーバシステム時刻で、2000-01-01の午前零時からのマイクロ秒。

Byte1

1は時間切れ切断を避けるためクライアントはこのメッセージに対し出来うる限り早急に返答しなければなりません。それ以外は0です。

受信の手順は、以下のメッセージ形式の一つ(CopyDataメッセージのペイロードでも)によりいつでも送出側に返事を返すことができます。

スタンバイ状態の更新(F)

Byte1('r')

メッセージを受信側の状態更新として識別します。

Int64

スタンバイにおいて受信しディスクに書き込まれた最終WALバイト+1の場所。

Int64

スタンバイにおいてディスクに吐き出された最終WALバイト+1の場所。

Int64

スタンバイに適用される最後のWALバイト+1の場所。

Int64

送信時点のクライアントシステム時刻で、2000-01-01の午前零時からのマイクロ秒。

Byte1

1であればクライアントはサーバに対しこのメッセージにすぐさま回答するよう要求します。 これは接続が今でも問題がないかを検査するため、サーバをpingするのに使用することもできます。

ホットスタンバイフィードバックメッセージ(F)

Byte1('h')

メッセージをホットスタンバイのフィードバックメッセージとして識別します。

Int64

送信時点のクライアントシステム時刻で、2000-01-01の午前零時からのマイクロ秒。

Int32

スタンバイの現在のxminです。 この接続でホットスタンバイはもはや送られないという通知をスタンバイが送信すれば、これは0かもしれません。後に非ゼロのメッセージがフィードバック機構を再開始することがあります。

Int32

スタンバイの現在のエポックです。

BASE_BACKUP [ LABEL 'label' ] [ PROGRESS ] [ FAST ] [ WAL ] [ NOWAIT ]

サーバにベースバックアップのストリーミングを始めるよう指示します。 システムはバックアップが開始される前に自動的にバックアップモードになり、バックアップが完了した時に取り出されます。 以下のオプションを受け付けることができます。

LABEL 'label'

バックアップのラベルを設定します。 指定がない場合、 base backup というバックアップラベルが使用されます。 ラベルについての引用符付け規則は、 standard_conforming_strings を有効にした場合の標準SQLの文字列の規則と同じです。

PROGRESS

進行状況の報告を生成するために必要な情報を要求します。 これは、ストリームが完了するまでにどのくらいかかるかを計算するために使用することができる、各テーブル空間のヘッダ内の概算容量を返送します。 これは、転送を始める前のすべてのファイルサイズを1度数え上げることで計算されます。 これ自体が性能に与える悪影響があるかもしれません。 特に最初のデータがストリームされるまでにより多くの時間がかかる可能性があります。 データベースファイルはバックアップの間変更される可能性がありますので、容量は概算に過ぎず、概算時と実ファイルを送信するまでの間に増減される可能性があります。

FAST

高速チェックポイントを要求します。

WAL

バックアップ内に必要なWALセグメントを含めます。 ベースディレクトリtarファイルの pg_xlog ディレクトリにある、バックアップの開始から終了までのすべてのファイルが含まれます。

NOWAIT

デフォルトでは、バックアップは必要な最終xlogセグメントがアーカイブされるまで待機します。 ログアーカイブが有効でない場合は警告が発せられます。 NOWAIT により、必要なログが利用できるようになったことを確認することをクライアント側の責任として、この待機や警告が無効になります。

バックアップを開始する時、サーバはまず2つの通常の結果セットを送信し、続けて1つ以上のCopyResponse結果を送信します。

最初の通常の結果セットには、二つの列を持つ単一の行としてのバックアップの開始位置が含まれます。 最初の列はXLogRecPtr書式で与えられる開始位置が含まれ、第二の列には対応する時系列IDが含まれます。

2番目の通常の結果セットには各テーブル空間に付き1行を持ちます。 この行のフィールドは以下の通りです。

spcoid

テーブル空間のoidです。 ベースディレクトリの場合は NULL です。

spclocation

テーブル空間ディレクトリのフルパスです。 ベースディレクトリの場合は NULL です。

size

進行状況報告が要求された場合は、テーブル空間の概算容量です。 要求されていない場合は NULL です。

2番目の通常の結果セットの後、1つ以上のCopyResponse結果が送信されます。 1つはPGDATA用、 pg_default pg_global 以外の追加のテーブル空間ごとに1つ送信されます。 CopyResponse結果内のデータは、テーブル空間の内容のtar形式(POSIX 1003.1-2008標準で規定された "ustar交換形式" に従う)ダンプです。 ただし標準で規定された最後の2つのゼロブロックは省略されています。 このtarデータが終わった後、開始位置と同一の形式で、バックアップのWAL終了位置を含む、最終の通常結果セットが送信されます。

データディレクトリと各テーブル空間のtarアーカイブには、そのディレクトリ内のファイルが PostgreSQL ファイルかそのディレクトリに追加された他のファイルかに関係なく、すべて含まれます。 以下に除かれるファイルを示します。

  • postmaster.pid

  • postmaster.opts

  • サブディレクトリを含む pg_xlog 。 バックアップがwalファイルを含めて実行される場合、合成された版の pg_xlog が含まれます。 これにはバックアップが動作するために必要なファイルのみが含まれ、残りの内容は含まれません。

サーバ上の基盤となるファイルシステムがサポートする場合、所有者、グループ、ファイルのモードが設定されます。

すべてのテーブル空間が送信された後、最終の通常の結果セットが送信されます。 この結果セットには、単一行の単一列という形でXLogRecPtr書式のバックアップの終了位置が含まれます。


powered by SEO.CUG.NET