PostgreSQL 9.6: レプリケーションの設定(同期)

この記事は、PostgreSQL 9.6: レプリケーションの設定(非同期)の続きです。

同期レプリケーションモードへの移行

postgresql.conf (マスター側)の書き換え

# sudo vim /etc/postgresql/9.6/cluster1/postgresql.conf
synchronous_standby_names = 'cluster2'
  • synchronous_standby_names には、スレーブ側の recovery.conf (後述)に記載する primary_conninfoapplication_name として指定する。複数の名前を指定する場合はコンマで区切る。

recovery.conf の書き換え

テキストエディタ/var/lib/postgresql/9.6/cluster2/recovery.conf を開き、primary_conninfo に指定された文字列の末尾に application_name=cluster2 を追加する。

このファイルは pg_basebackup コマンドによって生成される(-R オプションを指定した場合)。

ちなみに primary_conninfo に指定される文字列は attr=value の形式の設定値をスペースで連結したもの。初期値は以下のようになっている。

  • user=repl_user
  • password=p@ssw0rd
  • host=127.0.0.1
  • port=54321
  • sslmode=prefer
  • sslcompression=1
  • krbsrvname=postgres

application_name の値は、マスター側の postgresql.conf に記載する synchronous_standby_names の値と一致させる。

recovery.conf には、primary_conninfo の他に standby_moderepl_slot_name という設定項目がある。

standby_mode の値は on とする。repl_slot_name の値は、マスター側で追加したレプリケーションスロットの名前と同じにする。本稿では application_name と同じにしたが、異なっていてもよい。

クラスタの再起動

$ sudo systemctl restart postgresql@9.6-cluster2
$ sudo systemctl restart postgresql@9.6-cluster1

リロードではうまく行かない。

同期レプリケーションの動作確認

マスター側に接続

$ sudo -u postgres psql --port 54321
> \x

レプリケーションの状態

> SELECT * FROM pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 31820
usesysid         | 16384
usename          | repl_user
application_name | cluster2
client_addr      | 127.0.0.1
client_hostname  | 
client_port      | 56424
backend_start    | 2017-04-23 20:33:40.746694+09
backend_xmin     | 
state            | streaming
sent_location    | 0/D002490
write_location   | 0/D002490
flush_location   | 0/D002490
replay_location  | 0/D002490
sync_priority    | 1
sync_state       | sync

application_name 列と sync_state 列をチェック。

データベースを作成してみる

> CREATE DATABASE repl_test2;

しばらく反応がなければ、レプリケーションの設定がうまく行っていない。Ctrl-C を入力してキャンセルする。その結果、

Cancel request sent WARNING: ユーザからの要求により同期レプリケーションの待ち状態をキャンセルしています DETAIL: トランザクションはローカルではすでにコミット済みですが、スタンバイ側にはレプリケーションされていない可能性があります。

のようなメッセージが出て入力プロンプトに戻る。この場合、マスターとスタンバイの間がずれてしまっているので、スタンバイを初めから作りなおす必要がある。

スタンバイ側に接続

$ sudo -u postgres psql --port 54322
> \x

データベース repl_test2 の情報を確認

> \l repl_test2
データベース一覧
-[ RECORD 1 ]-----+------------
名前              | repl_test2
所有者            | postgres
エンコーディング  | UTF8
照合順序          | ja_JP.UTF-8
Ctype(変換演算子) | ja_JP.UTF-8
アクセス権        | 

参考資料