先日、Amazon の新機能として3つの機能が追加されました。
- CloudWatch インスタンス、Load Balacing の負荷データを取得できる。
- Auto Scaling CloudWatch のデータからインスタンスの起動、停止を自動で行う。
- Elastic Load Balancing そのままロードバランサー。
新しいプロジェクトで、Amazon EC2 を利用して、大規模なユーザサービスを行うシステムを構築しています。
その一環で、3つの新機能を検証しました。
検証として以下の要件を定義します。
EC2 で利用する Image を作成して、登録済みであることを前提としています。
Image は自動的にウェブサーバを起動するようにしておきます。
- Load Balancing 対象のサーバは最大3台のウェブサーバとする。
- 開始時は1台で運用し負荷に応じて自動的に3台までスケールアウトする。
- 負荷が収まれば、負荷に応じて自動的に台数を減らす。
ロードバランサの作成
Auto Scaling で、Load Balancing を利用するため、まずロードバランサを作成します。
コマンドラインツールは下記から取得します。
http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=88
$ elb-create-lb KrayLoadBalancer --availability-zones us-east-1a \ --listener "protocol=HTTP,lb-port=80,instance-port=80"
- lb-port ロードバランサのポート
- instance-port インスタンス側のポート
ロードバランサだけを使うだけなら、elb-register-instance-with-lb でインスタンスを登録します。
今回は Auto Scaling で自動的に登録させるため、使用しません。
下記のようにすることでロードバランサのホスト名を確認できます。
$ elb-describe-lbs KrayLoadBalancer LOAD-BALANCER KrayLoadBalancer KrayLoadBalancer-xxxxxxx.us-east-1.elb.amazonaws.com 2009-05-21T22:01:34.870Z
インスタンスの起動設定の作成
インスタンスの起動設定とは、Image、インスタンスのタイプ、Kye Pair の指定などの設定を登録しておき、
自動起動時にその設定を元にインスタンスを作成します。
$ as-create-launch-config KrayConfig --image-id ami-xxxxxx \ --instance-type m1.small --key lb_test
- launch config 起動設定の名前
- image-id サーバが自動起動するように作成した Image
- key 今回検証で利用する Key Pair
Auto Scaling Group の作成
Auto Scaling Group の作成でインスタンスが登録されるグループの動作を設定されます。
開始時の台数、最大何台まで自動起動させるか、登録先のロードバランサの名前など。
$ as-create-auto-scaling-group KrayGroup --availability-zones us-east-1a \ --launch-configuration KrayConfig --max-size 3 --min-size 1 \ --load-balancers KrayLoadBalancer $ as-set-desired-capacity KrayGroup --desired-capacity 1
- max-size Auto Scaling Group の最大サーバ数
- min-size Auto Scaling Group の最小サーバ数
もう一つのコマンドである as-set-desired-capacity は推奨台数の設定となります。
負荷が減っていった時に as-set-desired-capacity の台数に落ち着きます。
ここで min-size=1, desired-capacity=1 となっているため、自動的に一台起動されます。
Trigger の作成
Auto Scaling Group を設定したままでは、初期の一台のみが起動されたままで負荷に応じて自動起動はされません。
自動起動の設定をするには、Trigger を作成する必要があります。
この Trigger を作成することで、条件に応じてインスタンスの起動を行ったり、停止を行ったりします。
内部的には CloudWatch で負荷を調べて発動しているようです。
$ as-create-or-update-trigger KrayTrigger --auto-scaling-group KrayGroup \ --measure CPUUtilization --breach-duration 120 \ --dimensions "AutoScalingGroupName=KrayGroup" \ --namespace AWS\/EC2 --lower-breach-increment "-50%" \ --lower-threshold 20 --period 60 --statistic Average \ --upper-breach-increment "1" --upper-threshold 80
- period 負荷の計測タイミング(秒)
- breach-duration 設定された時間の間、閾値を超えると Trigger が発動(秒)
- measure 指標、CPU, network I/O, disk I/O
- namespace AWS/EC2 or AWS/ELBを指定。ELBの方ではロードバランサの指標を使用できる。
- lower-threshold 値を下回るとlower-breach-incrementで指定されたインスタンス数にする
- upper-threshold 値を上回るとupper-breach-incrementで指定されたインスタンス数にする
- lower-breach-increment 整数か%で指定。%では最大からの%か現在の値の%なのかは不明
- upper-breach-increment 整数か%で指定。%では最大からの%か現在の値の%なのかは不明
lower-branch-increment ですが、現在のツールでは、なぜか負の整数の指定が出来ません。
そのため、上記では % で指定してあります。
また CPUUtilization は CPU の負荷を元に計測しているとは思いますが複数のサーバからどのように負荷を計測しているかは不明です。検証では一台のサーバに負荷をかけて、CloudWatch で負荷値を確認し、80 を超えると二台目が起動。
これは問題ないのですが、その後、片方のサーバに負荷をかけ続け、負荷値 80 以上にしておき、
もう片方は何もしないままで、負荷値 0.5 でも三台目が起動することを確認しました。
ロードバランサの動作検証
Auto Scaling でロードバランサに登録されたインスタンスにアクセス出来るかを確認します。
「ロードバランサの作成」で確認したホスト名にブラウザからアクセスします。
http://KrayLoadBalancer-xxxxxxx.us-east-1.elb.amazonaws.com
3台のサーバにアクセスが来ていることを確認できると思います。
負荷が減り、Auto Scaling が行われれば、ロードバランサに登録されているインスタンスも削除されます。
また複数台が起動中に、一台のインスタンスの httpd を停止させると、そのサーバにはアクセスしなくなります。
まとめ
実際にやってみると、ここまで簡単に出来るのかと驚きました。
多分今回のプロジェクトで採用することになるでしょう。
ただ自動起動されたインスタンスに書かれたログをどこに置くかなど、
まだ細かい部分を調整する必要があります。
始まったばかりなので信頼性という点では不安が多いですが、これからが楽しみなサービスです。
※ 今回ブログに書いたのはウェブサーバのみでしたが、Amaozn EC2 上で MySQL Cluster
を構築して、SQL Server を動的に追加出来るかを検証しましたが問題なく出来ました。
このエントリーに対するコメント
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
「いいね!」で応援よろしくお願いします!