その他
    ホーム技術発信DoRubyPostgreSQL8.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で表示された結果と同じであれば成功です。

    以上です。