PostgreSQL13でレプリケーション
PostgreSQL13でレプリケーション設定する方法です。
レプリケーションすることで本番DBのバックアップを取得し
物理障害に備えたり、負荷の高い問い合わせをスタンバイ側に分散したりできます。
本記事は検証用のため、最低限の設定で紹介しています。
検証環境
Miracle Linux 9.2
PostgreSQL 13
プライマリサーバ(マスタ)のIPアドレス:192.168.11.1
レプリケーション先サーバ(スタンバイ)のIPアドレス:192.168.11.2
PostgreSQL標準インストール済み
PG_DATA = /var/lib/pgsql
設定方法
1.マスタDBで初期作業
1.データベースクラスタ作成
initdb --encoding=UTF8 --no-locale
2.postgresql.confの設定
レプリケーション側から接続許可する
vi /var/lib/pgsql/data/postgresql.conf
# 接続元をすべて許可。 本来はIP固定などが良いがテスト
listen_addresses = '192.168.11.2'
3.pg_hba.confの設定
以下の行を追加。ユーザ名はrep_userとして許可しています
vi /var/lib/pgsql/data/pg_hba.conf
#レプリケーション先サーバの許可を指定する。
host replication rep_user 192.168.11.2/32 md5
4.データベース起動
pg_ctl start
5.データベース接続
psql
6.テスト用にテーブル作成します
CREATE TABLE t_emp ( emp_no integer, emp_name nchar(30), coment nchar(1000) );
7.続いてレプリケーション用ユーザ作成します
CREATE ROLE rep_user LOGIN REPLICATION PASSWORD 'rep_user';
2,スタンバイDBで初期作業
1.既存のデータベースクラスタを削除する。※なければ不要
rm -rf /var/lib/pgsql/data
2.マスタDBからデータベースクラスタのバックアップを取得する
レプリケーション用ユーザで接続します
pg_basebackup -R -h 192.168.11.1 -U rep_user -D /var/lib/pgsql/data -P
3.データベース起動
pg_ctl start
マスタDBでレプリケーション設定をする
1.DB停止
pg_ctl stop
2.postgresql.confの設定
レプリケーション用設定を行います
vi /var/lib/pgsql/data/postgresql.conf
# WALスタンバイサーバからの接続を許可するにはreplica以上にする
wal_level = replica
#トランザクションのコミットがクライアントに成功の報告を返す前に、WALレコードがディスク上に書き込まれるまで待つかどうか #synchronous_commit = on
synchronous_commit = on
# クライアントからの同時接続を受ける接続最大値を設定
max_wal_senders = 10
# サーバが使用できるレプリケーションスロットの最大数を指定
max_replication_slots = 10
# 同期レプリケーションをサポート可能なスタンバイサーバのリストを指定
synchronous_standby_names = '*'
3.DB起動
pg_ctl start
レプリケーション側の設定
1.DB停止
pg_ctl stop
2.スタンバイ用のファイル作成
このファイルが存在する場合にスタンバイで動作する
touch /var/lib/pgsql/data/standby.signal
3.postgresql.confの設定
vi /var/lib/pgsql/data/postgresql.conf
# スタンバイサーバがプライマリサーバに接続するための接続文字列を指定
primary_conninfo = 'host=192.168.11.116 port=5432 user=rep_user application_name=node01'
# ホットスタンバイを有効にする
hot_standby = on
4.DB起動
pg_ctl start
以上で設定は完了です。
動作確認
では、動作確認します。
1.マスタDB作業
テストのため、データをインサートします
insert into t_emp values(1,'日本 太郎');
2.スタンバイで確認
マスタDBでインサートしたデータが登録されているか確認します
スタンバイ側でセレクトを実行します
select * from t_emp;
postgres=# select * from t_emp;
emp_no | emp_name | coment
--------+-------------------------------------+--------
1 | 日本 太郎 |
(1 行)
正常に参照できました。