読者です 読者をやめる 読者になる 読者になる

続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

GCP リージョン跨ぎロードバランサーの破壊力

GCP ロードバランサー リージョン跨ぎ HTTP負荷分散

知っている人は知っている、GCP(GCE)のロードバランサーはリージョン跨ぎができます。昨年10月頃?より、Developers Consoleから確認できるロードバランサーは2つになりました。

  • ネットワーク負荷分散
  • HTTP負荷分散

このうち、リージョン跨ぎロードバランサーはHTTP負荷分散の事になります。ただしこちらのロードバランサーはまだBetaとなっています。さらに正確には HTTP負荷分散は 本エントリの Cross-Region load balancing と Content-based load balancing の2つがあります。

リージョン跨ぎロードバランサーの目的

  1. 複数リージョンに割り振るが、アジア圏のユーザーのリクエストはアジアリージョンのサーバに飛ばし、早いレスポンスを保つ。
  2. リージョン間でfail-overする。例えばアジアリージョンのサーバが全滅したら、アジア圏のユーザーのリクエストは北米リージョンに飛ばす。
  3. アジアリージョンのサーバが全滅し、fail-overが発生したが、そののちアジアリージョンが復帰した。その場合、自動的に復帰する(アジア圏のユーザーのリクエストはアジアリージョンのサーバに飛ぶように)。

え、そんなことできるわけないでしょ?

エンジニアであれば、きっとそう思います。ですができるんです。どうして?と聞かれても全部は説明できませんが、確実に言える仕様を書きますと、

説明出来る部分もあるのですが、長くなるので別エントリでいずれ。

実践

まず、HTTPロードバランサーはBetaということもあり、2015/03/01時点ではDevelopers Consoleからすべての操作はできませんでした。gcloud コマンドを使わないと一部完結しない部分があるようです。ホントは全部Developers Consoleで片付けたかったのですが、真逆のコマンドベースのチュートリアル通りの平凡な内容になってます。

Cross-Region Load Balancing - Google Compute Engine — Google Cloud Platform

インスタンス複数別リージョンで作る

OSは何でもOKです、index.htmlに、自分のリージョンやホスト名がわかるような文字を書きましょう。

ロードバランサー配下にインスタンスを収める

ここからが長いステップです。まず、各オブジェクトの関連図を

https://cloud.google.com/compute/images/cross-region-load-balancing.svg

四の五の言わずにチュートリアル通りに作ってから見直しましょう。初見では意味がわかりません、きっと。ただ、これから打つコマンドはこの図を実現するものであり、作る順番は右の方から依存関係に則した順番で作るということは意識しておいたほうが良いです。

instance-group を作る

ここがDevelopers Consoleで出来ません。確かに項目としてはすでにあるのですが、どうやっても進めないステップがあったためです(もしかしたら私のオペレーションが悪いのかもしれません)。まずは gcloudコマンドのpreview機能を使えるようにします。

$ gcloud components update preview

ここから先はチュートリアルのほぼまんまです。アジアと北米にアレンジしただけです。

$ gcloud preview instance-groups --zone us-central1-a create us-resources
$ gcloud preview instance-groups --zone as-east1-b create as-resource

スペルミスです、 as-resourcesのsが漏れてます。気にしないで。注意したいところは、1 instance-group = 1 zone という点です。1 region ではなく、zoneです。そもそもAWSのAZと比較できるものではないかもしれませんが、複数のzoneに振りたいのであれば、その数だけ instance-groupを作成する必要があります。今回は各々のregionに1個ずつインスタンスを立てるので、2個だけです。

インスタンスinstance-groupに追加します。ここまではコマンド以外でも出来た気がする。

$ gcloud preview instance-groups --zone us-central1-a instances \
    --group us-resources add <北米に作ったインスタンス>
$ gcloud preview instance-groups --zone asia-east1-b instances \
    --group europe-resources <アジアに作ったインスタンス>

