レプリケーションの諸機能と、同期接続

2011年10月27日(木)
那賀 樹一郎(なか きいちろう)

前回は、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

接続しているクライアントの状態を表します。

  • 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 と一致していれば、データは転送され、すでにスタンバイ側のディスクに書き出されているので、万一プライマリのディスクに障害が起きても、スタンバイを昇格させればデータの欠落なしに肩代わりをさせることができることを意味します。

-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$
著者
那賀 樹一郎(なか きいちろう)

サイオステクノロジー株式会社にて、PostgreSQL/Postgres Plus の製品担当として、サポートサービス、コンサルティング、トレーニング等を行う。Linux ディストリビューションベンダーで培った、OSS プロダクトのソースコードレベルでのソフトウェア解析技術を生かして業務にあたる。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています