FJcloud実践
負荷に応じてサーバーを自動的に増減する「オートスケール」を活用する
クラウドでは、オンデマンドにリソースを増減できます。必要な時に必要なだけのリソースを即座に確保できるというのは、オンプレミスでは実現が難しい、クラウドならではのメリットだと言えるでしょう。例えばシステムに対する負荷が高まった時にサーバー数を増やせば、システムダウンを回避し、機会損失を防ぐこともできます。逆に負荷が低くなった時はサーバー数を減らすことで、コストの削減が可能です。
こうしたサーバーの動的な増減を、自動的に行う機能が「オートスケール」です。オートスケールは、以前紹介したロードバランサー配下のサーバー数を調節することで行います。本記事ではFJcloud-Vにおけるオートスケールについて解説します。
サーバーのイメージ化
オートスケールでは、負荷に応じて自動的にサーバーが増減します。起動したサーバーに対して、都度運用担当者が手動で設定を行うようなことはしません。そのため新しく起動したサーバーは、即座に運用可能な状態となっている必要があります。そこで必要となるのが、カスタマイズ済みのイメージの準備です。
FJcloud-Vでは、様々なOSがインストールされた、サーバーのイメージを標準で用意しています。ですが多くのシステムでは、このイメージをそのまま使うわけではなく、システムに必要なミドルウェアやアプリケーションをインストールしてから使うことになるでしょう。前述の通りオートスケールでは、自動的に起動したサーバーはそのままロードバランサー配下に組み込まれ、即座に稼動することが求められます。そのためあらかじめ必要なアプリをインストールし、セットアップが完了した状態のイメージを作っておく必要があるのです。
イメージを作るには、まずイメージ作成用のサーバーを起動し、必要なアプリのインストールなどのセットアップ作業を完了します。そしてそのサーバーを「イメージ化」します。ここでは例として、Ubuntu 22.04 LTSをベースに、Webサーバーが動作するイメージを作成してみましょう。まず通常通り、Ubuntu 22.04 LTSのサーバーを起動します。サーバーにログインし、以下のコマンドを実行して、nginx Webサーバーをインストールしてください。
# apt update
# apt install -y nginx
必要なセットアップ作業が完了したら、サーバーをイメージ化しましょう。サーバー一覧から対象のサーバーを選択し、メニューから「イメージとして保存」を実行します。 なおイメージ化はサーバーが起動した状態でも行うことができます。
以下の画面が表示されますので、作成するイメージの名前と保存先のゾーンを設定してください。またイメージには、任意のメモをつけることができます。「削除オプション」は、イメージ作成後にベースとなったサーバーを削除するかどうかの選択です。もう必要がないのであれば、コスト的にもサーバーは削除してしまうのがよいでしょう。逆にイメージの動作確認を行いながら、さらに調整を行うような場合は、削除しない方が便利です。
作成されるイメージの確認が表示されます。問題がなければ「保存する」をクリックしてください。
作成されたイメージは、「OSイメージ」にリストアップされます。ステータスが「利用可能」になっていることを確認してください。また念の為、作成したイメージからサーバーを起動して、正しく動作するか(この例ではWebサーバーが自動的に起動するか)確認しておくことをお勧めします。
サーバーのイメージ化は、ディスクを増設しているサーバーでも実行できます。ただし増設ディスクとVMインポートの超過分の合計が、300GB以内という制限がある点に注意してください。
ロードバランサーの作成
ロードバランサーの記事を参考に、あらかじめロードバランサーを作成しておいてください。なお配下に配置するサーバーはまだ起動していないため、この時点では割り当てるサーバーは指定しません。
オートスケールの設定
それではいよいよオートスケールを作成しましょう。「コンピューティング」→「オートスケール」を開き、「オートスケールの作成」をクリックします。
まず最初に、使用するイメージを選択します。先ほど作成した、nginx入りのUbuntuのイメージを選択してください。
続いて起動するサーバーのタイプを選択します。用途やシステムの負荷に応じて、適したタイプを選択してください。
オートスケールの基本設定を行います。まずオートスケールに任意の名前をつけてください。複数のオートスケールを設定するのであれば、混同しないよう、わかりやすい名前をつけましょう。
「トリガー」には、オートスケールが発動する条件を指定します。ここではサーバーのCPU使用率が50%異常の状態が、10分間継続した場合にスケールアウトする設定としました。「縮退する間隔」は、負荷が下がってオートスケールの条件を満たさなくなってから、実際に縮退(サーバーの台数を減らす)を開始するまでの時間です。ここでは20分後としました。このあたりのチューニングは難しいため、本番環境では負荷テストをしながら、丁度いい値を探ってみてください。ここを適当に設定してしまうと、負荷が上がる → オートスケールがトリガーされてサーバーが増える → それによって負荷が下がる → 負荷が下がったので縮退がトリガーされてサーバーが減る → サーバーが減ったので負荷が上がる → 繰り返し、という無限ループに陥ってしまうことがあるためです。
スケールアウトするサーバーの台数と寿命を設定します。
「スケールアウト最小台数」は、オートスケールがトリガーされてない状態の最小台数です。対して「スケールアウト最大台数」は、スケールアウトがトリガーされた際に、最大何台までサーバーを増やすかです。ここでは最低を1台、最大を2台としました。これによって、常に最低1台のサーバーが起動しており、オートスケールの条件を満たした時(ここではCPU負荷が30%以上の状態が継続した時)にサーバーが1台追加され、最大2台となります。また1回の増減台数も設定できます。ここでは1台としましたが、一度のスケールアウトで複数台のサーバーを一気に増やすことも可能です。「スケールアウトサーバーの寿命」は、オートスケールによって追加されたサーバーの寿命です。ここで設定した時間が経過すると、縮退条件を満たさなくてもサーバーが削除されます。これによって、サーバーが立ち上がりっぱなしになるという状況を防ぐことが可能です。最後に、起動したサーバーを組込むロードバランサーを選択します。ここでは先ほど作成しておいたロードバランサーを指定しました。
オートスケールは負荷によるトリガーだけでなく、スケジュールを指定して実行することも可能です。
例えば勤怠管理システムのように、毎日9時と18時にだけアクセスが集中することがわかっているようなシステムもあるでしょう。オートスケールは負荷が上昇してから、実際にトリガーされるまで、10分程度のタイムラグが生じます。そのため負荷が上昇するタイミングがあらかじめ決まっているのであれば、負荷をトリガーとしてオートスケールするよりも、あらかじめスケジュールを決めて、事前にスケールしてしまう方がお勧めです。なお今回は特にスケジュールは指定しません。
最後に、オートスケールの設定の確認が表示されます。
問題がないか確認してから、オートスケールを作成してください。
オートスケールの動作確認
オートスケールの作成直後は、当然サーバーは0台となっています。
ですが先ほどオートスケールのルールで、サーバーの最低台数を1台と設定しました。そのためオートスケール作成後しばらくすると、自動的にサーバーが1台起動され、指定したロードバランサーに組込まれます。なお起動するサーバーには、自動的に「イメージ名_番号」という名前がつけられます。
ロードバランサーにアクセスしてみましょう。Ubuntuにnginxをインストールした状態でイメージ化しているため、オートスケールによって自動的に起動したサーバーでも、nginxが動作していることがわかります。
続いて、サーバーに負荷をかけて、オートスケールが実際にトリガーされることを確認しましょう。起動したサーバーにSSHでログインして、以下のコマンドを実行してください。これはstress-ngというコマンドを使い、CPUに対して負荷をかけています。
# apt update
# apt install -y stress-ng
# stress-ng -c $(nproc)
CPUに30%以上の負荷をかけた状態を10分以上継続すると、オートスケールがトリガーされて、サーバーが2台になることが確認できます。
スケールアウトが完了した状態でロードバランサーにアクセスすると、アクセスがそれぞれのサーバーに振り分けられます。それぞれのサーバーにログインして、nginxのログから、実際にアクセスが振り分けられていることを確認してみましょう。
このようにサーバーを増やし、ロードバランサーを介してアクセスを分散することで、システム全体への負荷を下げることができます。
まとめ
繰り返しになりますが、クラウドのメリットは動的なリソースの確保です。これによりシステムを増強して機会損失を回避したり、無駄なサーバーを削減してコストを最適化できます。しかし変動する負荷を人間が監視し、その都度運用担当者が手動で構成を変更するのは大変です。ですがオートスケールを導入することで、こうした面倒な調整作業を自動化することができます。クラウドのメリットを最大限に活かすためにも、オートスケールの導入を検討してみてください。