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

Tagged with: , , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 1 week ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: