zabbix で vmc stats の情報など監視してオートスケール風に動かしてみました。
DTS 大西
自己紹介• 大西正太 (株) DTS @shouta_dev• Rails 歴 7 年位
– 自社サービス グループウェア (2006 ~ )• http://www.bizca.jp
– 受託開発色々• 普通の Rails• Heroku 上アプリ (6 dyno)
• 自転車が大好き!• お酒が大好き!• 岩ガキが大好き!• 生肉が大好き!
今日の内容• Zabbix で CloudFoundry のインスタンスを試し
にオートスケールしてみました• 連携できるか見たかっただけでさほど突き詰めて
ないですが、あまり突っ込まないでください!
×
オートスケール ?
• 負荷が高くなってきたら自動的にスケールアウトする機構
• 突然の負荷上昇に自動対応• CloudFoundry には現状ない ?• サーバ側の何らかのメトリクスが閾値を超えた
らスケールアウトを発動させる– レスポンスタイム– CPU 、メモリ– プロセス数– スコアボードなど
Zabbix
• オープンソースの監視ソフト• Item を監視し Trigger 条件
を満たしたら Action を実行するという構造
ItemTrigg
erAction
今回やること• vmc stats の Item 種別を追加する
– エージェント拡張の機構を用いることで Item の種別を追加できる
• vmc instances でスケールアウトする Action を追加する– Action はシェルコマンドを定義できる
監視対象
CPU Item
メモリItem
Trigger
条件
メール通知
Action
スケールアウトAction
Trigger
条件vmc stats
Item
vmc stats?• vmc statsで該当アプリケーションのリソース状況を取得できる
$ vmc stats xxx
+----------+-------------+----------------+--------------+----------------+| Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime |+----------+-------------+----------------+--------------+----------------+| 0 | 0.0% (4) | 23.1M (128M) | 56.0K (2G) | 0d:18h:53m:10s || 1 | 0.0% (4) | 18.0M (128M) | 52.0K (2G) | 0d:17h:42m:5s |+----------+-------------+----------------+--------------+----------------+
• vmcコマンドはCloudControllerのWebAPIを叩いてJSONで結果受け取り
[{:state=>:RUNNING, :stats=>{:name=>“xxx", :host=>"172.30.49.137", :port=>40538, :uris=>[“xxx.cloudfoundry.com"], :uptime=>71329.371288281, :mem_quota=>134217728, :disk_quota=>2147483648, :fds_quota=>256, :cores=>4, :usage=>{:time=>"2012-08-23 02:40:58 +0000", :cpu=>0.0, :mem=>23660.0, :disk=>57344}}, :instance=>0}, {:state=>:RUNNING, :stats=>{:name=>"shoutahello", :host=>"172.30.50.23", :port=>28052, :uris=>["shoutahello.cloudfoundry.com"], :uptime=>67064.368383474, :mem_quota=>134217728, :disk_quota=>2147483648, :fds_quota=>256, :cores=>4, :usage=>{:time=>"2012-08-23 02:40:57 +0000", :cpu=>0.0, :mem=>18428.0, :disk=>53248}}, :instance=>1}]
vmc stats 用 Item 種別追加■API 叩く簡単な自作スクリプト#vmc_stats.rbrequire 'cli'opt = { :target => 'api.cloudfoundry.com', :email => '[email protected]', :password => 'xxxx', :appname => 'xxxx'}
client = VMC::Client.new(opt[:target], nil)token = client.login(opt[:email], opt[:password])
stats = client.app_stats(opt[:appname])
sum = 0.0stats.each do |stat| sum += stat[:stats][:usage][:cpu].to_fend
average = sum / stats.length# 標準出力に数値を出力puts average
■Item 種別の追加#/etc/zabbix/zabbix-agentd.conf に追
記する
UserParameter=cloudfoundry.vmc.stats,ruby /home/zabbix/vmc_stats.rb
※vmc コマンド直接ではなく vmc 内部のクラスを利用→ コマンドはログイン情報をファイルに保持するため、複数の cloudfoundry アカウントで監視したい場合などに動きがおかしくなりそうだと考えたため
Item の作成• 普通のCPU監視などと同様に、画面か
らcloudfoundry.vmc.statsを指定してItemを作成
• Itemのグラフを定義するとグラフ表示!
※ 今回30秒毎の監視で指定
Trigger 定義• Zabbix 書式で閾値を定義
Action 定義■ スケールアウト自作スクリプト(徐々にスケールアウト )#vmc_instances.rbrequire 'cli'
opt = { :target => 'api.cloudfoundry.com', :email => ‘[email protected]', :password => ‘xxxx', :appname => ‘xxxx'}
client = VMC::Client.new(opt[:target], nil)token = client.login(opt[:email], opt[:password])
app = client.app_info(opt[:appname])current_instances_num = app[:instances]
cmd = VMC::Cli::Command::Apps.newcmd.client(client)
if current_instances_num <= 5 cmd.instances(opt[:appname], "+1")end
負荷掛けてみる• Jmeter で負荷• CPU を消費するシンプルアプリ– 負荷掛けると Trigger 検知されて画面に出る
require 'sinatra'get '/' do 100000000.times{}end
オートスケールしてる• スケールアウトが自動実行されて性能改
善している
2 86 170 254 338 422 506 590 674 758 842 926 1010109411781262134614301514159816820
500
1000
1500
2000
2500
3000
3500
4000
12510
Jmeterスレッド数
リクエスト数
スケールアウト
段になっている
実用するには ?• vmc stats で返ってくる CPU の精度が怪しい?
• 平均値を返してるのか、使用率の上下が即時反映されない?• そもそも Item は CPU でいいのか?
– CPU は AP がボトルネックという切分にはなるけど…– レスポンスタイムとか
• Zabbix の Web 監視で実現可能– 同時処理中のインスタンス数とか
• そもそも取れる? Router とか持ってない?• varz の情報にもないっぽい?
– 複合条件• Zabbix の Trigger で定義可能
• 歯止めの対応– 連続で高負荷検知の場合スケールアウトとか
• Zabbix の Trigger で定義可能• スケールインの対応
• Zabbix の Trigger で定義可能