AWS上でソフトウェアルーターを冗長化する
AWS上でソフトウェアルーターの冗長化(HAクラスタ)を構成します。
これにより、EC2インスタンスのトラブル等による影響を最小限に抑えられる、といったメリットがあります。
今回、商用版Vyatta(および、Vyatta Core)を用いて、マルチAZ環境下でのHAクラスタを構成します。
この記事について
以下の記事を清書したものになります。
内容は当時(2014.10.08)のものとなります。
https://blog.mikalab.info/archives/643967.html
Vyatta固有の問題
Vyattaは、HAクラスタの機能として、OSSのHeartbeat
を使用しています。
Heartbeatでは、ハートビートの送信にユニキャスト・マルチキャストを選択する事が可能です。
しかし、Vyattaは起動のタイミングで、Vyattaのコンフィグを基に全ミドルウェアのコンフィグを生成しなおした上で、ミドルウェアを起動します。
ここでは、Heartbeatのコンフィグを生成した上で、Heartbeatが起動される事になります。
併せて、Vyattaはハートビートの送信方法がマルチキャストに固定されています。
しかし、VPCではマルチキャストを取り扱う事が出来ず、そのままではHAクラスタを構成する事ができません。
その結果、起動直後からスプリットブレインが発生します。
VPC上でマルチキャストを使う方法
ここではGRE Tunnelを構成した上で、トンネル内にマルチキャストパケットを通します。
- GRE Tunnelを作成する
- GRE Tunnelの両端にIPアドレスを割り当てる。
- トンネルを用いて、Heartbeatがマルチキャストパケットを用いて相互監視をはじめる。
今回はVyatta固有の問題でしたが、マルチキャストパケットの取り扱いとして、1つの例になるかもしれません。
この結果、無事にクラスタが構成され、スプリットブレインが解消されました。
検証環境
以下のAMIを使用しました
- AWS Marketplace: Vyatta Virtual Router/Firewall/VPN by Vyatta, Inc. VSE6.6R (07/17/2014)
-
https://aws.amazon.com/marketplace/pp/B009I5TLOE?ref=cns_srchrow
サンプルコンフィグ
クラスタの片側(vyatta-a)でのコンフィグ例
set system host-name vyatta-a
set system time-zone Asia/Tokyo
set interfaces tunnel tun00 address '169.254.0.1/24'
set interfaces tunnel tun00 encapsulation 'gre'
set interfaces tunnel tun00 local-ip '《vyatta-aのLocalIP》'
set interfaces tunnel tun00 remote-ip '《vyatta-cのLocalIP》'
set interfaces tunnel tun00 multicast enable
set cluster interface tun00
set cluster pre-shared-secret mikalab
set cluster group aws
set cluster group aws primary vyatta-a
set cluster group aws secondary vyatta-c