「ウォームスタンバイ」で教えてエライ人!
ウォームスタンバイが今後必要になるので、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が生成されている。。。
こういった事は想定されてないとか、何か根本的に間違ってるとか、何かする事を忘れてるとか、日頃の行いが悪いとか。。。
誰か教えて〜!><