諸般の理由により、AWSの各サービスの挙動を改めて復習中です。まずは、Amazon Elastic Load Balancing 、通称ELBについてです。ELBの内部の動作については、公開されている公式ドキュメントが割とあります。是非一度しっかりと目を通しておくとよいですよ。少なくともAWSマイスターシリーズのELBについては、読んでおくべきです。簡潔にかつ詳しく説明されているので、理解が格段に進むでしょう。というところで、現段階で私が理解しているELBのアーキテクチャをまとめてみました。
ELBの内部構造
ELBは、ELBエンドポイントとELBインスタンス(仮称)によって構成されます。ELBインスタンス(仮称)の正式名称は知らないので、その名前で呼ぶことにします。ELBインスタンスには、グローバルIPが付与されます。ELBエンドポイントは、myLB-xxx.elb.amazonaws.comのようなDNS名を持ちます。このELBのDNS名を名前解決すると、ELBインスタンスのグローバルIPが返されます。ELBインスタンスが複数ある場合は、複数のIPを返します。ELBインスタンスは、利用するAZに少なくとも1つ存在します。MultiAZ構成の場合であれば、少なくとも2つのIPが返されます。
クライアントからアクセスがあった場合は、DNSのラウンドロビンでELBインスタンスのIPアドレスが返されます。ELBインスタンスは、配下のインスタンスに振り分けられます。恐らくELBインスタンス内にリバースプロキシのような機能があるのでしょう。
nslookupとdigをすると、次のようになります。
$ nslookup ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com Server: 192.168.11.1 Address: 192.168.11.1#53 Non-authoritative answer: Name: ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com Address: 54.250.186.157 Name: ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com Address: 54.199.196.182
$ dig ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com ; <<>> DiG 9.8.5-P1 <<>> ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1343 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 4 ;; QUESTION SECTION: ;ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com. IN A ;; ANSWER SECTION: ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com. 48 IN A 54.199.196.182 ELB-Test-869539816.ap-northeast-1.elb.amazonaws.com. 48 IN A 54.250.186.157 ;; AUTHORITY SECTION: ap-northeast-1.elb.amazonaws.com. 166 IN NS ns-54.awsdns-06.com. ap-northeast-1.elb.amazonaws.com. 166 IN NS ns-1683.awsdns-18.co.uk. ap-northeast-1.elb.amazonaws.com. 166 IN NS ns-982.awsdns-58.net. ap-northeast-1.elb.amazonaws.com. 166 IN NS ns-1325.awsdns-37.org. ;; ADDITIONAL SECTION: ns-54.awsdns-06.com. 166659 IN A 205.251.192.54 ns-982.awsdns-58.net. 166660 IN A 205.251.195.214 ns-1325.awsdns-37.org. 166660 IN A 205.251.197.45 ns-1683.awsdns-18.co.uk. 166660 IN A 205.251.198.147 ;; Query time: 24 msec ;; SERVER: 192.168.11.1#53(192.168.11.1) ;; WHEN: Tue Feb 11 16:45:22 JST 2014 ;; MSG SIZE rcvd: 301
ELBのスケーリング
一定以上の負荷が掛かりELBの処理能力を上げる必要が出た場合に、自動的にELBのスケールアップもしくはスケールアウトが行われます。このELBのスケーリングも、DNSの名前解決を利用して行います。スケールアップの場合は、より処理能力の高いELBインスタンスを立ちあげてIPに切り替えます。スケールアウトの場合は、同等の処理能力のELBインスタンスを立ちあげてIPアドレスに追加します。いずれにせよIPアドレスが変わるのでご注意ください。
ちなみにスケールアウトかスケールアップのどちらを選ぶのかは、AWSが自動的に選択します。そのアルゴリズムは公開されていません。想像ですが、トラフィック数が多い場合はスケールアウト、リクエスト辺りのトラフィック量が多い場合はスケールアップを選ぶのではないでしょうか?全くの想像なので、いつか試してみたいです。
障害時の動作
障害時の動作も、基本的にはDNSを利用します。ELBインスタンス配下のインスタンスが全滅した場合、そのELBインスタンスのIPアドレスは削除されます。そのIPアドレスが最後の1つの場合は、そのまま残ります。ELBインスタンス自身の障害の際も、DNSの切り替えで対処します。
ELBのCloudWatchのMetrics
ついでにELBのCloudWatchのメトリクスを見てみましょう。
メトリクス名 | 概要 |
---|---|
HealthyHostCount | ELB配下の正常稼働している(healthy)インスタンス数です |
UnHealthyHostCount | ELB配下の異常稼働している(unhealthy)インスタンス数です |
RequestCount | ELBで処理されたリクエスト数です。HTTPCode_Backend_XXXの合計です |
Latency | ELBからバックエンドインスタンスに渡されて返ってくるまでの時間です |
HTTPCode_ELB_4XX HTTPCode_ELB_5XX |
ELB自身が返すステータスコードです |
HTTPCode_Backend_2XX HTTPCode_Backend_3XX HTTPCode_Backend_4XX HTTPCode_Backend_5XX |
ELB配下のバックエンドインスタンスで生成されたレスポンスコードです |
SurgeQueueLength | ELBで処理待ちの待ち行列(surge queue)の数です |
SpilloverCount | 待ち行列(surge queue)から溢れたリクエスト数です |
ポイントとしては、SurgeQueueLength及びSpilloverCountをみておけば、ELBで処理出来なかったリクエストが解るという点でしょうか。あとは、HTTPCode_ELB_5XX系のHTTP 503: Service Unavailableなどを見ていれば、ELBのキャパオーバ等の検出も出来る可能性があります。
Amazonさん、ついでにELBの流量を監視するメトリクスも作ってくれませんかね?
まとめ
公開されている資料の中でのELBの動作をまとめてみました。もしかしたら誤解している部分があるかもしれませんので、その際は是非ご指摘ください。ちなみにこのELBの動作のように、DNSを切り替えて行うというのはAWSの基本思想だと思います。他のサービスも色々利用していますし、たぶんそうなんだろうなぁというところもあります。Googleのクラウド(Google Cloud Platform)はまた違ったように見受けられるので、そのうち調べて対比させてみたいと思います。
See Also:
AWSのEBS Provisioned IOPSからEBSについて妄想する
結構知らないAmazon EBSの細かい話。主にEBSのネットワークの構造について
参照:
AWSマイスターシリーズ Amazon Elastic Load Balancing (ELB)
Elastic Load Balancing 開発者ガイド
Best Practices in Evaluating Elastic Load Balancing : Articles & Tutorials : Amazon Web Services
Monitor Your Load Balancer Using Amazon CloudWatch - Elastic Load Balancing