Varnish3のヘルスチェック結果をCLIから確認

varnish

Varnish 3 で複数台のサーバーをロードバランシングしていた時に、各サーバのヘルスチェック結果を確認する方法メモ。
確認には varnishlogvarnishadm を使う。

サーバ構成

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 のいずれか

varnish_health_check_status

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 となっている。

References

Leave a comment

  • Design a site like this with WordPress.com
    Get started