ホーム DoRuby PostgreSQL8.3でウォームスタンバイの設定

PostgreSQL8.3でウォームスタンバイの設定

この記事はアピリッツの技術ブログ「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で表示された結果と同じであれば成功です。

以上です。

記事を共有

最近人気な記事