今回は、先日書籍(Amazon Web Servicesクラウドデザインパターン設計ガイド)が発売された
Cloud Design Pattern(CDP)の記事になります。
今回の対象は「High Availability NATパターン」(Incubator & 未完成)です。
上記をCentOS6上でCorosyncとPacemaker、そしてPython版コマンドラインツールで構築してみました。
※上記のVPC/EC2/セキュリティグループ等の設定は適切に行われているものとします。
○AWS(EC2)とiptablesの設定
下記を参照下さい
次のようになっていれば、問題ありません。
# iptables --list -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
○corosyncとpacemakerの導入と設定
下記を参照下さい。
次のようになっていれば、問題ありません。
# crm_mon
============
Last updated: Mon Jan 28 18:21:56 2013
Last change: Mon Jan 28 18:20:39 2013 via crmd on ip-10-10-8-122
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ ip-10-10-9-111 ip-10-10-8-122 ]
○iptablesのモニタリングとフェイルオーバーの設定
下記を参照下さい。
次のようになっていれば、問題ありません。
# crm_mon
============
Last updated: Mon Jan 28 18:24:36 2013
Last change: Mon Jan 28 18:24:34 2013 via cibadmin on ip-10-10-8-122
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ ip-10-10-9-111 ip-10-10-8-122 ]
iptables (lsb:iptables): Started ip-10-10-9-111
○フェイルオーバー時のRoute Tableの変更設定
ここからが、本番になります。
下記のような初期起動スクリプトを用意します。
# cat /etc/init.d/associate-nat
#!/bin/sh
#
# chkconfig: 2345 99 10
# description: Associate EIP
# Source Function Library
. /etc/init.d/functions
# System Variable
prog=${0##*/}
lock=/var/lock/subsys/$prog
# User Variavle
ROUTE_TABLE_ID=rtb-xxxxxxxx
DESTINATION_CIDR=0.0.0.0/0
# Source Config
if [ -f /etc/sysconfig/$prog ] ; then
. /etc/sysconfig/$prog
fi
#
case "$1" in
start)
touch $lock
AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
REGION=`echo $AZ | cut -c 1-$((${#AZ} - 1))`
INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
aws --region $REGION ec2 replace-route
--destination-cidr-block $DESTINATION_CIDR
--route-table-id $ROUTE_TABLE_ID
--instance-id $INSTANCE_ID
| logger -s -i -t $prog
exit ${PIPESTATUS[0]}
;;
stop)
rm -f $lock
exit 0
;;
status)
if [ -f $lock ] ; then
exit 0
else
exit 3
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
作成したスクリプトに実行権限を与えます。
# chmod 755 /etc/init.d/associate-nat
さらに、Route Table IDも設定します。
># cat /etc/sysconfig/associate-nat
ROUTE_TABLE_ID=rtb-yyyyyyyy
そして、実行するとRoute Tableで指定しているNATインスタンスが自分自身のインスタンスIDに変更されます。
# service associate-nat start
associate-nat[9971]: {
associate-nat[9971]: "return": "true",
associate-nat[9971]: "requestId": "e9220a00-e8c0-4c20-b42a-f3e5af3d9dc7"
associate-nat[9971]: }
これをPacemakerに設定します。
# crm configure primitive associate-nat lsb:associate-nat
# crm configure group ha-nat iptables associate-nat
次のようになっていれば、問題ありません。
# crm_mon
============
Last updated: Mon Jan 28 20:26:37 2013
Last change: Mon Jan 28 20:26:17 2013 via cibadmin on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ ip-10-10-9-111 ip-10-10-8-122 ]
Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-9-111
associate-nat (lsb:associate-nat): Started ip-10-10-9-111
一方のEC2のiptablesを停止してみます。
# service iptables stop
そうすると、下記のようにフェイルオーバーされます。
# crm_mon
============
Last updated: Mon Jan 28 20:54:28 2013
Last change: Mon Jan 28 20:26:17 2013 via cibadmin on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ ip-10-10-9-111 ip-10-10-8-122 ]
Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-8-122
associate-nat (lsb:associate-nat): Started ip-10-10-8-122
Failed actions:
iptables_monitor_5000 (node=ip-10-10-9-111, call=5, rc=7, status=complete): not running
そして、Route Tableもassociate-natが実行された(スタンバイ)EC2のインスタンスIDに変更されます。
フェイルバックするためには、一旦、障害を起こしたEC2のFailed Actionをクリアします。
# crm resource cleanup ha-nat ip-10-10-9-111
Cleaning up iptables on ip-10-10-9-111
Cleaning up associate-nat on ip-10-10-9-111
Waiting for 3 replies from the CRMd... OK
次のようにFailed Actionが消えていれば、問題ありません。
# crm_mon
============
Last updated: Mon Jan 28 21:04:02 2013
Last change: Mon Jan 28 21:04:02 2013 via crmd on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ ip-10-10-9-111 ip-10-10-8-122 ]
Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-8-122
associate-nat (lsb:associate-nat): Started ip-10-10-8-122