Help us understand the problem. What is going on with this article?

Serfで実装するHigh Availability NAT

More than 3 years have passed since last update.

Serf

障害の検知と、イベントハンドラーを行えるhashicorpのツール。

概要はこちらがわかりやすいです。
http://gihyo.jp/admin/feature/01/serf-consul

NAT冗長化

最近はAutoScalingによる冗長化もあるが、
切り替わり時間を短くしたいためActive/Standbyによる冗長化を実装。

Serfにより障害を検知し、APIを使用しRouteTableを切り替える。

ha-nat.png

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であればすでに環境は整っているので追加のインストールは必要なくなります。

https://github.com/SatoHiroyuki/ha-nat-script/blob/master/ha-nat

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へ戻す際のパケロスはなし。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away