Linux
Azure

Azureのロードバランサ事情 - ロードバランサの中ってどうなっているの? -

Azureのロードバランサ

以前の記事で、「Azureで超簡単にVM負荷分散 - GUIでAzure Load Balancerの設定をしてみる」を書きました。GUIでクリックして進めていくだけで、簡単にロードバランサーが作成できました。

が、ここで疑問がわきます。

「こんな簡単にロードバランサの設定できたけど、実際中身ってどうなってんだろ?」
「AzureとかのIaaSで勝手に作成されるロードバランサの実態は?」

本記事では実際に裏ではどんなことが起きているのか、表面上見える「リソース」ではなく、Azure上では本当は何が起こっているのかを取り上げます。

Azureのロードバランサの種類

Azureのロードバランサには3種類あります。今回取り合えげるのはAzure Load Balancerですが、一応レイヤごとに違うロードバランシングの種類があるので、それぞれ説明します。

  • Traffic Manager

    • DNSレベルでトラフィックを制御するロードバランサ
    • OSI参照モデルのレイヤはL4
    • ワールドワイドに散らばったリソースにも負荷分散できる
    • DNSレベルで制御するため事業継続性や災害対策などのクリティカルなサービスで必要になる

            

  • Azure Load Balancer

    • L4ロードバランサ。IPアドレスでの分散が可能
    • 内部ネットワーク間の負荷分散機能としても利用できるので、ILB(Internal Load Balancer) と ELB(External Load Balancer) のどちらとしても使える



  • Application Gateway

    • L7ロードバランサ。URLやHTTPヘッダでの分散ができる
    • アプリケーション層なので、SSLオフロード機能、Cookie処理による振りわけ等に対応可能
      • (SSLオフロード:SSL通信において、サーバをSSLエンコード/デコード負荷から解放してパフォーマンスを上げるために、SSL処理を専門に行うノードを設置すること、またそのシステム)



今回はL4ロードバランサであるAzure Load Balancerのアーキテクチャについて解説します。

Azure Load Balancerの仕組み

Azureのロードバランサの仕組みはこちらの論文(英語)に詳しく書いてあります。日本語ではこちらの記事にその抜粋があり、とても参考になりました。こちらの記事はAzureだけでなく、FacebookやCloudFlareのアーキテクチャにも触れているので、ぜひ読んでみてください。この記事ではAzureのロードバランサのみを取り合げます。読んでみてわからない単語もあったので、もうちょっとかみ砕いてそれぞれの役割について説明させていただきます。

Azure Load Balancerについて

Azure Load Balancerはルーター, L4ロードバランサ, ホストエージェントの3階層を経てロードバランシングされます。
ここでややこしいのですが、「Azure Load Balancer」はサービス名です。実際にはL3でやりとりするルーター、L4ロードバランサ(これが本体的な)、ホストエージェント(+Ananta Manager)が合わさって「Azure Load Balancer」というサービスを構成しています。
image.png
(上図はhttp://conferences.sigcomm.org/sigcomm/2013/papers/sigcomm/p207.pdfより抜粋)

① ルーター

まずはL3レベルのトラフィック分散です。パケットレベルで分散を行います。

ルーターではPer-flow ECMPという手法でL3レベルのトラフィック分散を行うので、セッションを管理する必要がありません。
ルーターはL4からBGPというプロトコルでVIPの経路情報を受信しており、Local Preferenceなどの情報を利用し、パケットフォワーディングを行います。

BGP(Border Gateway Protocol)とは

  • ルーティングの経路を制御するための「経路制御プロトコル」のひとつで、Border Gateway Protocolのこと
  • 経路制御プロトコルにはIGP(内部)とEGP(外部)の2つに分類できるが、BGPはEGP(外部)に属する。基本的にインターネット上で組織間の経路情報をやり取りする
  • BGPのメリット
    • 経路情報のやり取りでループが発生しない(As-Pathリスト利用)
    • ネットワークの変更は差分のみアップデートされる(差分アップデート)
    • トランスポート層(L3)でTCP利用のルーティング
    • CIDRによる経路集約によりルート負荷を軽減

Per-flow ECMP(Equal Cost Multi Path)とは

  • ECMPとは ネクストホップパケットフォワーディングの時に経路を決定する仕組み、方法(ネクストホップとは、ルーティングテーブルに記載される情報の一つで、個々の宛先ネットワーク毎に決められた、次に転送すべき隣接ルータのこと)
  • Per-flow は Source IPやDestination IP等のHASHでルートを決める方法。つまりルートが決定されたら、次からも同じルートを通る。(毎回ランダムに決定するのは Per-packet ECMP)
  • 実際流れるトラフィック量は均等にはならず、ルートの決定方法は一般的にメーカーによって違い、利用するパラメータにも差がある。(論文の中を探してもAzureでの決定方法は書かれていなかったです)

② L4ロードバランサ(MUXと呼ばれている)

これがAzure Load Balancerの本体で、L4でのトラフィック分散を行います。

  • コンシステントハッシュ法によるL4でのトラフィック分散を行う(コンシステンスハッシュ法はスロットの追加や削除に対して、最小限のキーのスロットへのマッピングの変更で、ハッシュテーブルの機能を提供することのできる特殊なハッシュ法)
  • このロードバランサ(MUX)で経路情報は管理されている。
  • 本記事のルータの説明に以下があるが、経路情報をルーターに知らせる。

ルーターはL4からBGPというプロトコルでVIPの経路情報を受信しており、Local Preferenceなどの情報を利用し、パケットフォワーディングを行う

  • アプケーションが稼動しているVMにトラフィックを分散する
  • ハッシュ値だけでなく、既存セッションの情報を取り扱うセッションテーブルがある(しかしMUX間ではセッション情報は共有されていない)

③ Host Agent

  • パケットのデカプセル化などの処理を行い、適切なVMにトラフィックが届くようにする。(IPIPのトンネリング)
  • VMやその上で動いているアプリケーションのヘルスチェックもここで行う。
    • ヘルスチェックの結果はAnanta Managerに送られたのちMUXに反映される

IPIP(トンネリングプロトコル)

  • トンネリングとは、通信ネットワーク上の2点間を結ぶ閉じられた仮想的な直結回線を確立すること
  • L3レイヤーのトンネリングプロトコルで、単にIPヘッダを付け替えるだけで、パフォーマンスをあまり落とさずに通信ができる。

Azureでは超簡単に負荷分散できる

以前の記事で、「Azureで超簡単にVM負荷分散 - GUIでAzure Load Balancerの設定をしてみる」を書きました。
実際にやってみるとわかりますが、とても簡単に負荷分散ができます。
Azureの場合は実際にロードバランサーはサービスとして提供されており、ブラックボックスとしてだいぶ隠蔽されているので「どのように実現されているのか」というところはわかりにくい(というかあまりわからない)ですが、その反面「使いやすさ・実現の早さ」はクラウドならではのメリットとしてあげられます。

次にAzureのポータルからAzure Load Balancerをクリックしたときにはロードバランサーのアプライアンスをイメージするのではなく、「あぁ、こいつはアジュールロードバランサーって名前付いてるけど、後ろではホストエージェントの仕組みとか色々作ってくれてるんだねぇ~。」とでも思ってみてください。