LB+EC2のオートスケールを制御・可視化させる旅、ついに完結。ご愛読ありがとうございました、id:kmuto 先生の次回作にご期待ください。
第1部はMackerelのホストメモに書いたら何かを実行するという仕組み作り。
第2部はHTTPリクエストパスで受け付けるとstressコマンドで負荷を自分にかける、アブないWebサーバーの実装。
そして今回の第3部では、リクエスト粒度を指定して、ロードバランサーに対してリクエストするデーモンを実装。
時間ごとのおおまかなリクエスト回数を設定しておくと、少しランダムに回数を調整しながらHTTPリクエストを実行する。あまり細かすぎると指定が面倒なのと、いずれにせよオートスケールが反応してくるまでは時間がかかるので、5分単位でひとまず設定している(1分単位で指定することもできる)。
READMEにも書いているけど、設定はたとえばこんな感じ。
LB_URL = 'http://alb.internal.example.com/stress/1/5' MINUTES = 5 MINUS_RANGE = 5 @config = { 'lowload' => [20], 'highload' => [90], 'spike' => [90, 90, 100, 90, 20, 20, 20, 10, 10, 20, 20, 10, 10, 20], 'smallspike' => [100, 50, 20, 20, 10, 10, 20, 20, 10, 10, 20], 'wave' => [20, 20, 30, 30, 40, 40, 50, 50, 60, 60, 70, 70, 80, 80, 90, 80, 80, 70, 70, 60, 60, 50, 50, 40, 40, 30, 30] } DEFAULT_MODE = 'smallspike'
smallspike
であれば[100, 50, 20, 20, 10, 10, 20, 20, 10, 10, 20]
がリクエスト設定で、1分目〜5分目は「100 - (ランダムに0〜5) 回のリクエスト」を毎分実行、6分目〜10分目は「50 - (ランダムに0〜5) 回のリクエスト」を毎分実行、……となる。最後まで進んだらまた最初に戻る。
ホストメモを見て判断しているので、たとえばlowload
とホストメモに書いたら、「20 - (ランダムに0〜5)回のリクエスト」が毎分実行されるように変化する。
パワーのないバックエンドを前提にしているため、実行するリクエスト数はかなり少ないものになっている(サンプル設定では多くて100/分)。
何かの本番Webサービス向けなどにもっと多いものにすることができるかどうかは、saba-load-requesterを実行する環境での許容度によってくる。大量のGETリクエストを1箇所で発行すると、送信側なり経路なり受信側なりでブロックされる可能性もある。
たとえばmkr
の呼び出しのところをいじって、環境変数MACKEREL_APIKEY
およびホストIDを指定しておけば、別に自身のmackerel-agentに頼らずともどこでもホストメモを見られるので、リクエスタを分散して制御するという手法もとれるだろう。……ってなんてDDoSシステム?