この記事は、PostgreSQL 9.6: レプリケーションの設定(非同期)の続きです。
同期レプリケーションモードへの移行
postgresql.conf
(マスター側)の書き換え
# sudo vim /etc/postgresql/9.6/cluster1/postgresql.conf synchronous_standby_names = 'cluster2'
synchronous_standby_names
には、スレーブ側のrecovery.conf
(後述)に記載するprimary_conninfo
のapplication_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_mode
と repl_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 アクセス権 |