Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

「ウォームスタンバイ」で教えてエライ人!

ウォームスタンバイが今後必要になるので、pg_standbyを使った手順をザザッと検証(まだ途中)。環境は

  • CentOS4.6 on VMwarePlayer
  • PostgreSQL8.3.1(rpm

のような感じ。ざっとした手順は以下の通り。

1. PostgreSQL本家からRHEL4用rpmを取得し、インストール

$ sudo rpm -ivh postgresql-8.3.1-1PGDG.rhel4.i686.rpm \
> postgresql-server-8.3.1-1PGDG.rhel4.i686.rpm \
> postgresql-libs-8.3.1-1PGDG.rhel4.i686.rpm \
> postgresql-devel-8.3.1-1PGDG.rhel4.i686.rpm \
> postgresql-contrib-8.3.1-1PGDG.rhel4.i686.rpm
$ sudo /sbin/service postgresql initdb
$ sudo /sbin/service postgresql start
$ 

2. アクティブ側DBを作成

$ su -
# su - postgres
$ createuser standby
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
$ createdb -O standby standby
$ echo "archive_mode = on" >> /var/lib/pgsql/data/postgresql.conf
$ echo "archive_command = 'cp -i %p /var/lib/pgsql/backups/%f </dev/null'" >> /var/lib/pgsql/data/postgresql.conf
$ echo "archive_timeout = 600" >> /var/lib/pgsql/data/postgresql.conf
$ su -
# /sbin/service postgresql restart
# exit
$ 

3. 適当にテーブル作成

$ psql -U standby -c " create table test01 (col01 integer not null PRIMARY KEY, col02 text);" standby
$ 

4. スタンバイ用バックアップ取得

$ psql -c "select pg_switch_xlog();"
$ psql -c "select pg_start_backup('Label')" standby
$ cd data
$ tar zcf /var/lib/pgsql/backups/data.tgz *
$ psql -c "select pg_stop_backup()" standby
$ cd ../
$ 

5. スタンバイDBを作成しDB起動。psqlで接続できない事も確認

$ su -
# ln -s /etc/rc.d/init.d/postgresql /etc/rc.d/init.d/postgresql.5433
# vi /etc/sysconfig/pgsql/postgresql.5433
# cat /etc/sysconfig/pgsql/postgresql.5433
PGDATA=/var/lib/pgsql/data_standby
PGPORT=5433
# su - postgres -c "/usr/bin/initdb -D /var/lib/pgsql/data_standby"
# su - postgres
$ mkdir data_standby
$ chmod 700 data_standby
$ tar zxf /var/lib/pgsql/backups/data.tgz -C /var/lib/pgsql/data_standby/
$ rm -r data_standby/pg_xlog
$ mkdir -p data_standby/pg_xlog/archive_status/
$ rm data_standby/postmaster.pid
$ perl -i -p -s -e "s/^archive_/#archive_/g" data_standby/postgresql.conf
$ test -f data_standby/recovery.done && rm data_standby/recovery.done
$ echo "restore_command = 'pg_standby -l -d -s 2 -t /tmp/pgsql.trigger.5433 /var/lib/pgsql/backups %f %p %r 2>>/var/lib/pgsql/standby.log'" > data_standby/recovery.conf
$ exit
# service postgresql.5433 start
# exit
$ psql -U standby -p 5433 standby
psql: FATAL:  the database system is starting up
$ 

6. アクティブ側DBに適当にinsert

 $ for i in 1 2 3 4 5 6 7 8 9; do for j in 0 1 2 3 4 5 6 7 8 9; do psql -U standby -p 5432 standby -c "insert into test01 values (6$i$j, 'test');"; sleep 1; done; done;

7. insertしている間に別ターミナルでログをswitch

 $ psql -c "select pg_switch_xlog();"

8. /var/lib/pgsql/standby.logに更新されたっぽいログが出るか確認

WAL file not present yet. Checking for trigger file...
WAL file not present yet. Checking for trigger file...
running restore         : OK

Trigger file            : /tmp/pgsql.trigger.5433
Waiting for WAL file    : 000000010000000000000049
WAL file path           : /var/lib/pgsql/backups/000000010000000000000049
Restoring to...         : pg_xlog/RECOVERYXLOG
Sleep interval          : 2 seconds
Max wait interval       : 0 forever
Command for restore     : ln -s -f "/var/lib/pgsql/backups/000000010000000000000049" "pg_xlog/RECOVERYXLOG"
Keep archive history    : 000000010000000000000045 and later
WAL file not present yet. Checking for trigger file...
WAL file not present yet. Checking for trigger file...

9. スタンバイ側をしばらく止めたあとに起動すると、ちゃんとリカバるかどうかを確認

$ su -
# /sbin/service postgresql.5433 stop
(しばらくほっとく)
# /sbin/service postgresql.5433 start
# 
(standby.logを確認してガシガシ更新してるっぽいかどうかを確認)
    • これは特に問題なかった

10. フェイルオーバーさせてみる。今度はpsqlで接続できるし、recovery.confがrecovery.doneになっている事を確認

$ touch /tmp/pgsql.trigger.5433
$ psql -U standby -p 5433 standby
Welcome to psql 8.3.1, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

standby=> \q
$ ls data_standby/recovery.*
data_standby/recovery.done
$

ここまでは、PostgreSQLのマニュアルとかにあるとおり。


で、ここからが本題(前置き長い)。

このあと、

1. スタンバイ側を停止
2. recovery.doneをrecovery.confに変更
3. スタンバイ側を起動

すると、

Trigger file            : /tmp/pgsql.trigger.5433
Waiting for WAL file    : 00000002.history
WAL file path           : /var/lib/pgsql/backups/00000002.history
Restoring to...         : pg_xlog/RECOVERYHISTORY
Sleep interval          : 2 seconds
Max wait interval       : 0 forever
Command for restore     : ln -s -f "/var/lib/pgsql/backups/00000002.history" "pg_xlog/RECOVERYHISTORY"
Keep archive history    : 00000002000000000000005C and later
running restore         : OK
Trigger file            : /tmp/pgsql.trigger.5433
Waiting for WAL file    : 00000002000000000000005C
WAL file path           : /var/lib/pgsql/backups/00000002000000000000005C
Restoring to...         : pg_xlog/RECOVERYXLOG
Sleep interval          : 2 seconds
Max wait interval       : 0 forever
Command for restore     : ln -s -f "/var/lib/pgsql/backups/00000002000000000000005C" "pg_xlog/RECOVERYXLOG"
Keep archive history    : 00000002000000000000005C and later
WAL file not present yet. Checking for trigger file...
WAL file not present yet. Checking for trigger file...

となり、対象とするWALファイル名が「00000001...」から「00000002...」になってしまい、リカバリが継続されないという状態。。。アクティブ側からは当然「00000001...」というWALが生成されている。。。

こういった事は想定されてないとか、何か根本的に間違ってるとか、何かする事を忘れてるとか、日頃の行いが悪いとか。。。

誰か教えて〜!><