postgresのサーバーはそれぞれ以下と仮定します。
master 10.0.4.10
slave 10.0.4.11
マスターの設定
replicatino用のuser 生成
userの作成は任意ですが、今回 repl_userを作成しました。CREATE ROLE repl_user LOGIN REPLICATION PASSWORD 'repl_user_password';
一般ユーザーに対して、REPLICATION権限を与えています。 ※ repl_user_passwordは適宜設定してください。
pg_hba.confの設定
以下のレプリケーション用の設定を追加する。slaveからmasterにアクセスできるように接続設定をします。
host replication repl_user 10.0.4.11/32 md5
シンタックスhost database user address auth-method
host : TCP/IPを使用した接続 database : 仮想データベースと考えてreplicationを指定
user:アクセスするuser
address : slaveのアドレス
auth-method : md5 認証時にMD5暗号化パスワードを要求
pg_hba.confファイルについてはこちら
postgresql.confの設定
postgresql.confを以下のように編集する。wal_level = hot_standby
max_wal_sender = 2 # standby dbの数+1
# アーカイブ使用時
archive_mode = on
archive_command = 'cp "%p" /pgdata/archive/"%f"'
WALを利用して、/pgdata/archive/配下に配置することを想定しています。 ただし、このままでは、WALアーカイブがたまる一方になってしまうため、置き場のディスク容量不足を避けるため、十分に古いWALアーカイブを定期的に削除する必要があります。
WAL置き場のディレクトリも事前に作成しておきます。
mkdir /pgdata/archive
chown -R postgres:postgres /pgdata/archive
アクセスするユーザーグループはそれぞれ、postgresとしています。postgres 再起動
上記までの設定が終わったらpostgresを再起動/etc/init.d/postgresql restart
その他
ダンプ
念のため、masterのbumpを取っておくpg_dump -U postgres -Fc db_name > /pgdata/db_name_$date.dump
リストア
と、いざという時に、そのリストアの方法dropdb db_name
pg_restore -C -d db_name /pgdata/db_name_$date.dump
スレーブの設定
DBの停止
もし、DBが動いていたら、DBを一旦停止します。/etc/init.d/postgresql stop
既存dataファイルの削除
もし、postgresのデータが存在する場合、一度、全て削除しておく。cd /pgdata
rm -rf *
base backupの実行
以下を実行する場合、master側の/pgdata配下がpostgres権限である必要があります。pg_basebackup -h 10.0.4.10 -p 5432 -U repl_user -D /pgdata --xlog --checkpoint=fast --progress
chown postgres:postgres -R /pgdata/
chmod 700 -R /pgdata/
-h : マスターのIPを指定 -D : postgres用のデータの配置場所を指定
postgresql.confの設定
postgresql.confを以下のように編集する。wal_level = hot_standby
standby_mode = on
recovery.confの設定
# standbyを有効化
standby_mode = 'on'
# masterを指定
primary_conninfo = 'host=10.0.4.10 port=5432 user=repl_user password=repl_user_password'
restore_command = 'cp /pgdata/archive/%f %p'
archive_cleanup_command = 'pg_archivecleanup /pgdata/archive %r'
postgresのデータ置き場の権限を変更
chown postgres:postgres -R /pgdata/
chmod 700 -R /pgdata/
postgres 再起動
上記までの設定が終わったらpostgresを再起動/etc/init.d/postgresql restart
起動確認
master側
SELECT * FROM pg_stat_replication;
上記を実行して、stateが streamingになっていればOKその他の stateは以下です。
- startup : 接続の確立中
- backup : pg_basebackup によるバックアップの実施中
- catchup : 過去の更新を反映中
- streaming : 更新をリアルタイムに反映中
slave側
SELECT pg_last_xact_replay_timestamp();
上記を実行すると、処理が行われた時刻を取得することができます。フェールオーバの方法
もし、masterに障害が発生して、フェールオーバーしたい時は、pg_ctl promoteを実行することで、recovery.confを変更して、レプリケーションを切り離してくれます。
su - postgres -c "/usr/bin/pg_ctl promote -D /pgdata
後は、アプリケーションのmasterに向いている接続をslaveに変更すれば再稼働可能です。
0 件のコメント:
コメントを投稿