GCP リージョン跨ぎロードバランサーの破壊力
知っている人は知っている、GCP(GCE)のロードバランサーはリージョン跨ぎができます。昨年10月頃?より、Developers Consoleから確認できるロードバランサーは2つになりました。
- ネットワーク負荷分散
- HTTP負荷分散
このうち、リージョン跨ぎロードバランサーはHTTP負荷分散の事になります。ただしこちらのロードバランサーはまだBetaとなっています。さらに正確には HTTP負荷分散は 本エントリの Cross-Region load balancing と Content-based load balancing の2つがあります。
リージョン跨ぎロードバランサーの目的
- 複数リージョンに割り振るが、アジア圏のユーザーのリクエストはアジアリージョンのサーバに飛ばし、早いレスポンスを保つ。
- リージョン間でfail-overする。例えばアジアリージョンのサーバが全滅したら、アジア圏のユーザーのリクエストは北米リージョンに飛ばす。
- アジアリージョンのサーバが全滅し、fail-overが発生したが、そののちアジアリージョンが復帰した。その場合、自動的に復帰する(アジア圏のユーザーのリクエストはアジアリージョンのサーバに飛ぶように)。
え、そんなことできるわけないでしょ?
エンジニアであれば、きっとそう思います。ですができるんです。どうして?と聞かれても全部は説明できませんが、確実に言える仕様を書きますと、
- ロードバランサーのIPアドレスは1つです。全リージョンに跨っていても1つです。
- Geo Routingしません。ユーザーのアクセスするIPアドレスは全世界共通で1つです。DNSでもAレコード1つでOKです。
- ロードバランサーのエンドポイントは生IPアドレスで、不変です。
- ロードバランサーの下のサーバに来るリクエストは、エンドユーザーの生IPとなります。
説明出来る部分もあるのですが、長くなるので別エントリでいずれ。
実践
まず、HTTPロードバランサーはBetaということもあり、2015/03/01時点ではDevelopers Consoleからすべての操作はできませんでした。gcloud
コマンドを使わないと一部完結しない部分があるようです。ホントは全部Developers Consoleで片付けたかったのですが、真逆のコマンドベースのチュートリアル通りの平凡な内容になってます。
Cross-Region Load Balancing - Google Compute Engine — Google Cloud Platform
インスタンスを複数別リージョンで作る
OSは何でもOKです、index.htmlに、自分のリージョンやホスト名がわかるような文字を書きましょう。
ロードバランサー配下にインスタンスを収める
ここからが長いステップです。まず、各オブジェクトの関連図を
四の五の言わずにチュートリアル通りに作ってから見直しましょう。初見では意味がわかりません、きっと。ただ、これから打つコマンドはこの図を実現するものであり、作る順番は右の方から依存関係に則した順番で作るということは意識しておいたほうが良いです。
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
アクセスしてみるよ
その前に、私が試していたところ、実際にインスタンスのヘルスチェックが通るまで、結構時間がかかりました。しばらく待てば下記の画面が確認できます。
こうなるまでしばし待ちます。
結果
さあ、curlで叩くよ!
アジア:OK 北米:OK
東京(LocalPC)から
$ curl 107.178.250.170 this is asia
$ curl 107.178.250.170 this is us1
効いてる!Geo Routing相当です!
アジア:NG 北米:OK
では早速アジアのサーバを殺します。 東京(LocalPC)から
$ curl 107.178.250.170 this is us1
$ curl 107.178.250.170 this is us1
アジアが死んだのでアジアからのリクエストが北米に飛びました。
アジア:OK(復帰) 北米:OK
東京(LocalPC)から
$ curl 107.178.250.170 this is asia
$ 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
参考
動画付きです、忙しいかたはこちらの動画をみて、おおーと驚きましょう。