VarnishはVCL読み込み時にしか名前解決しない

varnish-logo

VarnishはVCL読み込み時にしか名前解決しない

Varnish の名前解決の仕様

結論から。

オフィシャルフォーラムで Varnish の中の人が名前解決の仕様についてコメントしている

Varnish sticks to an IP address once it is resolved. You can force a new lookup by reloading the VCL.
https://www.varnish-cache.org/forum/topic/91

by design でこの仕様になっているので、IP が変わりうるサーバをオリジンサーバに指定している場合、運用でうまく回避しなければいけない。

ザクッと検索すると、先人は次のような方法で回避している。

  • [名前解決を外に丸投げ]Varnishとオリジンサーバの間にサーバをはさみ、そこで名前解決させる
  • [Varnishで頑張る]Varnish の設定ファイルを適宜リロードさせて、名前解決をやり直す

案1:名前解決を外に丸投げ

Varnish で名前解決するのは諦め、IP アドレスが変わらない 別システムに名前解決してもらう。

VARNISH -> ORIGIN SERVER

というような構成であれば

VARNISH -> PROXY SERVER -> ORIGIN SERVER

という風になる。

Varnish からすれば、IP アドレスの変わらない PROXY SERVER とだけ通信。
ORIGIN SERVER の IP アドレスの変更は PROXY SERVER が面倒を見てくれる。

例えば PROXY SERVER を nginx にする場合、proxy_pass に何も考えずにホスト名をベタ書きすると、設定ファイル読み込み時にしか名前解決されないので、変数を使って定期的にリフレッシュさせる必要がある。

# http://d.hatena.ne.jp/hirose31/20131112/1384251646
location /api {
  resolver 127.0.0.1 valid=2s;
  set $api_backend "api.oreno";
  proxy_pass http://$api_backend:9999;
}

参照

案2:Varnishで頑張る

VCL をリロードして、無理やり名前解決させる。

細かいことを何も考慮しなければ、短い間隔で Varnish をリロードさせれば OK。リロードを何度も繰り返していると、メモリ使用量がぶくぶくふえる現象に出くわしているので、個人的には積極的にはやりたくない。

$ dig +short hostname などで IP アドレスをチェックして、アドレスが変わった場合のみ Varnish をリロードさせることも可能。

ホスト名に複数の IP アドレスが紐付いているような場合に、IP アドレス一覧を保持しておいて、IP アドレス一覧が変わった場合に VCL のバックエンドサーバ一覧を書き換えて、Varnish をリロードさせることも可能。

参照

Advertisements
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
%d bloggers like this: