知人の会社の顧客管理システムのDBをVM上のWindowsクライアントで稼働しているのですがたまたまフリーズして知人から連絡が入りました。
普段夜間処理でバックアップを取っているのですが、有事の際は最大1日分リカバリできないことになるのでDBクライアントをもう一台立ててレプリケーションを実装することにしました。
まずマスタサーバーとなる現行DBの設定ファイル( postgresql.conf )の設定を変更します。
WRITE-AHEAD LOG の項目にある wal_level を replica に変更します。
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
wal_level = replica
次に REPLICATION 項目にある max_wal_senders max_replication_slots synchronous_standby_names の3つを変更します。
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
max_wal_senders = 5
max_replication_slots = 10
synchronous_standby_names = '*'
マスタサーバー側はこれで設定完了です。設定を読み込ますためサービスを再起動します。
次にスタンバイサーバー側の設定を行います。
同バージョンのPostgreSQLをインストールしてサービスを止め、DATAディレクトリ配下のデータを削除します。
次にスタンバイサーバーのbin配下にある pg_basebackup.exe を使用してマスタサーバーのデータをコピーします。
pg_basebackup.exe -h 192.168.1.*** -p 5432 -U postgres -D C:\PostgreSQL\data -R -P
上記のようにコマンドを実行すると data ディレクトリ配下にマスタサーバーのデータがコピーされます。
コピーが終わったらスタンバイサーバーの設定ファイル postgresql.conf をスタンバイ用に編集します。
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
#max_wal_senders = 5
#max_replication_slots = 10
#synchronous_standby_names = '*'
hot_standby = on
次に postgresql.conf にマスタサーバーへの接続情報を primary_conninfo に記載します。
primary_conninfo = 'user=接続ユーザー名 password=パスワード channel_binding=prefer host=マスタサーバーIP port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
編集が完了したらサービスを起動します。
以上でレプリケーションの設定は完了です。
マスタサーバー側で下記SQLを実行することでレプリケーションの状況がわかります。
select * from pg_stat_replication;
:
state = streaming
sync_state = sync
state = streaming になってれば同期している状態です。
スタンバイ側から1時間毎にバックアップを取る等もしておこうか思案中です。