#Serf
障害の検知と、イベントハンドラーを行えるhashicorpのツール。
概要はこちらがわかりやすいです。
http://gihyo.jp/admin/feature/01/serf-consul
#NAT冗長化
最近はAutoScalingによる冗長化もあるが、
切り替わり時間を短くしたいためActive/Standbyによる冗長化を実装。
Serfにより障害を検知し、APIを使用しRouteTableを切り替える。
#Serf実装
Active側が正常であれば、常に経路を寄せるようにする。
Standby側はActive側の障害を検知した際にRouteTableを書き換える。
また、疎通間隔を4秒とし、タイムアウト12秒設定することで最長の障害時間を12秒にする。
オプション等は以下が参考になります。
https://www.serfdom.io/docs/agent/options.html
http://qiita.com/zembutsu/items/1e2cddd0a424ef7a4895
##Serf Active
{
"node_name": "nat1",
"enable_syslog": true,
"tags": {
"role": "nat"
},
"reconnect_interval": "4s",←疎通間隔は4秒
"reconnect_timeout": "12s",←タイムアウト検知12秒
"tombstone_timeout": "12s",←タイムアウト検知12秒
"event_handlers": [
"member-join=ha-nat -R [変更するRouteTableのTagName] -N 0.0.0.0/0 -r ap-northeast-1 >> /var/log/ha-nat.log 2>&1"
]
}
##Serf Standby
{
"node_name": "nat2",
"enable_syslog": true,
"tags": {
"role": "nat"
},
"reconnect_interval": "4s",
"reconnect_timeout": "12s",
"tombstone_timeout": "12s",
"start_join": [
"Active側のPrivateIP"
],
"event_handlers": [
"member-failed,member-leave=ha-nat -R [変更するRouteTableのTagName] -N 0.0.0.0/0 -r ap-northeast-1 >> /var/log/ha-nat.log 2>&1"
]
}
##initスクリプト
zembutsuさんのスクリプトを使わせて頂きました。
lockfile等をちょこっと直して使ってます。
https://gist.github.com/zembutsu/7640108
##RouteTable書き換えスクリプト
BotoによるRouteTable操作を実装しました。
理由としては、AWSで提供するNATインスタンスはAmazonLinuxのため、
botoであればすでに環境は整っているので追加のインストールは必要なくなります。
ha-nat -R [変更するRouteTableのTagName] -N [書き換える経路(Cidr込み)] -r [リージョン]
#起動
Active側のサービスを先に上げる。
その後、Standby側のサービスも上げる。
$ sudo /etc/init.d/ha-serf start
#障害試験
数回試験しましたが最長で、
Ping1秒間隔の障害試験で切り替わり時に8パケットロスとなり8秒ダウン。
--- 8.8.8.8 ping statistics ---
42 packets transmitted, 34 received, 19% packet loss, time 42087ms
rtt min/avg/max/mdev = 2.181/2.454/2.867/0.176 ms
その他、タイミングによりますがこれよい短い場合もあります。
尚、両方が正常である場合のStandbyからActiveへ戻す際のパケロスはなし。