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システム?