Network Load Balancer(NLB)でクロスゾーン負荷分散が可能になりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

先日NLBでのクロスゾーン負荷分散が可能になりましたので試してみます。

Network Load Balancer now Supports Cross-Zone Load Balancing

クロスゾーン負荷分散

今回NLBの一つのIPアドレスに対するリクエストを同じAZだけでなくNLBの配下全てのインスタンスに負荷分散ができるようになりました。これにより以下のようなメリットが期待できます。

  • IPアドレスごとの可用性を向上できる
  • ゾーンごとの負荷を平準化できる

以下でメリットの詳細を解説します。

IPアドレスごとの可用性を向上できる

ここでは2AZでゾーンごとに1インスタンスを配置する場合を考えてみます。

ここで一つのインスタンスに障害が発生した場合を考えます。

右側のゾーンのインスタンスがリクエストを返せないため、クライアントから見るとNLBの右側のアクセスができない状態となります。

NLBの特徴として固定IPアドレスがあげられるためDNSでTTLを長めに設定することがあると思われます。その場合は右側のゾーンのインスタンスが復旧得するまで固定のIPアドレスに対してアクセスできなくなります。このように配下のインスタンスが少ない場合にはIPアドレス単位の可用性が低下する場合があります。

次にクロスゾーンの場合で考えてみます。

この状態で右のインスタンスに障害が発生したとします。その場合はNLBがUnhealthyと判断すると正常な左のインスタンスのみにトラフィックを流すため右のNLBのIPアドレスでもリクエストを受け付けられます。

この様にインスタンスの台数が少ない場合にはNLBのIPアドレスごとの可用性が向上します。ただし残っているインスタンスにリクエストが集中するため負荷に耐えきれるような余裕は必要です。

ゾーンごとの負荷を平準化できる

次に全体で4インスタンスが起動している場合を考えてみます。2AZで展開する場合は基本的に2台ずつ配置されます。

しかし、EC2のキャパシティ不足などが発生した場合ゾーンごとに台数が偏る場合があります。

NLBのIPアドレス単位で均等にリクエストが来るため1台と3台になる場合は、以下のように左のインスタンスが全体の1/2、右のインスタンスが1/6の負荷を受けます。負荷が不均衡になってしまい、左のインスタンスが正常にレスポンスを返せなかったり、右のインスタンスの負荷が低すぎたりといった問題が発生します。

クロスゾーン負荷分散の場合は、全インスタンスに均等にリクエストを分散できます。そのため負荷が均等になり、効率的にインスタンスを利用できます。

注意点

AZを越えると2ms前後のレイテンシが増えるため、パフォーマンスが重要な場合には注意が必要です。それに加えて別のAZへの通信が発生するため$0.010/GBの料金が追加で発生します。

また、今までNLBはAZ当たりターゲットを200まで登録できましたが、クロスゾーン負荷分散を有効にするとターゲットを全体で200まで登録可能となります。つまり3AZを使用している場合、通常では200インスタンス ✕ 3AZで600インスタンスまで登録可能であったのが、クロスゾーン負荷分散を有効にすると全体で200までとなります。大規模使用をしている場合は注意しましょう。

試してみる

NLBの構築方法については、以下のエントリーをご確認ください。ここではゾーンごとに1台のインスタンスを配置します。

[新機能]静的なIPを持つロードバランサーNetwork Load Balancer(NLB)が発表されました!

NLBを構築して内容を確認すると、属性の欄にクロスゾーン負荷分散が追加されています。ここで属性の編集をクリックします。

クロスゾーン負荷分散有効化をチェックして保存します。これでクロスゾーン負荷分散が有効になります。

実際にアクセスしてみましょう。

クロスゾーン負荷分散が無効(通常時)

今までのクロスゾーンで負荷分散していない場合は、以下のように固定のIPアドレスに対してリクエストするとそのゾーンにあるインスタンスだけにルーティングされます。

$ seq 1 10 | xargs -n1 curl -s -w"\n" http://203.0.113.1/index.html
i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

クロスゾーン負荷分散が有効

今度はクロスゾーン負荷分散を有効にしたい状態でリクエストします。すると複数のインスタンスに分散されます。

$ seq 1 10 | xargs -n1 curl -s -w"\n" http://203.0.113.1/index.html
i-01bf4AAAAAAAAAAAA

i-01bf4AAAAAAAAAAAA

i-07084BBBBBBBBBBBB

i-07084BBBBBBBBBBBB

i-01bf4AAAAAAAAAAAA

i-07084BBBBBBBBBBBB

i-01bf4AAAAAAAAAAAA

i-07084BBBBBBBBBBBB

i-07084BBBBBBBBBBBB

i-07084BBBBBBBBBBBB

1000リクエストで確認するとほぼ半分に分散できています。

$ seq 1 1000 | xargs -n1 -P1 curl -s -w"\n" http://203.0.113.1/index.html | sort | uniq -c
1509
 509 i-01bf4AAAAAAAAAAAA
 491 i-07084BBBBBBBBBBBB

まとめ

NLBのクロスゾーン負荷分散を有効化することで、以下の変化が期待できます。NLB配下のEC2インスタンスが少ない場合は効果が大きいと思われます。ご自分のワークロードに応じて判断しましょう。

項目 EC2の台数が少ない EC2の台数が多い 備考
可用性 (TTLが長い場合) △ -> ◯ ◯ -> ◎ 台数が多い場合は、可用性は大きく変わらない。
負荷の平準化 △ -> ◯ ◯ -> ◎ 全体の台数に対して不均衡な台数が少ない場合は、1台辺りの負荷は大きく変わらない。
料金 ◎ -> ◯ ◎ -> ◯
キャパシティ ◎ -> ◯ 台数が少ない(200台以下)場合には該当しない。

さいごに

今までNLBはゾーンごとにEC2へルーティングしていました。そのため高い可用性を求めるためには、ゾーンごとに2インスタンスでマルチAZ構成を取って合計4台からが理想的な状況でした。これが2台でも可用性が高い構成を構築なりました。小規模な構成でも手軽に高い可用性が取れる様になり、地味ですが大変ありがたいアップデートだと思います。