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
※PostgreSQLとvrrpを通過させないと行けない。
# 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の間サービスが停止します。