okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

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は無効となっています。

f:id:okochang:20131109221413p:plain

Cross-Zone Load Balancingの有効化

パッと見たところ、Management Consoleには有効/無効の設定が出来ないようだったので、今回はElastic Load Balancing API ToolsAWS 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アドレスが記録されていました。

まとめ

過去に何度か負荷分散が偏ってしまうという状況になったことがあるので、このオプションを選べるようになったのは嬉しいです。