PostgreSQL:Streaming Replication [1] クイックスタート

(2012.10.30追記)以下の記述は古くなっています。
最新の情報を書籍にまとめたので参照のこと。


なお、原稿のサンプル仕組み設定を公開したので参照のこと。



最も単純な構成でStreaming Replicationをセットアップする。
master、slaveとも同一サーバ上で動かす。ポート番号だけ変えて起動する(master=5432, slave=2345)。


続きはこちら
か、もしくは

マスタ側の準備

postgresql.confの設定

最低限の設定項目を示す。

# これをonにしなければ始まらない。
archive_mode = on

# archive か hot_standby。今回はHotStandbyと併用するので"hot_standby"
wal_level = hot_standby

# PITR用。適当なディレクトリを指定 
archive_command = 'cp -i %p /home/postgres/archives_master/%f'  

# スレーブの最大数。ここでは1。
max_wal_senders = 1

また、スレーブを他サーバからアクセスさせる場合は"listen_addresses"の設定も忘れずに。

listen_addresses = '*'  # 適宜。
pg_hba.confの設定

スレーブからの接続のために、pg_hba.confに以下の行を追加する。 USERはスレーブの実行ユーザを指定する。ここではpostgres。

また、スレーブを別サーバで稼働させる場合は許可するIPアドレスなども適宜変更すること。

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    replication     postgres        127.0.0.1/32            trust
スナップショット

スレーブを構築するために、マスターのスナップショットを取得する。 当然だがマスタは起動しておくこと。

以降、起動したままで作業してよいし、データの更新なども行ってよい。 このあたりの運用性の高さがPostgreSQLの魅力である。

  • バックアップの開始

masterに接続して、次のコマンドを実行する。

template1=# SELECT pg_start_backup('SR SNAPSHOT');
 pg_start_backup 
                                • -
0/4000020 (1 row)
  • データ領域のコピー

masterのデータ領域(ここでは/usr/local/pgsql/master)を、 slave用のデータ領域(ここでは/usr/local/pgsql/slave)にコピーする。

cp -r /usr/local/pgsql/master/ /usr/local/pgsql/slave
  • バックアップの終了

データ領域のコピーが終了したら、以下のコマンドを実行する。

template1=# SELECT pg_stop_backup();
NOTICE:  pg_stop_backup cleanup done, waiting for required WAL segments to be archived
 pg_stop_backup 
                              • -
0/40000D0 (1 row)

最後にアーカイブ領域の内容をコピーする。

# cp -r /home/postgres/archives_master /home/postgres/archives_slave

スレーブ側の準備

postmaster.pidの削除

マスタ側のpostmaster.pidファイルが残っているので削除する。

# rm -f /usr/local/pgsql/slave/postmaster.pid
postgresql.confの編集

適宜、編集する。

# 今回はmasterと同じサーバで稼働させるので、port番号を変える。
port = 2345

# 今回はHotStandByと併用するので
hot_standby = on

# archive か hot_standby。今回はHotStandbyと併用するので"hot_standby"
wal_level = hot_standby

# PITR用。適当なディレクトリを指定 
archive_mode = on
archive_command = 'cp -i %p /home/postgres/archives_slave/%f'   
slave用のアーカイブログ保存ディレクトリ(ここでは/home/postgres/archives_slave)を作成する。
# mkdir /home/postgres/archives_slave
pg_hba.confの編集

pg_hba.confもマスタのコピーなので、適宜編集する。
特にreplication関連の設定は不要なのでコメントアウトしてよい。 理由は、スレーブしかマスタに接続要求しないため。 詳細は別途。

# スレーブ側では不要
## host    replication     postgres     127.0.0.1/32            trust
recovery.confの準備

次にrecovery.confを準備する。 PostgreSQLをインストールしたディレクトリにshareというサブディレクトリがあり、 そこにサンプルファイルrecovery.conf.sampleがあるので、それをコピーして編集する。

# cd /usr/local/pgsql/slave
# cp ../share/recovery.conf.sample recovery.conf

編集が必要な項目を示す。

# recovery.confは全て'でクオートしないとならない。
standby_mode = 'on'

# 
primary_conninfo = 'host=localhost port=5432'

# 必須ではないが、フェールオーバーには必要
trigger_file = '/tmp/trigger'

# PITR用
restore_command = 'cp  /home/postgres/archives_slave/%f %p'
  • standby_mode

"'on'"と "'"でくくること。

  • primary_conninnfo

マスタのサーバアドレスとポート番号を指定する。

  • trigger_file

フェールオーバで、スレーブを書き込み可能にするためのファイルを指定する。 普段は存在せず、なんらかのトラブルでフェールオーバしなければならないときに作成するファイル名を指定。

スレーブの起動

準備が整ったので、あとはスレーブを起動するだけである。

停止

マスタもスレーブも停止や起動ができる。 非常に柔軟な運用が可能である。