ここからgcloudコマンドじゃないと無理だった。そもそもDevelopers Consoleに、本項目を設定できる場所がない。

$ gcloud preview instance-groups --zone us-central1-a add-service us-resources \
    --port 80 --service http
$ gcloud preview instance-groups --zone asia-east1-b add-service as-resource \
    --port 80 --service http

http-health-checksを作る

ヘルスチェックの作成です。デフォルトのまんまなので、作って終わり。

$ gcloud compute http-health-checks create basic-check

backend-serviceを作る

今度はbackend-serviceを作成します。もくもくと作っていきます。ここもgcloudコマンドでないと出来そうで出来なかった。

$ gcloud compute backend-services create web-service \
   --http-health-check basic-check

backend-servicesに、前ステップで作ったinstance-groupを追加します。

$ gcloud compute backend-services add-backend web-service \
    --group us-resources --zone us-central1-a
$ gcloud compute backend-services add-backend web-service \
    --group as-resource --zone asia-east1-b

次はurl-mapの作成。URLによって、参照するバックエンドのサーバを変えたいのであれば、content-based routing を参照せいと書いてありますが、今回は無視。

$ gcloud compute url-maps create web-map --default-service web-service

さらに、http-proxyの作成です。直前で作った url-map を参照しています。

$ gcloud compute target-http-proxies create web-proxy --url-map web-map

そしていよいよ最後、forwarding-ruleを作ります。

$ gcloud compute forwarding-rules create http-rule --global \
    --target-http-proxy web-proxy --port-range 80

アクセスしてみるよ

その前に、私が試していたところ、実際にインスタンスのヘルスチェックが通るまで、結構時間がかかりました。しばらく待てば下記の画面が確認できます。

f:id:iga-ninja:20150301102517p:plain

こうなるまでしばし待ちます。

結果

さあ、curlで叩くよ!

アジア:OK 北米:OK

東京(LocalPC)から

$ curl 107.178.250.170
this is asia

AWSオレゴンから

$ curl 107.178.250.170
this is us1

効いてる!Geo Routing相当です!

アジア:NG 北米:OK

では早速アジアのサーバを殺します。 東京(LocalPC)から

$ curl 107.178.250.170
this is us1

AWSオレゴンから

$ curl 107.178.250.170
this is us1

アジアが死んだのでアジアからのリクエストが北米に飛びました。

アジア:OK(復帰) 北米:OK

東京(LocalPC)から

$ curl 107.178.250.170
this is asia

AWSオレゴンから

$ curl 107.178.250.170
this is us1

無事復帰しました。IPアドレス晒しましたが、しばらくしたら潰します。

まとめ

まだBeta版とは言え、本当にリージョン跨ぎが出来ます。検証については、北米を止めたケースももちろんやってますが、長くなるので割愛しました。感想も混ざってますが、一応まとめると。

  • fail-over, geo routingっぽい動き、自動復帰 これらすべて実現可能
  • global-forwarding-rule および backend-service は作成後すぐに反映ではなく、少し時間がかかる
  • 地域跨ぎの fail-over は、タイムアウト次第ではダウンタイム0ではない(10秒程度)ので、要検証
  • 今回は、auto scalingはからめていませんが、auto scalingもいけるっぽい
  • 全体を作るのは結構面倒だが、インスタンスの追加は結構簡単っぽい(後ほど検証)
  • Developers Console の対応はよ @soundTricker氏の昨年のアドカレで、フルGUIで出来ているみたいですね。おかしいな、なんでbackend-serviceへのinstance-group追加の時、出てこなかったのだろう?

googlecomputeengine - HTTP Load Balancerを使って、Host名やURIによって接続するインスタンス(群)を切り替える - Qiita

参考

動画付きです、忙しいかたはこちらの動画をみて、おおーと驚きましょう。

Google ロードバランサーのチートレベル性能検証:リージョンまたぎ編(デモあり) - apps-gcp