2014年10月21日火曜日

Postgresでストリーミング・レプリケーションの環境を構築する方法

ストリーミング・レプリケーションの構築方法を下記します。
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;
上記を実行して、statestreamingになっていれば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 件のコメント:

コメントを投稿

statistics

Arsip