前回は、PostgreSQL-9.1 のインストールと、非同期レプリケーションの構成までを行いました。今回は、前回までに構成した環境を元に、レプリケーションの状態の確認方法、バージョン 9.1 で拡張された関連ツールや設定、同期構成への変更といった点を見て行きたいと思います。
ストリーミング・レプリケーションの状態ビュー
現在構成されているレプリケーションの状態を確認するための情報は、プライマリ側の pg_stat_replication ビューから得ることができます。
01 | -bash-4.1$ psql -x -p 5432 -c "SELECT * FROM pg_stat_replication" |
02 | -[ RECORD 1 ]----+------------------------------ |
06 | application_name | stby |
07 | client_addr | 127.0.0.1 |
10 | backend_start | 2011-XX-XX 14:55:06.532355+09 |
12 | sent_location | 0/3034BA0 |
13 | write_location | 0/3034BA0 |
14 | flush_location | 0/3034BA0 |
15 | replay_location | 0/30349E8 |
各カラムは、以下を意味します。procpid, usesysid, usename, client_addr, client_hostname, client_port, backend_start については、お馴染みの pg_stat_activity と大差ありませんので説明を省略し、重要なところだけを見て行きます。
application_name |
application_name は本来は、複数のクライアントアプリケーションがデータベースに接続してきた際に、pg_stat_activity ビューなどで、サーバサイドから接続の種別を知ることができるようにするための名前です。ストリーミング・レプリケーション接続の場合には、スタンバイ側の recovery.conf 設定の primary_conninfo パラメータに application_name で指定した名前が表示されます。後述するようにこの名前は、同期でレプリケーションを行うノードを指定する際にも使用されます |
state |
接続しているクライアントの状態を表します。
- startup: ストリーミング接続を確立中です
- backup: バックアップ (pg_basebackup が利用) が進行中です
- catchup: 過去の更新履歴を取得しつつ、最新状態へ追いつく途中です
- streaming: ストリーミング状態に入り、最新の変更を適用しています
|
sent_location, write_location, flush_location, replay_location |
いずれも、WAL ログの順番を意味する LSN (Log Sequence Number) であり、単調増加します。LSN は、WAL レコードが書き出される 64bit の仮想的なアドレス空間上の位置を表し、上位 32bit (論理ログファイル番号) と下位 32bit (バイトオフセット) を "/" で区切った 16 進数で表記されます。sent_location 以外はスタンバイからの申告を元にプライマリが把握している値ですので、スタンバイ側ではその瞬間に、実際にはもっと進んでいる可能性があります。
- sent_location: プライマリが送出済みの位置
- write_location: スタンバイ側でバッファへ書き込み済みの位置
- flush_location: スタンバイ側でディスクへ書き込み済みの位置
- replay_location: スタンバイ側で再生済みの位置
|
sync_priority |
同期レプリケーションノードのプライオリティを表します。
- 1 以上: 同期ノードのプライオリティです。synchronous_standby_names パラメータに名前が挙がっているノードに左から順に、1 からの昇順で割り当てられます
- 0: 非同期ノードのプライオリティは "0" と表示されます
|
sync_state |
現在のレプリケーションが同期・非同期のいずれで行われているかを表します。
- async: 非同期で転送されています
- sync: 同期で転送されています
- potential: 現在は非同期で転送されていますが、より上位のプライオリティを持つ同期ノードとの接続が無くなった場合には、同期に格上げされる可能性があります
|
ストリーミングの進行状況を確認するには、まず state が streaming になっていれば、正常にレプリケーションが進行していると考えられます。そして、プライマリ側で pg_current_xlog_location() で得られる現在のログ位置が flush_location と一致していれば、データは転送され、すでにスタンバイ側のディスクに書き出されているので、万一プライマリのディスクに障害が起きても、スタンバイを昇格させればデータの欠落なしに肩代わりをさせることができることを意味します。
1 | -bash-4.1$ psql -x -p 5432 -c "SELECT * FROM pg_current_xlog_location()" |
2 | -[ RECORD 1 ]------------+---------- |
3 | pg_current_xlog_location | 0/3034BA0 |
現在の書き込み位置をスタンバイの側で確認するには、pg_last_xlog_receive_location() 関数を用います。
1 | -bash-4.1$ psql -x -p 5433 -c "SELECT * FROM pg_last_xlog_receive_location()" |
2 | -[ RECORD 1 ]-----------------+---------- |
3 | pg_last_xlog_receive_location | 0/3034BA0 |