PostgreSQL9.6 レプリケーション設定


はじめに

仕事の現場でアプリ開発を一生懸命やっていたら
「PostgreSQLはちゃんとレプリケーション構成にしてあるよね?」
と言われ「え?何それ?」と思った人のためにPostgreSQLのレプリケーション設定手順まとめました。

レプリケーションについて

レプリケーションについて、とても簡単に説明します。

同期/非同期について

同期
マスタDBの更新とスレーブDBの更新の両方が終わって処理完了とします。
非同期
マスタDBの更新が終わったら処理完了とします。スレーブDBの更新結果を待ちません。

スタンバイ/ホットスタンバイについて

スタンバイ
スレーブDBにアクセスできません。
ホットスタンバイ
スレーブDBに対して参照処理を行うことができます。更新処理はできません。

今回は非同期レプリケーションでホットスタンバイの構成を構築します。

PostgreSQLのインストールと初期設定は以下参照
CentOS7にPostgreSQL9.6とJava8とNginx1.10をインストール

マスタDB側の設定

postgresql.confの以下の設定を変更します。

/var/lib/pgsql/9.6/data/postgresql.conf

#外部のホストからアクセスを許可
listen_addresses = '*'

#WALレコードがディスク上に書き込まれるまで待たない。
synchronous_commit = off

#同期スタンバイサーバなし
#synchronous_standby_names = ''

#WALに出力される情報を指定
wal_level = replica

#wal_senderプロセスの最大数
max_wal_senders = 3

# スタンバイ中も参照を可能にする(スレーブの設定)
hot_standby = on

hot_standbyはスレーブの設定ですが、pg_basebackupを実行するとマスタの設定がスレーブにコピーされるため、マスタ側で先に設定しておきます。マスタDBではhot_standbyの設定は無視されます。

PostgreSQLに接続してレプリケーション用のユーザーを作成
psql -U postgres
CREATE ROLE replication_user LOGIN REPLICATION PASSWORD 'xxxxxxxxx';

pg_hba.confにレプリケーションの設定を追加します。
(スレーブのIPアドレス(xxx.xxx.xxx.xxx)からのレプリケーションを許可)

/var/lib/pgsql/9.6/data/pg_hba.conf
host    replication     replication_user        xxx.xxx.xxx.xxx/32           md5

PostgreSQLを再起動
sudo systemctl restart postgresql-9.6

スレーブDB側の設定

PostgreSQLを停止
sudo systemctl stop postgresql-9.6

postgresユーザーになる
sudo su - postgres

既存のデータベースクラスタ(データ保存領域)を削除
rm -rf /var/lib/pgsql/9.6/data/*

マスタDBからベースバックアップを取得(xxx.xxx.xxx.xxxはマスタDBのIPアドレス)
pg_basebackup -h xxx.xxx.xxx.xxx -D ${PGDATA} -R --progress -U replication_user
${PGDATA} 配下(普通は/var/lib/pgsql/9.6/data)に自動でrecovery.confが作成されます。

スレーブからマスタへの昇格はトリガーファイルを使用したいため、以下の設定を追加

recovery.conf
trigger_file = '/tmp/trigger_file'

PostgreSQLを起動
sudo systemctl start postgresql-9.6

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

マスタDB側で以下のSQLを実行
SELECT * FROM pg_stat_replication;
内容については以下のURLを参照
http://www.postgresql.jp/document/9.6/html/monitoring-stats.html#pg-stat-replication-view

後はマスタDBを更新してスレーブDBに反映されているか確認してみてください。

マスタ切り替え

スレーブ側に設定で追加したトリガーファイル(/tmp/trigger_file)を作成します。
スレーブ側が更新できることを確認してください。

スレーブをマスタに昇格させたあと、元のマスタをスレーブにするためには、元のマスタ側のデータベースクラスタを削除し、スレーブDBに対してpg_basebackupコマンドを実行してください。

また、スレーブをスレーブとして再使用する場合は一旦マスタDBを最新データに更新し、スレーブ側でデータベースクラスタの削除とpg_basebackupコマンドを再実行してください。

最後に

アプリ開発の片手間でインフラの作業もよくやったほうではないでしょうか?
こんなに頑張っているのに、お小遣いは月1万円しかもらっていません!!