レプリケーションの諸機能と、同期接続
前回は、PostgreSQL-9.1 のインストールと、非同期レプリケーションの構成までを行いました。今回は、前回までに構成した環境を元に、レプリケーションの状態の確認方法、バージョン 9.1 で拡張された関連ツールや設定、同期構成への変更といった点を見て行きたいと思います。
ストリーミング・レプリケーションの状態ビュー
現在構成されているレプリケーションの状態を確認するための情報は、プライマリ側の pg_stat_replication ビューから得ることができます。
-bash-4.1$ psql -x -p 5432 -c "SELECT * FROM pg_stat_replication" -[ RECORD 1 ]----+------------------------------ procpid | 8515 usesysid | 16384 usename | reprole application_name | stby client_addr | 127.0.0.1 client_hostname | client_port | 59480 backend_start | 2011-XX-XX 14:55:06.532355+09 state | streaming sent_location | 0/3034BA0 write_location | 0/3034BA0 flush_location | 0/3034BA0 replay_location | 0/30349E8 sync_priority | 0 sync_state | async -bash-4.1$
各カラムは、以下を意味します。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 |
接続しているクライアントの状態を表します。
|
sent_location, write_location, flush_location, replay_location | いずれも、WAL ログの順番を意味する LSN (Log Sequence Number) であり、単調増加します。LSN は、WAL レコードが書き出される 64bit の仮想的なアドレス空間上の位置を表し、上位 32bit (論理ログファイル番号) と下位 32bit (バイトオフセット) を "/" で区切った 16 進数で表記されます。sent_location 以外はスタンバイからの申告を元にプライマリが把握している値ですので、スタンバイ側ではその瞬間に、実際にはもっと進んでいる可能性があります。
|
sync_priority |
同期レプリケーションノードのプライオリティを表します。
|
sync_state |
現在のレプリケーションが同期・非同期のいずれで行われているかを表します。
|
ストリーミングの進行状況を確認するには、まず state が streaming になっていれば、正常にレプリケーションが進行していると考えられます。そして、プライマリ側で pg_current_xlog_location() で得られる現在のログ位置が flush_location と一致していれば、データは転送され、すでにスタンバイ側のディスクに書き出されているので、万一プライマリのディスクに障害が起きても、スタンバイを昇格させればデータの欠落なしに肩代わりをさせることができることを意味します。
-bash-4.1$ psql -x -p 5432 -c "SELECT * FROM pg_current_xlog_location()" -[ RECORD 1 ]------------+---------- pg_current_xlog_location | 0/3034BA0 -bash-4.1$
現在の書き込み位置をスタンバイの側で確認するには、pg_last_xlog_receive_location() 関数を用います。
-bash-4.1$ psql -x -p 5433 -c "SELECT * FROM pg_last_xlog_receive_location()" -[ RECORD 1 ]-----------------+---------- pg_last_xlog_receive_location | 0/3034BA0 -bash-4.1$