Varnish 3 で複数台のサーバーをロードバランシングしていた時に、各サーバのヘルスチェック結果を確認する方法メモ。
確認には varnishlog と varnishadm を使う。
サーバ構成
server1(localhost:8001)
, server2(localhost:8002)
, server3(localhost:8003)
という3台のサーバをラウンドロビンでロードバランスする。
Varnish3の設定
probe ディレクティブでヘルスチェック条件を定義
/healthcheck
に GET し(url
)、直近 5 回のアクセスで(window
) 3 回以上 200 OK なら(threshold
) healthy とみなすことにする。
# /etc/varnish/default.vcl probe healthcheck { # What URL should varnish request. .url = "/healthcheck"; # How often should we poll .interval = 10s; # What is the timeout of the probe .timeout = 1s; # Varnish will maintain a sliding window of the results. Here the window has five checks. .window = 5; # How many of the .window last polls must be good for the backend to be declared healthy. .threshold = 3; # How many of the of the probes a good when Varnish starts - defaults to the same amount as the threshold. .initial = 3; } backend server1 { .host = "127.0.0.1"; .port = "8001"; .probe = healthcheck; } backend server2 { .host = "127.0.0.1"; .port = "8002"; .probe = healthcheck; } backend server3 { .host = "127.0.0.1"; .port = "8003"; .probe = healthcheck; } director web round-robin { { .backend = server1; } { .backend = server2; } { .backend = server3; } } sub vcl_recv { set req.backend = web; }
server1-3
server1 は常に 200 OK を返すようにする
server2 は程よくエラーになってほしいので 1/3 の確率で 200 OK
, 404 Not Found
, 500 Internal Server Error
のいずれかを返すようにする。
server2 の実装例
# server2.py # $ python server2.py import tornado.ioloop import tornado.web import random class MainHandler(tornado.web.RequestHandler): def get(self): self.set_status(random.choice((200, 404, 500))) self.write("") application = tornado.web.Application([ (r"/healthcheck", MainHandler), ]) if __name__ == "__main__": application.listen(8002) tornado.ioloop.IOLoop.instance().start()
server3 は常に落としておく。
varnishlog でリアルタイムモニター
Varnish のログや統計情報は共有メモリにある。
varnishlog
コマンドでこのログをリアルタイムにのぞきこむ。
] # varnishlog 0 CLI - Wr 200 19 PONG 1421941463 1.0 0 Backend_health - server3 Still sick ------- 0 3 5 0.000000 0.000000 0 Backend_health - server2 Still sick 4--X-R- 1 3 5 0.008984 0.000611 HTTP/1.1 404 Not Found 0 Backend_health - server1 Still healthy 4--X-RH 5 3 5 0.003310 0.002184 HTTP/1.1 200 OK 0 CLI - Rd ping
この Backend_health
のフィールドを含む行が varnish デーモンからオリジンサーバへのヘルスチェック結果。
ヘルスチェック結果だけを知りたい場合は Backend_health
タグでログを絞り込む。
] # varnishlog -i Backend_health 0 Backend_health - server3 Still sick ------- 0 3 5 0.000000 0.000000 0 Backend_health - server2 Still sick 4--X-RH 2 3 5 0.003641 0.001368 HTTP/1.1 200 OK 0 Backend_health - server1 Still healthy 4--X-RH 5 3 5 0.002886 0.002359 HTTP/1.1 200 OK
重要なフィールドを順に解説
Backend_health
ログのタグ
server1
Name of backend
Still healthy
ヘルスステータス。
Still healthy/Still sick/Back healthy/Went sick のいずれか
4–X-RH
各桁はフラグを表す
- 4 — IPv4 connection established
- 6 — IPv6 connection established
- x — Request transmit failed
- X — Request transmit succeeded
- s — TCP socket shutdown failed
- S — TCP socket shutdown succeeded
- r — Read response failed
- R — Read response succeeded
- H — Happy with result
2 3 5
左から順に
- 直近の .
window
回の probe で health ok だった数 - probe の
threshold
- robe の
window
0.002886 0.002359
レスポンス時間 と平均(r=4)
HTTP/1.1 200 OK
HTTP レスポンス
varnishadm でサマリーを確認
varnishadm コマンドで過去64回のヘルスチェックログのサマリーを確認する。
] # varnishadm -S /etc/varnish/secret debug.health Backend server1 is Healthy Current states good: 5 threshold: 3 window: 5 Average responsetime of good probes: 0.002704 Oldest Newest ================================================================ 4444444444444444444444444444444444444444444444444444444444444444 Good IPv4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Good Xmit RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR Good Recv HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH Happy Backend server2 is Healthy Current states good: 3 threshold: 3 window: 5 Average responsetime of good probes: 0.002319 Oldest Newest ================================================================ 444444444-444444444444444444444444444444444444444444444444444444 Good IPv4 XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Good Xmit RRRRRRRRR-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR Good Recv -------------H-----HH-H-------H----H-----H-H-H-H--HH---HH--H--HH Happy Backend server3 is Sick Current states good: 0 threshold: 3 window: 5 Average responsetime of good probes: 0.000000 Oldest Newest ================================================================ ---------------------------------------------------------------- Happy
サマリーはバックエンドごとに表示される。
444444444-444444444444444444444444444444444444444444444444444444 Good IPv4 XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Good Xmit RRRRRRRRR-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR Good Recv -------------H-----HH-H-------H----H-----H-H-H-H--HH---HH--H--HH Happy
のブロックには、成功の場合 4/X/R/H
、失敗の場合 – で表示される。
各フラグの意味は varnishlog
と同じ。
- 4 — IPv4 connection established
- X — Request transmit succeeded
- R — Read response succeeded
- H — Happy with result
上の server2
の場合、window
5 で threshold
3、過去5回のヘルスチェック結果は H--HH
と 3/5 で成功しているので Backend server2 is Healthy となっている。