postgresql 9.0.0 で標準搭載になったので試した。
- http://developer.postgresql.org/pgdocs/postgres/release-9-0.html
- http://wiki.postgresql.org/wiki/Streaming_Replication
How to Useの項目通りにやればできる。
1. primary serverの設定変更
- postgresql.conf: listen_address を変更して自分のIPで5432 port をlisten
- slave(standby) serverから接続させるために
- pg_hba.conf: replication databaseへtrustで接続許可
- psql -l ではreplicationは出てこないし、接続もできない
2. レプリケーション関連のprimary serverの設定変更
必要に応じて設定。
- wal_level = hot_standby
- standby状態になったときにread-onlyにする
- max_wal_senders = 5
- standbyサーバからの同時接続数?
など。
3. primary server postgresql起動
# /etc/init.d/postgresql start
4. base backupを使って、primary serverのデータをコピー
$ psql -c "SELECT pg_start_backup('label', true)" $ rsync -a ${PGDATA}/ standby:/srv/pgsql/standby/ --exclude postmaster.pid $ psql -c "SELECT pg_stop_backup()"
5. standby server のpostgresql.conf設定
通常時はread-onlyなserverにするので、hot_standby = onに設定。
(primary serverでwal_levelをhot_standbyに設定した場合)
hot_standby = on
6. standby server のrecovery.confを設定
primaryサーバの接続先など。
standby_mode = "on" primary_conninfo = 'host=192.168.0.10 port=5432 user=postgres' trigger_file = '/path_to/trigger'
7. standby server を起動
# /etc/init.d/postgresql
これでとりあえずreplicationができるようになるはず。で、通常時はstandby設定なのでread-onlyになっている。trigger_file をtouchなどで作成すれば 、primaryに昇格して、writableになる。
trigger_fileの作成などはHeartbeatやクラスタソフト側で処理する必要あり。
8. レプリケーションの遅延確認
document読んでないけど、名前からすると、
pg_current_xlog_locatioin: mysql show master statusのposition
pg_last_xlog_receive_location: mysql show slave statusのRead_Master_Log_Pos
pg_last_xlog_replay_location: mysql show slave statusのRelay_Log_Pos
かな? これらが一致していれば同期されている状態。
## primary server $ psql -c "SELECT pg_current_xlog_location()" pg_current_xlog_location -------------------------- 0/F000514 (1 row)
## standby server $ psql -c "select pg_last_xlog_receive_location()" pg_last_xlog_receive_location ------------------------------- 0/F000514 (1 row) $ psql -c "select pg_last_xlog_replay_location()" pg_last_xlog_replay_location ------------------------------ 0/F000514 (1 row)
プロセスの確認
## master
# ps aux | grep 'sender process' postgres 31723 0.0 0.1 43392 2072 ? Ss 16:58 0:00 postgres: wal sender process postgres 10.0.0.2(59952) streaming 0/F000514
## standby
# ps aux | grep 'receiver process' postgres 8533 0.0 0.6 45316 3368 ? Ss 16:58 0:00 postgres: wal receiver process streaming 0/F000514