ELBのCross-Zone Load Balancingを試してみる
こんにちは@oko_changです。
今回は先日対応されたELBのCross-Zone Load Balancingについて書いてみたいと思います。
Elastic Load Balancing Announces Cross-Zone Load Balancing
上記リンクには、今までのELBは各AZのEC2インスタンスへの分散はDNSに依存する部分があり、DNSのキャッシュ次第では各AZへのトラフィック分散が偏ってしまう可能性があったと書かれています。
しかしこのCross-Zone Load Balancingを有効にする事で、DNSのキャッシュを気にすることなく各AZのEC2インスタンスに同じようにトラフィックが分散されるようです。
※英語なので間違ってたらごめんなさい><
今回の検証構成
以下のようにシンプルな構成です。
Cross-Zone Load Balancingを有効にしていない場合、私のブラウザからELBに連続して複数回リクエストをしても、片方のAZ配下にあるEC2インスタンスに分散されるという現象がおきます。
Cross-Zone Load Balancingを有効にすることで、両方のAZ配下にあるEC2インスタンスに順番に負荷分散されます。
※デフォルトではCross-Zone Load Balancingは無効となっています。
Cross-Zone Load Balancingの有効化
パッと見たところ、Management Consoleには有効/無効の設定が出来ないようだったので、今回はElastic Load Balancing API ToolsとAWS Command Line Interfaceを使ったやり方を紹介します。
Elastic Load Balancing API Toolsの場合
対象のELB(okochanglb)の設定を確認します
$ elb-describe-lb-attributes okochanglb --headers --region ap-northeast-1 CROSS_ZONE_LOADBALANCING CROSS_ZONE_LOADBALANCING_ATTRIBUTE_VALUE CROSS_ZONE_LOADBALANCING false
Cross-Zone Load Balancingを有効にします
$ elb-modify-lb-attributes okochanglb --headers --crosszoneloadbalancing "enabled=true" --region ap-northeast-1 OK-Modifying LoadBalancer Attributes
Cross-Zone Load Balancingが有効になった事を確認します
$ elb-describe-lb-attributes okochanglb --region ap-northeast-1 --headers CROSS_ZONE_LOADBALANCING CROSS_ZONE_LOADBALANCING_ATTRIBUTE_VALUE CROSS_ZONE_LOADBALANCING true
無効にする場合は以下のように実行します
$ elb-modify-lb-attributes okochanglb --headers --crosszoneloadbalancing "enabled=false" --region ap-northeast-1 OK-Modifying LoadBalancer Attributes
AWS Command Line Interfaceの場合
対象のELB(okochanglb)の設定を確認します
$ aws elb describe-load-balancer-attributes --load-balancer-name okochanglb --region ap-northeast-1 --output table -------------------------------- |DescribeLoadBalancerAttributes| +------------------------------+ || LoadBalancerAttributes || |+----------------------------+| ||| CrossZoneLoadBalancing ||| ||+-------------+------------+|| ||| Enabled | False ||| ||+-------------+------------+||
Cross-Zone Load Balancingを有効にします
$ aws elb modify-load-balancer-attributes --load-balancer-name okochanglb --load-balancer-attributes '{"CrossZoneLoadBalancing":{"Enabled":true}}' --region ap-northeast-1
Cross-Zone Load Balancingが有効になった事を確認します
$ aws elb describe-load-balancer-attributes --load-balancer-name okochanglb --region ap-northeast-1 --output table-------------------------------- |DescribeLoadBalancerAttributes| +------------------------------+ || LoadBalancerAttributes || |+----------------------------+| ||| CrossZoneLoadBalancing ||| ||+--------------+-----------+|| ||| Enabled | True ||| ||+--------------+-----------+||
無効にする場合は以下のように実行します
$ aws elb modify-load-balancer-attributes --load-balancer-name okochanglb --load-balancer-attributes '{"CrossZoneLoadBalancing":{"Enabled":false}}' --region ap-northeast-1 --output table
考察
ELBを名前解決すると以下のように複数のIPアドレスが返ってきます。
$ dig okochanglb-1715652399.ap-northeast-1.elb.amazonaws.com +short 54.238.150.148 54.250.209.95
ELBは複数のAZにまたがって構成されていますが、Cross-Zone Load Balancingが無効な場合は各AZへの分散は上記IPへのDNSロードバランシングが使われます。
Cross-Zone Load Balancingを有効にすると、どちらのIPアドレスに接続したとしてもAZをまたいで分散対象全てのEC2インスタンスに分散するようです。
分散対象のEC2インスタンス(10.0.1.50)のアクセスログを見ていると、AZをまたいだであろう10.0.2.87という接続元IPアドレスが記録されていました。
まとめ
過去に何度か負荷分散が偏ってしまうという状況になったことがあるので、このオプションを選べるようになったのは嬉しいです。
参考
- http://aws.amazon.com/jp/about-aws/whats-new/2013/11/06/elastic-load-balancing-adds-cross-zone-load-balancing/
- http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#request-routing
- http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-crosszone-lb.html