今回は、Cloud Design Pattern(CDP)の記事になります。
対象は「Floating IPパターン」です。

このパターンの「その他」に下記のような記載があります。

障害検知を行う際は、HeartBeatやNagios、Zabbixといった監視ソフトを利用してもよい。EIPの付け替えはプログラムから実行できるので、監視ソフトと組み合わせれば自動化を行うこともできる。

そこで今回は、Heartbeat(Pacemaker)を利用して自動的にEIPを付け替える方法を試してみました。

すでに、Heartbeat(Pacemaker)に関してはVPC上のCentOS6.2にHeartbeatをインストールし起動(アップデート版)の記事で導入し、EIPを付け替えるPHPスクリプトも次のように用意はしています。

後はPacemakerのリソース管理で上記のスクリプトを利用して、アクティブサーバに障害が発生した場合にEIPをスタンバイサーバに付け替えるように設定するだけです。

そして、PacemakerによるEIPの付け替え設定は、LSBにて行うことにします。
これは、EIPを付け替える /etc/init.d/eip のような起動スクリプトを用意し、モニタリングやフェイルオーバー時の起動/停止をPacemakerがこの起動スクリプトを利用するように設定する方法になります。

上記より、/etc/init.d/eipを下記のように用意しました。
スクリプト内に記載されている /opt/aws/bin/associate-eip は、上記ブログ(EIPを付け替えるPHPスクリプト)で紹介したものとなります。

#!/bin/bash
#
# eip        Associate EIP.
#
# chkconfig: 2345 99 10
# description: Associate EIP

# Source function library.
. /etc/init.d/functions

prog=eip
lock=/var/lock/subsys/$prog
log=/opt/aws/log/error.log

# Source config
if [ -f /etc/sysconfig/$prog ] ; then
    . /etc/sysconfig/$prog
fi

case "$1" in
    start)
        echo `date +"%Y-%m-%d %T"` "begin associate-eip" >> $log
        touch $lock
        /opt/aws/bin/associate-eip >> $log 2>&1
        exit $?
        ;;
    stop)
        echo `date +"%Y-%m-%d %T"` "end   associate-eip" >> $log
        rm -f $lock
        exit $?
        ;;
    status)
        if [ -f $lock ]
        then
            exit 0
        else
            exit 3
        fi
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        exit 1
esac

注意点として、上記のリターンコードはIs This init Script LSB Compatible?に準じている必要があります。
特に注意するべき点は、サービスが停止状態でstatusを実行した時に、リターンコードを3にする点だと思います。

そして最後に、Pacemakerへの設定になります。

# crm configure property no-quorum-policy="ignore" stonith-enabled="false"
# crm configure rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"
# crm configure primitive eip lsb:eip

※resource-stickiness=”INFINITY”で自動フェイルバックしないようにしています。

それでは実際にフェイルオーバーの確認をしてみます。

はじめの状態は下記の通り、ha-bがアクティブで、

============
Last updated: Mon Apr 30 02:07:33 2012
Stack: Heartbeat
Current DC: ha-b (ea5894a8-4664-3723-dc36-77d7f1e1ad08) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
1 Resources configured.
============

Online: [ ha-a ha-b ]

eip     (lsb:eip): Started ha-b

EIPもha-bに振られています。

次にha-bのHeartbeatを停止します。

# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.

すると、ha-bがオフラインになり、ha-bがアクティブになることがわかります。

============
Last updated: Mon Apr 30 02:12:08 2012
Stack: Heartbeat
Current DC: ha-a (7974d41a-897b-ee90-0770-7ec9e990db35) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
1 Resources configured.
============

Online: [ ha-a ]
OFFLINE: [ ha-b ]

eip     (lsb:eip): Started ha-a

EIPもha-aの方に付け替えられています。

フェイルオーバー前後のPing結果は下記のような感じです。

$ ping 54.248.108.190
PING 54.248.108.190 (54.248.108.190): 56 data bytes
...
64 bytes from 54.248.108.190: icmp_seq=8 ttl=50 time=5.862 ms
64 bytes from 54.248.108.190: icmp_seq=9 ttl=50 time=5.040 ms
64 bytes from 54.248.108.190: icmp_seq=10 ttl=50 time=5.072 ms
Request timeout for icmp_seq 11
64 bytes from 54.248.108.190: icmp_seq=12 ttl=50 time=5.435 ms
64 bytes from 54.248.108.190: icmp_seq=13 ttl=50 time=7.674 ms
64 bytes from 54.248.108.190: icmp_seq=14 ttl=50 time=4.928 ms
64 bytes from 54.248.108.190: icmp_seq=15 ttl=50 time=4.796 ms
64 bytes from 54.248.108.190: icmp_seq=16 ttl=50 time=5.321 ms
64 bytes from 54.248.108.190: icmp_seq=17 ttl=50 time=5.048 ms
64 bytes from 54.248.108.190: icmp_seq=18 ttl=50 time=4.873 ms
64 bytes from 54.248.108.190: icmp_seq=19 ttl=50 time=5.381 ms
Request timeout for icmp_seq 20
Request timeout for icmp_seq 21
Request timeout for icmp_seq 22
64 bytes from 54.248.108.190: icmp_seq=23 ttl=50 time=6.571 ms
64 bytes from 54.248.108.190: icmp_seq=24 ttl=50 time=6.282 ms
64 bytes from 54.248.108.190: icmp_seq=25 ttl=50 time=6.488 ms
(昨日、試したときは、切り替えにもっと時間がかかってましたが...)

上記の流れを図にすると、下記のようになります。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら