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_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_userpassword=p@ssw0rdhost=127.0.0.1port=54321sslmode=prefersslcompression=1krbsrvname=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 アクセス権 |