keepalived + ホットスタンバイで障害時でもPostgreSQLを自動継続してみる ホットスタンバイ障害から復旧編

ホットスタンバイに障害が起きた場合の復旧をまとめます。
ホットスタンバイに障害が起きて止まりました。
プライマリーでサービスを提供しています。
そこにホットスタンバイのマシンが用意されました。
というシチュエーションでホットスタンバイの作り直しをしてみます。



上記の状態でサービスを継続していてホットスタンバイはOSだけ入っている
イメージです。


【復旧手順】
1.復旧させるホットスタンバイでPostgreSQLのインストールをします。
参照:http://d.hatena.ne.jp/bose999/20100922/1285087812


2.RSA鍵ファイルの設定をします。
参照:http://d.hatena.ne.jp/bose999/20100924/1285287421

3.ホットスタンバイにkeepalivedを設定します。

# cd $HOME
# yum -y install make kernel kernel-devel rpm-build openssl-devel
# wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz
# tar zxvf keepalived-1.1.20.tar.gz
# cd ./keepalived-1.1.20
# chown -R root:root $HOME/keepalived-1.1.20
# ./configure
# cp $HOME/keepalived-1.1.20.tar.gz /usr/src/redhat/SOURCES/
# rpmbuild -ba ./keepalived.spec
# cd /usr/src/redhat/RPMS/x86_64
# rpm -ivh ./keepalived-1.1.20-5.x86_64.rpm
# vi /etc/keepalived/keepalived.conf
# vi /home/postgres/change_primary.sh
# chown postgres:postgres /home/postgres/change_primary.sh
# chmod 755 /home/postgres/change_primary.sh
# vi /etc/sysconfig/iptables
# /etc/init.d/iptables restart


keepalivedのログについては下記参照。
http://d.hatena.ne.jp/bose999/20100912/1284258023


/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
   }
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 105
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.14.100/24
    }
    notify_master "/home/postgres/change_primary.sh"
}


ホットスタンバイ用IP切り替え後プライマリー化シェル
change_primary.sh

#!/bin/sh
touch /var/lib/pgsql/9.0/data/trigger_file


/etc/sysconfig/iptables
PostgreSQLvrrpを通過させないと行けない。

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p vrrp -m state --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT


4.ホットスタンバイでレプリケーション用のファイルコピーの準備をします。

# rm -rf /var/lib/pgsql/9.0/data
# rm -rf /var/lib/pgsql/9.0/archive


5.プライマリーを停止してスタンバイにファイルをコピーします。

# /etc/init.d/postgresql-9.0 stop
# /etc/init.d/keepalived stop
# scp -r /var/lib/pgsql/9.0/data 192.168.14.102:/var/lib/pgsql/9.0/
# scp -r /var/lib/pgsql/9.0/archive 192.168.14.102:/var/lib/pgsql/9.0/


6.ホットスタンバイのレプリケーションの設定をします。

# vi /var/lib/pgsql/9.0/data/postgresql.conf
# vi /var/lib/pgsql/9.0/data/pg_hba.conf
# vi /var/lib/pgsql/9.0/data/recovery.conf
# chown -R postgres:postgres /var/lib/pgsql/9.0/data
# chown -R postgres:postgres /var/lib/pgsql/9.0/archive


postgresql.conf

hot_standby = on を追加


pg_hba.conf

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
local   all             all                                     md5
host    replication     postgres        192.168.14.101/32       md5
host    all             all             192.168.14.102/32       md5
host    all             all             192.168.11.0/24         md5


recovery.conf

primary_conninfo = 'host=192.168.14.101 port=5432 user=postgres password=postgres'
standby_mode = 'on'
restore_command = 'cp /var/lib/pgsql/9.0/archive/%f %p'
trigger_file = '/var/lib/pgsql/9.0/data/trigger_file'


7.プライマリーを立ち上げます。

# /etc/init.d/postgresql-9.0 start
# /etc/init.d/keepalived start


8.ホットスタンバイでサービスの設定をし、起動します。

# chkconfig --level 345 keepalived on
# chkconfig --list | grep keepalived
keepalived     	0:off	1:off	2:off	3:on	4:on	5:on	6:off
# /etc/init.d/postgresql-9.0 start
# /etc/init.d/keepalived start


以上で復旧完了です。
※5-7の間サービスが停止します。