GCEのロードバランシングについて ~あるいは、L4とL7の違いを復習したい~

はじめに

 タイトルに記載しているGCE(Google Compute Engine)とは、Googleが提供している、Googleのデーターセンターとファイバーネットワークで運用されている仮想マシン(VM)提供サービスだ。分かりやすい言葉でいうと、昨今話題のクラウドである。他にも様々なクラウドサービスをGoogleは提供しているが、それらサービスを総称してGoogle Cloud Platform(以後GCPと記載)と呼ばれている。

 類似サービスとして、Amazonが提供しているAWSが存在しているが、コスト比較をするとGCPでの運用の方が安上がりだったり、GCEの話に限って言えば、インスタンス(VM)の起動が比較的に素早かったりする点などが上げられており、僕も業務で利用することがあり勉強する必要が出てきた。    クラウドとは?Google Cloud Platformとは?それぞれの利点とは?詳細なコスト比較は?等の議論はすでに様々な偉いエンジニアの人たちがブログやエンジニア向けの技術共有サイトQiitaでされており、より多くの知見が共有されているのでそちらを参照して欲しい。    この記事では、GCEのロードバランシングについて着目してその機能の説明と、そもそものロードバランシングについての復習を行っていく。業務で扱う技術範囲なので僕自身の勉強のための記事だ。また、タイトルにもある「L4 L7」とは、大学生の頃に習ったコンピューターサイエンス基礎でもあり、それの復習でもある。    ここまでの話を見て既にお気づきではあると思うが、この記事は技術者向けの内容であるため、興味の無い人はブラウザを閉じることを推奨する。なるべく分かりやすく書くつもりではいる。

アジェンダ

  1. ロードバランシングとは
  2. L4ロードバランシングとL7ロードバランシングの違い
  3. GCEでのロードバランシングについて
  4. HTTP(S) load balancingについて
  5. まとめ
  6. 参考・引用一覧

ロードバランシングとは

 ロードバランシングとは、その名の通り「load(負荷)」を「balancing(分散)」させるという意味で、主にインターネットサービスに掛かる負荷を複数のサーb−あに分散させて、処理のバランスを調整することを言う。「負荷分散」という言葉を使われることが多い。    インターネットサービスは、いつ・どれだけの数のユーザーからアクセスを受けるかわからない。時々見かける「service temporarily unavailable」は、1つのサーバーへの同時アクセス数の制限が超えて、訪問者の閲覧を制限している状態で、これは負荷分散を行っていない証拠であったりする。本来サービスは、ダウンさせるだけで莫大な利益の損失に繋がるので、通常はシステムをダウンさせないように対策を打つべきなのだが、たまたまスキャンダルが出た芸能人の個人サイトだとか、人気のレストランの予約サイトだとか、普通はそこまでのアクセスを想定していないサービスだと、時々ダウンしているところを目にすることがある。そのようなものであれば殊更利益の損失にはならないかもしれないが、例えばソーシャルゲームのシステムがダウンしたらユーザーの課金の機会を奪い利益の損失に直結する。業務システムが想定以上の負荷によりダウンすれば、それこそ賠償責任モノだ。だからこそ、負荷分散の対策を行うことがインターネットサービスを運用する上で非常に重要な課題となってくる。また、ロードバランシングをするロジックにもいくつか種類があるので代表的なものを以下に記載しておく。

種類 説明 分類
ラウンドロビン クライアントからのリクエストをサーバーに均等に転送 スタティック
Ratio サーバごとに重みを定義して、その割合に応じてサーバに転送 スタティック
Dynamic Ratio 動的比率。CPUやメモリ使用率が低いサーバに転送。前提として各サーバをMonitor機能による監視が必要となりサーバにはSNMPAgent等が必要となる ダイナミック

  f:id:s-a-o-t-o-m-e:20160618184252p:plain

L4ロードバランシングとL7ロードバランシングの違い

 この2つの違いを理解するためには、まずL4、L7と言っているこのL(Layer)について理解をしていなければいけない。これはコンピューターネットワークや情報通信の世界でよく使われている言葉プロトコルの階層のことで、その4階層目、7階層目の意である。順を追って説明しよう。  

