NATの冗長化 〜High Availability NATパターンの別案〜

High Availability NATパターン
http://blog.suz-lab.com/2013/01/high-availability-natcentos6.html
が何故か安定しないので別案。

「pacemaker+corosync」は「ノード死活+iptables」から「ノード死活のみ」に変更し、iptablesはmonitで管理を行う。

crmコマンド再び
でcrmshを入れるとcorosyncとpacemakerも入るのでそのまま。

[code]
chkconfig pacemaker on
chkconfig corosync on
[/code]

NATインスタンスを作成する
の通り、NATインスタンスを作成する。(2台)

monitが入っていない場合はインストールする。
[code]
yum install monit
chkconfig monit on
[/code]

監視間隔は適宜変更する。
[code]
vim /etc/monit.conf
set daemon 5
[/code]

iptables用の設定を作成する。
[code]
vim /etc/monit.d/iptables.conf
check program iptables with path “/root/scripts/iptables-check.sh” with timeout 5 seconds
if status != 0 then restart
start program = “/etc/init.d/iptables start”
stop program = “/etc/init.d/iptables stop”
[/code]

iptables監視用のスクリプトを作成する。
[code]
mkdir /root/scripts/
vim /root/scripts/iptables-check.sh
#!/bin/bash
/etc/init.d/iptables status
exit ${?}

chmod +x /root/scripts/iptables-check.sh
[/code]

monitを起動する。
[code]
/etc/init.d/monit start
[/code]
この時点でサーバ起動時は常にiptablesが起動している環境ができあがる。
ここから下はルートテーブル変更の為の設定。

フェイルオーバー時のルートテーブル変更用スクリプトを作成する。
[code]
vim /etc/init.d/associate-nat
#!/bin/sh
#
# chkconfig: 2345 99 10
# description: Associate RouteTables

# Source Function Library
. /etc/init.d/functions

# System Variable
prog=${0##*/}
lock=/var/lock/subsys/$prog

# User Variavle
ROUTE_TABLE_ID=(ルートテーブルのID)
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 +x /etc/init.d/associate-nat
[/code]

corosyncの設定を各サーバへ行う。
[code]
vim /etc/corosync/corosync.conf
compatibility: whitetank

service {
name: pacemaker
ver: 0
use_mgmtd: yes
}

totem {
version: 2
secauth: off
threads: udpu
transport: udpu
interface {
ringnumber: 0
bindnetaddr: (自ノードのIPアドレス)
mcastport: 5405
ttl: 1
member {
memberaddr: (ノード1のIPアドレス)
}
member {
memberaddr: (ノード2のIPアドレス)
}
}
}

logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

/etc/init.d/corosync start
[/code]

リソースを追加する。(片側)
[code]
crm configure property no-quorum-policy=”ignore” stonith-enabled=”false”
crm configure rsc_defaults resource-stickiness=”INFINITY” migration-threshold=”1″
crm configure primitive associate-nat lsb:associate-nat
[/code]
associate-natを入れることで、フェイルオーバー時にルートテーブルを変更するスクリプトが実行される。

crm_monで確認する。
[code]
Last updated: Thu Feb 13 19:51:51 2014
Last change: Thu Feb 13 19:08:52 2014 via cibadmin on node02
Stack: classic openais (with plugin)
Current DC: node02 – partition with quorum
Version: 1.1.10-14.el6_5.2-368c726
2 Nodes configured, 2 expected votes
1 Resources configured

Online: [ node01 node02 ]

associate-nat (lsb:associate-nat): Started node01
[/code]

監視方法は下記の通り
・monitのプロセス監視
・NAT配下のインスタンスから外部(8.8.8.8)へfping