昨日のポストで、クラウドファーストなアーキテクチャデザインで考慮すべき3つのポイントのうちの「フェイルセーフ」についてご紹介しました。
本日は残りの2つのうち、「スケール」に関するポイントをご紹介したいと思います。
スケールに対する考慮点
クラウドをご存知である方にはもはや解説不要だと思いますが、スケールには2種類の考え方があります。
1つはハードウェア自体の性能を向上させることで、より処理能力の高いハードウェアで処理を実行するという考え方の「スケールアップ」です。
これは古くから続いてきたスケーラビリティの獲得手段であるため、猶更解説不要な手段でしょう。
もう1つは負荷に応じてリクエストを処理するハードウェアの台数を追加していく「スケールアウト」です。
これも、情報処理技術者試験の定番問題「待ち行列計算」でATMを何台設置すべきか・・・という計算をしたことがあるかと思います。
クラウドの世界ではATMではなくサーバーですが、基本的な考え方は変わりません。
クラウドの場合どうしても、低スペックのサーバーを負荷に応じてスケールアウトしていくというソリューションに偏りがちですが、アプリケーション自身の負荷を考慮すると場合によってはスケールアップによる能力向上が有効である場合があります。
インスタンスを増やしても、アプリケーションの内部処理に時間がかかりすぎているためにスループットが低下しているという状況では話になりません。
CPUやメモリ、I/Oの利用率をあらかじめ計測しておき、適切な範囲内に収まるよう、スケールアップ&スケールアウトを組み合わせてスケールすることが肝心です。
そのための「キャパシティプランニング」をアプリケーションデザインの段階で実施しておくことをお勧めします。
日単位、月単位、年単位で繁閑の差がどれだけあるかを検討し、適切にキャパシティを設定していくことで、クラウドの持つコストメリットが最大化します。
これらのプランニングに基づいた適切なキャパシティを維持するために、Windows Azureでは多くの機能が提供されています。
インスタンスサイズは、もっとも安価なコア共有型のXS(A0)から、大容量のリソースを獲得可能な「コンピューティング集中型」と言われるA9インスタンス(クラウドサービスのみ利用可)まで、10段階のマシンスペックを選択することが可能です。
これによりアプリケーションが必要とするコンピューティングリソースに応じ、最適なキャパシティを確保することができます。また、突然の高負荷が発生した際にもインスタンス追加により、自動的にスケールアウトすることができます。Windows Azureではロードバランサが標準提供されているので、複数起動された同種インスタンスによるスケールアウトは自動構成されます。
Windows Azureではスケールアウトを自動化するサービスも提供されています。一定の時間高負荷状態が続くと、あらかじめ設定してある増分のインスタンスを自動的に追加する「自動スケール」が利用可能です。また、一定の時間閾値の範囲内を下回った場合には自動的にインスタンス数を削減することも可能です。
SQLデータベースにおいては、フェデレーションサービスを利用することで1台のデータベースサーバに対する負荷を分散させることが可能ですし、ストレージへのアクセスはCDNを利用することで負荷分散することが可能です。
このようなWindows Azureの機能を活用するためにも、アプリケーションデザインの段階で、以下のポイントを検討することをお勧めします。
・キャパシティプランニングの実施
キャパシティプランニングは、特にコストダウンを目的として、現行のシステムをリプレースする際には必ず実施してください。
適切にキャパシティプランニングをし、そのプランに基づいてスケーリングさせることで、コストパフォーマンスを最大化させることが可能になります。
・適切な責務の配置(Webロール & Workerロール分割の最適化)
クラウドサービスにおいてはWebロールおよびWorkerロールの分割に注意をしてください。決して、教科書通りにWebロールとWorkerロールに分けてしまうことの無いようにしてください。多くのWebアプリケーションの場合、Webロールのみでアプリケーションを構成することが可能な場合があります。悪戯にアプリケーションをWebロールとWorkerロールに分割してしまうことで、結果的にレスポンスの低下を招く恐れがあります。Webロール内部においてMVCなどの責務の配置をすることで、メンテナンス性を高めつつパフォーマンスに考慮するようにしてください。もちろん、Workerロールが必要な場合は適切にWorkerロールに責務を配置すると良いでしょう。
・ステートレスにアプリケーションを設計
アプリケーションはスートレスにデザインするようにしてください。特にWebアプリケーションは可能な限りセッションレスでデザインするようにしてください。どうしてもセッション状態を保持する必要がある場合は、すべてのインスタンスから参照可能な分散キャッシュなどに退避すると良いでしょう。
・すべてのレイヤでスケール可能に
クラウドサービスでWebロール&Workerロールへ分割して責務を配置する場合、それぞれが独自にスケールできるよう、ロール間の連携は疎結合にしておくとよいでしょう。この際、インスタンスサイズおよびインスタンス数など、最適なスケールを選択するようにしてください。
・スケールの適切な調整(自動スケールの適用など)
クラウドサービス、Webサイト、仮想マシン、モバイルサービスでは自動スケール(プレビュー中)がサポートされています。これらのサービスを適宜活用しスケーリングを最適化することをお勧めします。クラウドサービスにおいてはWindows Azure Autoscaling Application Blockを活用することも検討すると良いでしょう。
Comments are closed here.