プロトコルとは

 コンピューターネットワークや情報通信の世界でよく耳にするプロトコルという言葉。例えば、みなさんも耳にしたことがあるような代表的なものを例に上げるとIP、TCP、HTTPなどが存在する。普段、私達が電子メールを出す時や、ネットでウェブサイトを閲覧する時には殊更プロトコルを意識する必要はない。唯一意識する時があるとすれば、電子メールのクライアントアプリの設定をする時だとか、家のネットの設定をする時ぐらいだろう。それらは、説明書を読んで手順通りに設定すれば大体は問題ないので、プロトコルまで意識することは殆ど無いのも事実だ。しかし、ネットワークを利用してコミュニケーションをとるためには、プロトコルは非常に重要なものになる!  プロトコルを簡単に説明すると、コンピューターとコンピューターがネットワークを介して通信をするために決められた約束事のようなものだ。例えMacを使っていても、Windowsを使っていても、別のOSを利用していてもマシン間で通信ができているだろう?それは通信時に同じプロトコルを利用しているからだ。コンピューター同士が通信するためにはお互いにプロトコルを理解し処理できなければいけないのだが、普段僕達が端末を利用する上ではあまり意識することではないかもしれない。

プロトコルを会話で例えると

  • 日本語や英語がプロトコル
  • 言語によってコミュニケーションすることを通信
  • 話の内容をデータ

 例えば、英語しか話せないAさんが日本語しか話せないBさんに「I gatta go home!」と言ってもBさんは何を言っているかわからない。逆にBさんがAさんに「今夜はずっと君と一緒にいたい」と言っても伝わらないのは明白だろう。一方で、2人ともがドイツ語を理解していたならば「ich denke immer an dich(You are always on my mind!)」とAさんがBさんに言うと「kein tag geht vorbei ohne das ich an dich denke.(No days go by without thinking about you!)」と返答することが可能で、コミュニケーションが成り立つ。お分かりいただけただろうか、これがプロトコルだ。  

OSI参照モデル(プロトコルのLayerの話)

 しかしながら、通信プロトコルは上記の会話のように単純なモデルではない。もっと複雑だ。それを整理して分かりやすくするためのモデルが7階層のOSI参照モデルだ。OSI参照モデルでは、各層で何をするかという役割が定義されており、各層の役割を定義しているのがプロトコルで、プロトコルとは約束ごとであり、通信の仕様のことである。ここではスクリーンショットを記載してそれぞれの層の簡単な説明のみに留めておくが、情報通信技術の基礎であり情報工学を志す学生の人や、現在エンジニアの方は今一度自分が理解しているかを振り返り、そうでなければ勉強し直すのも良い刺激になるに違いないので、再勉強してみるといいかもしれない。ここの7層と4層でのロードバランシングについて次に詳しく見ていく。   f:id:s-a-o-t-o-m-e:20160618184304g:plain

L4ロードバランシングとL7ロードバランシングの違い

 L4とL7では扱うプロトコルが違い、そのLayerで扱う情報の違いがロードバランシングの違いになる。L4機能はOSI参照モデルでの第4層でトランスポート層での判断を行う。TCP/IPの中のTCP/UDPというところで判断をする。パケットの種別をTCP/UDPのプロトコルと、その下の層のIPアドレスで判断して処理をさせるサーバを振り分ける。つまりTCPヘッダなどのプロトコルヘッダの内容を解析して分散先を決定する。またこのL4機能はセッション維持機能を持っているため、振り分けた後は継続して同一サーバーへの振り分けを行うことが出来る。  対して、L7機能はこのL4機能に加えて第7層、アプリケーション層での判断ができる。つまり、クライアントからのリクエストとしてURLに付加されているパラメタを参照できたり、リクエストユーザエージェントを判別できるのだ。HTTPリクエストに応じた制御ができるので、リクエストパラメーター毎にアクセスさせるサーバーをダイナミックに振り分けることも可能なのだ。しかしながら、L4で扱う情報量より多い分、様々な設定が可能だが、その処理は重くなるのも忘れてはいけない。  

