こんにちは。
GMOアドマーケティングの@zakisanbaimanです。
GCEマネージドインスタンスのオートスケールを用いる際、クールダウン期間を指定できるので実際にどんな動きをするのか確認してみます。
クールダウン期間とは
インスタンス生成してから再度オートスケール指標を取得するまでの期間。デフォルトは60秒。
初期化時間よりも短過ぎても長過ぎても良くないらしく、ちゃんと初期化時間を計測して設定すべきとのこと。
公式ドキュメント「クールダウン期間」
確認したいこと
アプリケーションが起動する前にクールダウン期間に入ると更にインスタンスが追加されるのか?
結論
ヘルスチェックで「異常」となったまま、更にインスタンスは追加されない。
【パターン1】クールダウン期間 > アプリケーション起動時間
まずは通常パターン。
アプリケーション起動時間がクールダウン期間に収まる場合はどのような挙動になるのか。
テストするため、まずは以下手順でWebサーバを立てます。
- イメージ作成
- インスタンステンプレート作成
- インスタンスグループ作成
- ヘルスチェック作成
- ロードバランサ作成
- バックエンド追加
▼構成図
※上記画像は当社が作成したもの
(draw.ioで作成)
イメージ作成
イメージを作成するため、まずLinuxインスタンスを作成し、Apacheをインストールします。
Apacheのインストール
1 2 |
sudo apt-get update && sudo apt-get install apache2 -y echo '<h1>Hello World!</h1>' | sudo tee /var/www/html/index.html |
上記インスタンスを元にイメージを作成していくので、スナップショットを保存しておきます。
スナップショットからイメージを作成しておきます。
インスタンステンプレート作成
作成したイメージを指定。
インスタンスグループ作成
以下で設定します。
クールダウン期間:15秒(最短)
インスタンスの最大数:8(無料枠の最大)
作成したテンプレートを指定。
ヘルスチェック作成
デフォルトの設定のまま作成。
ロードバランサ作成
バックエンドの設定でインスタンスごとの最大RPSを200RPSに設定。
これは後に設定するApache Benchのリクエスト数が340RPS(秒間リクエスト数)になるので、ちょうど2インスタンスにスケールアウトされることを期待するため。
最初は1台だけ動いています。
実際にリクエストを流す
リクエスト実行にはApache Benchを使います。
CentOS7のVMインスタンスを作成し、Apache Benchをインストールします。
マシンタイプ:n1-standard-1(vCPU x 1、メモリ 3.75 GB)
1 |
sudo yum install httpd |
しばらくずっとリクエストを送ってほしいため、1スレッドで1,000万リクエストを送ります。
使ったマシンスペックでは340RPSを安定して送れていました。
1 |
ab -n 10000000 -c 1 http://34.107.161.131/ |
結果
特に問題なく、数分で1台スケールアウトされました。
【パターン2】クールダウン期間 < アプリケーション起動時間
では続いてクールダウン期間内にアプリケーションが起動しなかった場合を確認します。
インスタンステンプレート作成
インスタンス起動時、Apacheを停止させてヘルスチェックが通らないようにします。
こうすることでスケールアウトされてもRPSで負荷分散できないため、更に追加でスケールアウトされてしまうと予想します。
ロードバランサ作成
先程とは別のロードバランサ、別のインスタンスグループを作ります。
実際にリクエストを流す
Apache Benchでパターン1と同様のリクエストをURLを変えて流します。
1 |
ab -n 10000000 -c 1 http://34.107.231.234/ |
インスタンスが1台追加されましたが、Apacheが止まっているので当然ヘルスチェックが通らない状態です。
このままクールタイム期間(15秒)待ちますが、更にインスタンスが追加される気配はありません。
(このまま30分ほど放置しましたが、この状態のまま何も変わりませんでした。)
止まっていたApacheを起動させてやると、ヘルスチェックが通ってインスタンス2台にリクエストが流れるようになりました。
想定ではヘルスチェックが通っていなければ、必要なインスタンス分更に追加されると思っていましたが違っていたようです。
ただ公式ドキュメントによると以下の記載があるため、初期化時間を計測し、狙ってクールダウン期間を設定するのが無難そうです。
インスタンスの初期化中は、その使用状況に関する情報が通常の状況を反映していないことがあり、使用状況に関する情報に基づくオートスケーラーの判断は信頼性に欠ける可能性があるため、初期化中のデータは除外することをおすすめします。
引用元 | クールダウン期間、2020/05/29、Compute Engine ドキュメント https://cloud.google.com/compute/docs/autoscaler/understanding-autoscaler-decisions?hl=ja
参考
Apacheのインストール
公式ドキュメント「オートスケーラーの判断」
公式ドキュメント「クールダウン期間」