gRPCアプリをNetwork Load Balancerで負荷分散してみた

森永です。

先日発表されたNLB(Network Load Balancer)ですが、TCPのロードバランシングができるということで、gRPCを使って負荷分散が出来ないか試してみました。

CLB版はこちら

構成

NLBの下にgRPCのサーバーを2台用意します。
クライアントからNLBにリクエストを投げてレスポンスが返ってくるか確認します。

構成

試してみる

サーバの設定

サーバー側は、gRPCのNode版サンプルのサーバーアプリケーション("Hello world"というメッセージを返す)を使用します。
UserDataに以下を仕込むだけでセッティング完了です。
2台目は下から2行目の01部分を02にしておきます。

#!/bin/bash
yum install -y git
curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -
yum install -y nodejs
git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc/examples/node/dynamic_codegen
npm install
sed -i -e "s/call.request.name/call.request.name + \' 01\'/" greeter_server.js
node ./greeter_server.js &

50051番の口をVPC内部向けにセキュリティグループであけておく必要があります。

EC2_Management_Console 5

次に、internal NLBを作成します。(externalで試そうかと思いましたがNLBはセキュリティグループ指定が出来ないので一旦断念)
ListenポートをTCP50051番に指定、サーバーをMulti-AZで配置するのでAZまたぎのサブネットを指定します。

EC2_Management_Console 3

ターゲットグループ設定でもTCP50051番に向くように指定します。

EC2_Management_Console 2

両方「healty」になりました!

EC2_Management_Console 4

クライアントの設定

次にクライアントの設定をします。
せっかくgRPCを使うのであればNode以外の言語でやりたいので、今回はGoのクライアントを使用します。 サーバと同じくユーザデータを流し込んだらセットアップは完了です。 一番下の行の「NLBのDNS名」を実際のNLBのDNS名に書き換えて下さい。

#!/bin/bash
yum install -y git
pip install --upgrade pip
python -m pip install grpcio
python -m pip install grpcio-tools
git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc/examples/python/helloworld
sed -i -e "s/localhost/「NLBのDNS名」/" greeter_client.py

では、クライアントにSSHしてサーバへリクエストを送ってみましょう!

$ cd /grpc/examples/python/helloworld
$ python greeter_client.py
Greeter client received: Hello you 02

ちゃんといけてますね。
分散しているかどうかを確かめるために何度もリクエストを送ってみます。

$ for ((i=0;i<10;i++)); do
> python greeter_client.py
> done
Greeter client received: Hello you 02
Greeter client received: Hello you 01
Greeter client received: Hello you 02
Greeter client received: Hello you 01
Greeter client received: Hello you 02
Greeter client received: Hello you 01
Greeter client received: Hello you 02
Greeter client received: Hello you 01
Greeter client received: Hello you 02
Greeter client received: Hello you 01

クライアント側できれいに分散してくれてますね!

最後に

NLBの登場でデザインパターンが大きく変わってきそうですね。
色々検証をしていこうと思います。