Webサービスの可用性、および拡張性を考慮した構成をK5上で実現したいといった要求事項に対応するパターンです。
Webサービスの場合、サービスにアクセスできなくなる原因として、サーバダウンや、急なトラフィック増によるリソース不足が想定されます。
本パターンは、このようなサービス提供の機会損失を防ぐためのパターンです。
また、コストの面でも、必要な時に必要な仮想サーバしか使わないため、以下のような要求事項に対応します。
K5では、拡張性向上としてオートスケーリング機能があります。
また、性能向上と可用性向上として負荷分散機能があります。
この2つを組み合わせることで、サーバダウンや、急なトラフィック増によるリソース不足 (CPU、メモリ) にも
対応可能なWebサービスを構築することができます。
以下では、2台の仮想サーバの負荷が高い状態(※) になった場合に、イメージから仮想サーバを起動して、
起動した仮想サーバを 負荷分散機能 で自動で組み込む設定例を記載します。
※正確には、heatテンプレートに設定する AutoScalingGroup 内の仮想サーバの平均負荷が、
設定したしきい値より高い状態になった場合
本パターンでは、シングルAZ構成で、負荷分散かつオートスケールに対応した以下のサンプルについて記載します。
(1) オートスケールのテンプレートの設定内容
オートスケールのテンプレートでは、それぞれのセクションに以下の内容を設定します。
セクション | 内容 |
---|---|
heat_template_version | "2013-05-23" で固定 |
description | テンプレートの説明を記載する。省略も可。 省略する場合は、descriptionセクションごと削除する。 |
parameters | 同じテンプレートを複数回配備する際に、変更の可能性がある項目(フレーバー、キーペアなど)とデフォルト値を設定する。 この値は、resourcesセクションで参照される。 |
resources | オートスケールで制御する以下のようなリソースを定義する。 - 仮想サーバ (フレーバー、最小台数、最大台数、配備先のサブネット等) - ロードバランサー (性能タイプ、インターネットからのアクセス可否、配備先のサブネット等) - 負荷監視 (CPU使用率のしきい値、監視時間、異常とする検知数等) - 状態監視 (仮想サーバで起動する httpd等にアクセスして、httpd等の稼働を監視) - スケール処理 (負荷監視や状態監視でアラームがあがった場合の仮想サーバの増減処理) |
outputs | テンプレートを使ったスタックの作成/更新後に表示する内容を記載する。省略も可。 省略する場合は、outputsセクションごと削除する。 |
(2) 本パターンのテンプレートの設定内容
本パターンのテンプレートでは、以下の内容を設定します。
パラメータ名 | 設定値 | 内容 |
---|---|---|
az | "jp-east-1b" | AZを設定 |
subnet-id | (IDを設定) | 仮想サーバやロードバランサーを配備する サブネットID を設定 |
param-image-id | (IDを設定) | 仮想サーバの イメージID を設定 |
param-flavor | "S-1" | 仮想サーバの フレーバー を設定 |
key-name | "cdp_keypair2" | 仮想サーバにログインするための キーペア を設定 |
autoscale-security-group | "SG_default", "SG_Web_Local", "SG_Maintenance" | 仮想サーバ用セキュリティグループを 名称 で設定 |
lb-security-group | ("SG_default","SG_LB_Local"の ID を設定) | ロードバランサー用セキュリティグループを ID で設定 ※ロードバランサー用のセキュリティグループは名称では設定できません |
lb-name | (任意の名称) | ロードバランサー名 を設定 |
リソース名 | リソースタイプ | 設定内容 | 備考 | |
---|---|---|---|---|
基 本 設 定 | web-server-group | FCX::AutoScaling:: AutoScalingGroup | オートスケールするサーバ群の グループ化設定 | スタック作成/更新時に、 仮想サーバの起動設定 "launch_config" と ロードバランサーの起動設定 "fj-elb" に従って 仮想サーバとロードバランサーを作成 |
launch_config | FCX::AutoScaling:: LaunchConfiguration | 仮想サーバの起動設定 | ||
fj-elb | FCX::ExpandableLoadBalancer:: LoadBalancer | ロードバランサーの起動設定 | ||
ア ラ ー ム 設 定 | cpu_alarm_high | OS::Ceilometer::Alarm | スケールアウトの契機となる CPU使用率の条件設定 | CPU使用率 50%超過 で "web_server_scaleout_policy" を実行 |
cpu_alarm_low | OS::Ceilometer::Alarm | スケールインの契機となる CPU使用率の条件設定 | CPU使用率 15%未満 で "web_server_scalein_policy" を実行 | |
elb_status_abnormal | OS::Ceilometer::Alarm | ヘルスチェックの条件設定 | ヘルスチェックで異常検知 で "web_server_recovery_policy" を実行 | |
ス ケ ー ル 設 定 | web_server_scaleout_policy | FCX::AutoScaling:: ScalingPolicy | 仮想サーバの スケールアウトポリシー | アラーム検知時に仮想サーバを 1台追加 |
web_server_scalein_policy | FCX::AutoScaling:: ScalingPolicy | 仮想サーバの スケールインポリシー | アラーム検知時に仮想サーバを 1台削除 | |
web_server_recovery_policy | FCX::AutoScaling:: ScalingPolicy | 異常仮想サーバの 自動復旧用ポリシー | アラーム検知時に仮想サーバを 1台追加し、 異常となった仮想サーバ削除 |
※OS::Ceilometer::Alarm の設定と FCX::AutoScaling::ScalingPolicy の設定は、一対となるように作成してください。
※1つの FCX::AutoScaling::ScalingPolicy の設定を、複数の OS::Ceilometer::Alarm の設定で共用することはできません。
(3) resources セクションの設定内容詳細
オートスケールの基本的な設定を行うリソースと、アラーム設定とアラーム検知時の実行内容のリソースのペアの設定内容を記載します。
- 基本的な設定を行うリソース
web-server-group、launch_config、fj-elb
- CPU使用率が高い場合のアラーム設定と、アラーム検知時の実行内容
cpu_alarm_high、web_server_scaleout_policy
- CPU使用率が低い場合のアラーム設定と、アラーム検知時の実行内容
cpu_alarm_low、web_server_scalein_policy
- ヘルスチェックで仮想サーバの異常を検知するアラーム設定と、アラーム検知時の実行内容
elb_status_abnormal、web_server_recovery_policy
プロパティ | 設定値 | 内容 |
---|---|---|
AvailabilityZones | {get_param: az} | AZの設定を get_resource で参照 |
LaunchConfigurationName | {get_resource: launch_config} | 仮想サーバの設定を get_resource で参照 |
MinSize | "2" | 最小2台で設定 |
MaxSize | "6" | 最大6台で設定 |
VPCZoneIdentifier | { get_param: subnet-id } | 仮想サーバを配備する サブネット を指定 |
HealthCheckGracePeriod | "120" | ロードバランサーによるヘルスチェックを 有効 に設定 |
HealthCheckType | "ELB" | ヘルスチェックは "ELB" で固定 |
Cooldown | "750" | 次のスケール処理を行わない時間を 750秒(12分) で設定 |
LoadBalancerNames | {get_resource: fj-elb} | ロードバランサーの設定を get_resource で参照 |
プロパティ | 設定値 | 内容 | |
---|---|---|---|
ImageId | { get_param: param-image-id } | 仮想サーバの イメージID を設定 | |
InstanceType | { get_param: param-flavor } | 仮想サーバの フレーバー を設定 | |
KeyName | { get_param: key-name} | 仮想サーバの キーペア を設定 | |
SecurityGroups | {get_param: autoscale-security-group} | 仮想サーバの セキュリティグループ "SG_Web" を設定 | |
BlockDeviceMappingsV2 | 以下の子項目を設定 | 仮想サーバにアタッチするブロックストレージで起動ディスクを設定 | |
子 項 目 | source_type | "image" | イメージから作成するため "image" を設定 |
destination_type | "volume" | ブロックストレージでの利用とする "volume" を設定 | |
boot_index | "0" | "0" の場合、アタッチするボリュームを起動ディスクに指定 | |
device_name | "/dev/vda" | 仮想サーバの OS 内のデバイス名を指定 (必ず連番に指定) | |
volume_size | "40" | 容量を設定 | |
uuid | {get_param: param-image-id} | イメージID を設定 | |
delete_on_termination | true | 仮想サーバを削除した時に合わせてディスクを削除するよう設定 | |
UserData | (スクリプト) | 起動後に実行するスクリプトを設定 |
プロパティ | 設定値 | 内容 | |
---|---|---|---|
Subnets | { get_param: subnet-id } | ロードバランサーを配備するサブネット | |
SecurityGroups | { get_param: lb-security-group } | ロードバランサー のセキュリティグループ "SG_LB" を設定 | |
Listeners | 以下の子項目を設定 | ロードバランサーのリスナーの設定 | |
子 項 目 | LoadBalancerPort | "80" | ロードバランサーが待ち受けする ポート番号 を設定 |
InstancePort | "81" | 転送先の仮想サーバの ポート番号 を設定 | |
Protocol | "HTTP" | ロードバランサーが待ち受けする プロトコル を設定 | |
InstanceProtocol | "HTTP" | 転送先の仮想サーバの プロトコル を設定 | |
HealthCheck | 以下の子項目を設定 | ヘルスチェック設定 | |
子 項 目 | Target | "HTTP:81/index.html" | 仮想サーバの 81/tcp で /index.html を取得 |
HealthyThreshold | "3" | 仮想サーバが回復したと判断するアクセス成功回数を 3回 と設定 | |
UnhealthyThreshold | "3" | 仮想サーバが停止したと判断するアクセス失敗回数を 3回 と設定 | |
Interval | "10" | ヘルスチェックの実施間隔を10秒 に設定 | |
Timeout | "5" | タイムアウトを 5秒 に設定 | |
Version | "2014-09-30" | 固定値 | |
Scheme | "internal" | 内部用ロードバランサーとして "internal" を設定 | |
LoadBalancerName | { get_param: lb-name } | ロードバランサー名 |
(3-b) CPU使用率が高い場合のアラーム設定と、アラーム検知時の実行内容
プロパティ | 設定値 | 内容 |
---|---|---|
meter_name | fcx.compute.cpu_util | 仮想サーバのCPU使用率を監視するアラームを設定 |
statistic | "avg" | 統計種別:使用率は avg(平均値) を測定 |
period | "60" | 監視間隔を 60秒間 で設定 |
evaluation_periods | "1" | アラーム判定回数(しきい値超えの回数)を 1回 で設定 |
threshold | "50%" | しきい値を 50% で設定 |
alarm_actions | { get_attr: [web_server_scaleout_policy, AlarmUrl] } | しきい値超えと判定した際に行うアクション |
matching_metadata | {'metadata.user_metadata.groupname': {get_resource: 'web-server-group'}} | メタデータ検索条件(監視対象を設定) |
comparison_operator | "gt" | 条件判定式で gt:より大きい場合 を設定 |
プロパティ | 設定値 | 内容 |
---|---|---|
AdjustmentType | ChangeInCapacity | 仮想サーバの増減タイプ "ChangeInCapacity" の場合、 "ScalingAdjustment" で指定した数を追加/削除する |
AutoScalingGroupName | { get_resource: web-server-group } | スケーリングポリシーを設定するスケーリンググループを get_resource で設定 |
ScalingAdjustment | "1" | 仮想サーバの増減数 を、1台追加 で設定 |
(3-c) CPU使用率が低い場合のアラーム設定と、アラーム検知時の実行内容
プロパティ | 設定値 | 内容 |
---|---|---|
meter_name | fcx.compute.cpu_util | 仮想サーバのCPU使用率を監視するアラームを設定 |
statistic | "avg" | 統計種別:使用率は avg(平均値) を測定 |
period | "60" | 監視間隔を 60秒間 で設定 |
evaluation_periods | "1" | アラーム判定回数(しきい値超えの回数)を 1回 で設定 |
threshold | "15" | しきい値を 15% で設定 |
alarm_actions | { get_attr: [web_server_scalein_policy, AlarmUrl] } | しきい値超えと判定した際に行うアクション |
matching_metadata | {'metadata.user_metadata.groupname': {get_resource: 'web-server-group'}} | メタデータ検索条件(監視対象を設定) |
comparison_operator | "lt" | 条件判定式で lt:より小さい場合 を設定 |
プロパティ | 設定値 | 内容 |
---|---|---|
AdjustmentType | ChangeInCapacity | 仮想サーバの増減タイプ "ChangeInCapacity" の場合、 "ScalingAdjustment" で指定した数を追加/削除する |
AutoScalingGroupName | { get_resource: web-server-group } | スケーリングポリシーを設定するスケーリンググループを get_resource で設定 |
ScalingAdjustment | "-1" | 仮想サーバの増減数 を、1台削除 で設定 |
(3-d) ヘルスチェックで仮想サーバの異常を検知するアラーム設定と、アラーム検知時の実行内容
プロパティ | 設定値 | 内容 |
---|---|---|
meter_name | fcx.loadbalancing.instance.unhealthy | ヘルスチェックのアラームを設定 |
statistic | "min" | 統計種別:異常となった仮想サーバ数を数えるよう、"min"を指定 |
period | "60" | 監視間隔を 60秒間 で設定 |
evaluation_periods | "1" | アラーム判定回数(しきい値超えの回数)を 1回 で設定 |
repeat_actions | true | アクション繰り返し※ヘルスチェック機能を使用する場合は"true"を指定 |
threshold | "1" | しきい値となる異常仮想サーバの数を指定、'1' なら、1台でも異常となればスケールアウト |
alarm_actions | { get_attr: [web_server_recovery_policy, AlarmUrl]} | しきい値超えと判定した際に行うアクション |
matching_metadata | { 'resource_id': {get_param: lb-name}} | メタデータ検索条件(監視対象を設定) |
comparison_operator | "ge" | 条件判定式で ge:以上 を設定 |
プロパティ | 設定値 | 内容 |
---|---|---|
AdjustmentType | ChangeInCapacity | 仮想サーバの増減タイプ "ChangeInCapacity" の場合、 "ScalingAdjustment" で指定した数を追加/削除する |
AutoScalingGroupName | { get_resource: web-server-group } | スケーリングポリシーを設定するスケーリンググループを get_resource で設定 |
ScalingAdjustment | "1" | 仮想サーバの増減数 を、1台追加 で設定 |
テンプレートを配備すると、テンプレートで設定した内容でシステムが構築されます。
テンプレートの配備については、テンプレート配備パターン の実装サンプル 1 (2) スタックの作成 を参照してください。
負荷分散機能、オートスケール機能を利用した場合のメリット・効果は以下の通りです。
オートスケールのシステムでは、仮想サーバはテンプレートで指定したイメージから作成されます。
起動中の仮想サーバにセキュリティパッチをあてたり、ミドルウェアを導入したり、データを投入しても、ヘルスチェック等のオートスケールの処理によって、
その仮想サーバが削除されることがあります。
※オートスケールでは、仮想サーバを起動する台数のみ設定できます。
※起動した仮想サーバは自動で入れ替わる可能性があり、連続して動作しつづけるとは限りません。
そのため、仮想サーバに何らかの変更をしたい場合は、テンプレートに設定している仮想サーバのイメージ自体を変更する必要があります。
(1) オートスケールのシステムのイメージ入れ替え方法
仮想サーバのイメージは、リソースタイプ FCX::AutoScaling::LaunchConfiguration の ImageId で指定しています。
仮想サーバのイメージを変更するには、以下の手順で、ImageId を新しいイメージに変更する方式を推奨します。
なお、テンプレートから構築したシステムの作成と削除については、テンプレート配備パターン の実装サンプルの スタックの作成/削除 を参照してください。
- スタックの作成
- スタックの削除
(2) 仮想サーバの最小台数と最大台数の変更方法
仮想サーバの最小台数と最大台数は、リソースタイプ FCX::AutoScaling::AutoScalingGroup の MinSize と MaxSize で指定しています。
仮想サーバの最小台数と最大台数を以下のように変更する場合は、スタックの更新 で変更することができます。
なお、テンプレートから構築したシステムの更新については、テンプレート配備パターン の実装サンプルの スタックの更新 を参照してください。
- スタックの更新
(3) スタックの作成/削除と、スタックの更新 の使い分けについて
(1) の仮想サーバのイメージでは、スタックの作成/削除 の手順を記載しました。
これに対して (2) の 仮想サーバの最小台数と最大台数では、スタックの更新 の手順を記載しました。
テンプレートをどちらの手順で修正するかについては、プロパティが スタックの更新 により変更可能か、
システムの入替が必要か、システムを入れ替える前に動作確認が必要か を考慮して決定してください。
「HEATテンプレート解説書」 の 「付録 A リソースタイプのロパティ一覧」 の「A.1 AutoScaling」 で、
「変更可能」 欄が "○" のプロパティについては、スタックの更新 で変更することができます。
「変更可能」 欄が "空白" のプロパティについては、スタックの作成/削除 で変更することを推奨します。
「変更可能」 欄が "空白" のプロパティに対して、スタックの更新 で変更を行うことも処理としては可能ですが、
内部的にはそのプロパティに関連する仮想サーバやロードバランサー等のリソースが削除され、新しく作成される動きになります。
そのため、稼働中のシステムに対して大きな影響がありますので、「変更可能」 欄が "空白" のプロパティに対しては、
スタックの作成/削除 で変更することを推奨します。
「変更可能」 欄が "○" のプロパティであれば、スタックの更新 で変更しても、
稼働中のシステムに対してシステムの作り直し等の大きな影響を与えることはありません。
新しいシステムについて、動作確認した後に入れ替えるといった運用形態としたい場合には、スタックの更新 は利用せずに、
スタックの作成/削除 でシステムを変更することを推奨します。
スケール処理によって仮想サーバが起動された後は、次のスケール処理が不必要に連続して起動されないように、Cooldown時間を設定します。
仮想サーバが OS起動時の処理等で CPU使用率が上がってしまった場合でも、Cooldown 時間内に CPU使用率が正常化すれば、
次のスケール処理は動きません。
Cooldown 時間が適切に設定されていないと、OS起動時の処理等で仮想サーバの CPU使用率が上がってしまった場合に次のスケール処理が動き、
下図のように、MaxSize で設定した台数まで次々と仮想サーバを作成する 動きになります。
仮想サーバが作成されて、OSが起動した後は、仮想サーバが正常に稼働しているか監視するヘルスチェックが動きます。
ヘルスチェックは、OSが起動してから、HealthCheckGracePeriod で指定した時間が経過した後に開始されます。
HealthCheckGracePeriod の設定と、Cooldown 時間と、仮想サーバが正常に稼働した時点とのタイミングにより、
以下のようにオートスケールでスケール処理する/しないの挙動が変わります。
パターン | Cooldown | HealthCheck GracePeriod | オートスケールの挙動 | 備考 |
---|---|---|---|---|
パターン1 | 後 | 後 | スケールアウトしない | 望ましい設定 |
パターン2 | 前 | 後 | スケールアウトしない | たまたま問題なく動いているだけで、 設定上は問題あり |
パターン3 | 後 | 前 | スケールアウトしない | |
パターン4 | 前 | 前 | 延々とスケールアウト | NG設定 |
新しい仮想サーバが作成され、ヘルスチェックで異常となった仮想サーバが削除されます。
仮想サーバが削除されることで、MaxSize に台数が達しないため、延々と仮想サーバの作成/削除が繰り返されることになります。