CDP:Routing-Based HAパターン
提供:AWS-CloudDesignPattern
ルーティングによる接続先の透過的な切り替え
目次 |
解決したい課題
複数の同機能のサーバーを用意して冗長構成を採ることは一般的だが、フェイルオーバー時の接続先の切り替えはさまざまな方法が存在する。
同一セグメント(サブネット)のネットワーク内なら仮想IPアドレスの付け替えなどで比較的容易に実現できるが、セグメント(サブネット)、あるいはデータセンターを越えたサーバーへのフェイルオーバーでは、その方法での実現は難しくなり、他の方法を考える必要も出てくる。
例えば、DNSを用いた名前解決での切り替えなどはよく使われる。しかし、「ダウンタイムをTTLより短くできない」、「DNSサーバーというコンポーネントが増えてしまう」などのデメリットを考慮する必要がある。
クラウドでの解決/パターンの説明
セグメント(サブネット)やデータセンターを越えたサーバーへのフェイルオーバーは、クラウド環境でも同様の問題を抱える。
しかしクラウドによっては、複数データセンターを特に意識せず扱えるものもあり、その場合はデータセンター間のフェイルオーバーの難易度は下がるはずである。
また、クラウドが提供しているAPIでネットワークのルーティングを操作できる場合、フェイルオーバーの手段としてルーティングの切り替えも容易に利用できる。[関連ブログ 1]
実装
仮想プライベートクラウドであるVPCは、ネットワークのルーティングを設定できる(ルートテーブル)。加えて、そのルーティングをAPIで操作することもできる。
このAPI を利用すれば、ルーティングを切り替えることによるフェイルオーバーを容易に実現できる。
- 冗長化したEC2(ec2-1/ec2-2)の"Source/Dest. Check" を無効にする。
- このとき、二つのEC2 を別のAZ に配置していると、データセンターレベルの冗長化になる。(Multi-Datacenterパターン)
- 冗長化したEC2(ec2-1/ec2-2)の宛先となる仮想IPアドレス(192.168.1.1)を決める。
- 上記のEC2(ec2-1/ec2-2)と通信する必要があるEC2が配置されるサブネットのルーティングを調整する。
- 192.168.1.1/32宛てのルーティングを上記のEC2(ec2-1/ec2-2) のどちらかにする。
- 冗長化されたEC2(ec2-1/ec2-2)が192.168.1.1宛てのトラフィックを受信できるようにOS のネットワーク設定を調整する。
- ルーティングを切り替えるスクリプトを用意し、アクティブなEC2で障害が発生したら、そのスクリプトを実行してフェイルオーバーさせる。
- "Corosync & Pacemaker"を利用することで、障害を自動的に検知し、自動フェイルオーバーさせることも可能。[関連ブログ 2]
構造
利点
- サブネット(AZ)をまたいで冗長化されたEC2のフェイルオーバー(接続先の切り替え)を行うことができる。
- AZを分けると必然的にサブネットもわかれるので、AZをまたいだフェイルオーバーにも利用できる。
- フェイルオーバー(接続先の切り替え)に要する時間は非常に短い。
注意点
- "Source/Dest. Check"を無効にするのはNATとして利用するEC2に対して行うことが多く、このように利用すると誤解を招きやすい。
- 復旧時に"Source/Dest. Check"を無効にし忘れる可能性が高くなる。
- VPCのネットワーク範囲以外のIPアドレスを利用するため、VPC/DirectConnect経由/VPCPeeringによるVPC間通信の場合ではアクセスできない。
- AWSのAPIを利用するので、インターネットへのアウトバウンド通信(HTTPS)が必要となる。
- 仮想IPアドレスの管理を別途しなければならない(AWSコンソールの情報としては出てこない)。