GCEでのロードバランシングについて

 もちろん、GCEでも上で説明したL4(Network Load Balancing)とL7(HTTP(S) Load Balancing)の2つを提供している。上の説明を見ると、プロトコルだのなんだのととても複雑で難しいイメージしかわかないが、GCEのロードバランシングの設定は極めて明確な説明と簡単な設定になる。抽象化されているのでウェブの画面上からポチポチしていくだけで設定できるのだ。もちろんオートスケールの設定も容易だ。ただし、それぞれにいくつかの制約は存在するので忘れてはいけない。

Google Compute Engine offers server-side load balancing so you can distribute incoming network traffic across multiple virtual machine instances. Load balancing provides the following benefits with either network load balancing or HTTP(S) load balancing:

  • Scale your application
  • Support heavy traffic
  • Detect and automatically remove unhealthy virtual machines instances. Instances that become healthy again are automatically re-added.
  • Route traffic to the closest virtual machine

HTTP(S) load balancingについて

 L7の情報を基にGCEのロードバランシングすることができる。リクエストのパスによって向き先を変更したり、リージョンを跨いだ負荷分散を可能にする。

Cross-region load balancing

 1個のグローバルIPだけでUS、EU、Asiaの各リージョンをまたいだ負荷分散とフェイルオーバーが実現可能だ。DNSに頼ったリージョン間負荷分散ではないので、どのリージョンで大規模障害や負荷のスパイクが発生しても瞬時に他のリージョンにリクエストを振り分ける仕組みができあがる。Google検索、Gmail、YouTube等のGoogleサービスと同じトップクラスのグローバルインフラを共用して実現されているから最強だろう。言い換えれば、これらの各サービスと同様の仕組みでTCP SYN、flood等の攻撃から保護されているということなのですごい。こちらのロードバランシングの設定は主にBackendserviceにぶら下げるinstance_group(リージョン毎)の設定で実現している。

You can use a global IP address that can intelligently route users based on proximity. For example, if you set up instances in North America, Europe, and Asia, users around the world will be automatically sent to the backends closest to them, assuming those instances have enough capacity. If the closest instances do not have enough capacity, cross-region load balancing automatically forwards users to the next closest region.

f:id:s-a-o-t-o-m-e:20160618184243p:plain

Content-based load balancing

 こちらは従来のよくあるコンテンツ別に向き先を変更するようなロードバランシングだ。L7の情報(ここではURLのリクエストパラメータ)に基づきリクエストの向き先を変更することができる負荷分散方法だ。この方法の利点は、例えば重い処理、負荷の高い処理をさせるリクエストの場合は性能の良いサーバーに向くように設定したり、静的で軽いものを配信するリクエストの場合は、通常よりも性能の悪いサーバーにリクエストを向かせることができる。  

Content-based or content-aware load balancing uses HTTP(S) load balancing to distribute traffic to different instances based on the incoming URL. For example, you can set up some instances to handle your video content and another set to handle everything else. You can configure your load balancer to direct traffic for example.com/video to the video servers and example.com/ to the default servers.

f:id:s-a-o-t-o-m-e:20160618184239p:plain

## まとめ

 今回は、そもそものロードバランシングとは何かというところから始まり、OSI参照モデルの復習と、GCE上のL7レイヤーのロードバランシングについてまとめてみた。GCEには、L4のNetwork load balancingというものもあるが、それは又の機会に(単純に勉強不足)。  これを良い機会に、もう少しレイヤーの深い層の勉強をしっかりしようと思ったアプリケーション層の開発ばかりしているエンジニアの俺であった。  

参考・引用一覧

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

  • 作者: 竹下隆史,村山公保,荒井透,苅田幸雄
  • 出版社/メーカー: オーム社
  • 発売日: 2012/02/25
  • メディア: 単行本(ソフトカバー)
  • 購入: 4人 クリック: 34回
  • この商品を含むブログ (35件) を見る