うまいぼうぶろぐ

linuxとhttpdとperlのメモ

postgresql 9.0.0 のストリーミングレプリケーション

postgresql 9.0.0 で標準搭載になったので試した。

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