今回は、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 (昨日、試したときは、切り替えにもっと時間がかかってましたが...)
上記の流れを図にすると、下記のようになります。