この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
どうもメガネです。5回目です。
今回はPostgreSQLでのウォームスタンバイの設定を行います。
PostgreSQL8.3からウォームスタンバイの設定が簡単になったので紹介します。
今回は1台のマシンで2つのデータベースインスタンスを作成して環境を作って行きます。
$はPostgreSQLのスーパーユーザで実行してください。
まずpg_standbyをインストールします。
$ cd /usr/local/src/postgresql-8.3.0/contrib/pg_standby
$ make
$ make install
次に/tmpディレクトリにdb1(マスターDB)とdb2(バックアップDB)というインスタンスを作成します。db2はdb1のコピーを使うのでここでは作成しません。
$ cd /tmp
$ initdb –n-locale db1
次にアーカイブログを格納するためのディレクトリを作成します。
$ mkdir archive1
$ mkdir archive2
そしてdb1/postgresql.confに以下の3行を追加します。
$vi /tmp/db1/postgresql.conf
archive_mode = on
archive_command = ‘cp %p /tmp/archive1/%f’
archive_timeout = 10
ここではarchive_commandとしてcpをしていますが異なるマシンでウォームスタンバイを構成する場合scpやmountを使ってバックアップDBから参照場所にアーカイブログを出力する必要があります。
主系の起動
$ pg_ctl start -D /tmp/db1
主系の完全バックアップを作成
$ psql -c “select pg_start_backup(‘backup’)” template1
$ cp -pR db1 db2
$ psql -c “select pg_stop_backup()” template1
バックアップDBのpostgresql.confの設定
$ vi /tmp/db2/postgresql.conf
archive_mode = on
archive_command = ‘cp %p /tmp/archive2/%f’
archive_timeout = 10
port = 5433
db2の中からpostmaster.pidとpg_xlogの中を消す。
$ rm db2/postmaster.pid
$ rm db2/pg_xlog/*
rm: db2/pg_xlog/archive_status: is a directory
$ rm db2/pg_xlog/archive_status/*
バックアップDBのrecovery.confを設定
restore_command = ‘pg_standby -l -t /tmp/trigger /tmp/archive1 %f %p %r’
バックアップDBの起動
$ pg_ctl start -D /tmp/db2
$ psql -p5433
psql: FATAL: the database system is stating up
という表示されるはずです。
リカバリーの実行
db1で実行
$ createdb testdb
$ psql testdb
testdb=# create table test(t timestamp);
CREATE TBALE
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# select * from test;
DB2で以下のようにアーカイブログがリストアされたメッセージが表示されます。
LOG: restored log file “0000000 10000000000000000C” from archive
LOG: restored log file “0000000 10000000000000000D” from archive
LOG: restored log file “0000000 10000000000000000E” from archive
LOG: restored log file “0000000 10000000000000000F” from archive
$ pg_ctl -D db1 stop
$ cd /tmp
$ touch trigger # 今回は手動でファイルを作成しましたがdb1を常に監視しているシェルスクリプトを作成してdb1の反応がなくなった瞬間にtriggerを作成すれば自動で切り替えることができます。
DB2が起動するはずです。これでリカバリは完了しているはずです。最後にきちんと同期がとれていることを確認します。
DB2で実行
$ psql -p 5433 testdb
testdb=# select * from test;
DB1で表示された結果と同じであれば成功です。
以上です。