Varnishキャッシュのクリアについてメモ

コンテンツが書き換わるようなページをキャッシュする場合、定期的なり不定期なりでキャッシュを更新する必要がある。
Varnish のオフィシャルサイトの次の2つのドキュメントを主に参考にして Varnish のクリア・更新方法についてメモ。特に、後者は詳しくておすすめ。

キャッシュ更新パターン

ざっと以下の5パターンがある

  1. Varnish のキャッシュオブジェクトにTTLを設定する(beresp.ttl)
  2. 単一オブジェクトのキャッシュをクリア(purge)
  3. 単一オブジェクトのキャッシュを書き換え(req.hash_always_miss)
  4. 次回アクセス時にはキャッシュを更新するようにリストで管理(ban)
  5. ban 対象のキャッシュをリクエストとは無関係にクリア(smart ban)

ウェブ上の情報量は ttl > ban = purge >>> こえられない壁 >>> hash_always_miss > smart ban な感じ

1. Varnish のキャッシュオブジェクトにTTLを設定する

vcl_fetch で set beresp.ttl する

beresp.ttl の特徴

  • TTL を設定し、expire したらキャッシュがクリアされる(varnishstat の n_expired が1増える)
  • expire 後のアクセスでは cache miss 扱いでオリジンサーバにアクセスする

VCL例

sub vcl_fetch {
    set beresp.ttl = 60s;
    return (deliver);
}

2.単一オブジェクトのキャッシュをクリア

PURGE を使う

PURGE の特徴

  • キャッシュからクリアする対象を個別に指定。即座にメモリも解放される。
  • Varnish へのリクエスト時に ban list と突き合わせ、ban されていればキャッシュをクリアし、オリジンサーバに問い合わせる(このタイミングで n_expired が1増える)
  • VCL からでも CLI の varnishadm からでも操作可能
  • ban list は varnishadm から確認可能。

HTTP の PURGE メソッドで purge する VCL 例

acl purge {
  "localhost";
  "192.168.55.0"/24;
}

backend default {
  .host = "127.0.0.1";
  .port = "80";
}

sub vcl_recv {
  if (req.request == "PURGE") {
      if (!client.ip ~ purge) {
              error 405 "Not allowed.(vcl_hit)";
      }
      return (lookup);
  }
}

sub vcl_hit {
  if (req.request == "PURGE") {
      purge;
      error 200 "Purged(vcl_hit)";
  }
}

sub vcl_miss {
  if (req.request == "PURGE") {
      purge;
      error 200 "Not in Cache(vcl_miss)";
  }
}

acl を設定し、許可されたアクセスもとから PURGE リクエストがあった時のみ PURGE するようにしている。
vcl_hit/miss のなかで error 行を省くと、オリジンサーバにアクセスし、その内容がキャッシュされる。

3. 単一オブジェクトのキャッシュを書き換え

ban や purge はキャッシュをクリアするだけでキャッシュが更新されるわけではない。
キャッシュの更新もしたい場合は vcl_recvreq.hash_always_miss = true する。
コンテンツ更新にあわせて、プログラマブルにキャッシュコントロールしたい場合に便利。

マニュアルには記載されているが、一般開発者の使用例はあまり見かけない。

req.hash_always_miss = true の特徴

  • キャッシュをリクエスト時の最新のコンテンツに更新する
  • オリジンサーバが落ちている場合は、キャッシュのクリアも更新もできない

HTTP の REFRESH メソッドで purge する VCL 例

acl purge {
  "localhost";
  "192.168.55.0"/24;
}

sub vcl_recv {
  if (client.ip ~ purge && req.request == "REFRESH") {
    set req.request = "GET";
    set req.hash_always_miss = true;
  }
}

REFRESH メソッドのリクエストがあった時は set req.hash_always_miss = true でキャッシュミスにし、メソッドを GET にかえてオリジンサーバにアクセスしてキャッシュを更新させる。
ban や purge も同じ VCL で定義できるように、専用の HTTP メソッド REFRESH を割り当てている。

4.次回アクセス時にはキャッシュを更新するようにリストで管理

ban を使う

ban の特徴

  • キャッシュからクリアする対象をパターンマッチで指定し、ban list に追加される。
  • Varnish へのリクエスト時に ban list と突き合わせ、ban されていればキャッシュをクリアし、オリジンサーバに問い合わせる(このタイミングで n_expired が1増える)
  • ban しただけでは、キャッシュはクリア(メモリ解放)されない
  • VCL からでも CLI の varnishadm からでも操作可能
  • ban list は varnishadm から確認可能。

HTTP の BAN メソッドで ban する VCL例

acl purge {
  "localhost";
  "192.168.55.0"/24;
}

sub vcl_recv {
  if (req.request == "BAN") {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }

    ban("req.url == " + req.url);

    # Throw a synthetic page so the
    # request won't go to the backend.
    error 200 "Ban added";
  }
}

ban リクエストをして、ban.list に追加されていることを varnishadm から確認

$ curl -X BAN http://localhost:8080/index.html
...
$ sudo varnishadm ban.list
Present bans:
1388811448.757599     0         req.url == /index.html

varnishadm の ban例

varnish> ban req.url ~ "/index.html"
200

ban list の確認

ban 対象のオブジェクト一覧は varnishadm のコマンド ban.list で確認可能。

varnish> ban req.url ~ "/index.html"
200

varnish> ban.list
200
Present bans:
1388810837.787893     0         req.url ~ /index.html

varnish> ban req.url ~ "/index.html"
200

varnish> ban.list
200
Present bans:
1388810864.746628     0         req.url ~ /index.html
1388810837.787893     0G        req.url ~ /index.html

同じオブジェクトを複数回 ban すると、古い ban は G(gone) としてマークされる

5.smart ban

smart ban を使うと、ban と同じ感覚で正規表現でまるっと ban し、次回リクエストを待たなくても不要なキャッシュを掃除する ban lurker スレッドが不要と判断したキャッシュのメモリを解放する。
あまりアクセスされないような大量のオブジェクトをまとめて ban し、メモリもさっさと解放したい場合に便利。

マニュアルには記載されているが、一般開発者の使用例はあまり見かけない。

http://kly.no/posts/2010_07_28__Smart_bans_with_Varnish__.html も参考にする事。

smart ban の VCL 例

sub vcl_fetch {
  set beresp.http.x-url = req.url;
}

sub vcl_deliver {
  unset resp.http.x-url;
}

sub vcl_recv {
  if (req.request == "BAN") {
    ban("obj.http.x-url == " + req.url);
    error 200 "Banned";
  }
}

ban lurker のために、キャッシュオブジェクトのリクエストヘッダーに ban で利用する url(やホスト) などの情報を突っ込み(vcl_fetch)、追加したリクエストヘッダー(x-url)のパターンマッチングで ban 指定する
クライアントへのレスポンス時(vcl_deliver)に、追加したHTTPヘッダーを除外(code)しなければ、クライアントにもこの新しいヘッダーを渡すことになる。

smart ban 実行後

varnish> ban.list
200
Present bans:
1388832294.828234     0G        obj.http.x-url == /date.php

... ban lurker の掃除が完了

varnish> ban.list
200
Present bans:

varnish>

ban lurker スレッドによる ban が行われると varnishlog ではタグ ExpBan で出力される。

    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1388832527 1.0
    0 ExpBan       - 228852400 was banned
    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1388832530 1.0
Advertisements
Tagged with: , , , , , ,
Posted in middleware
One comment on “Varnishキャッシュのクリアについてメモ
  1. […] Varnish のオフィシャルサイトの次の2つのドキュメントを主に参考にして Varnish のクリア・更新方法についてメモ。特に、後者は詳しくておすすめ。 ・Varnish Tutorial : Purging and banning https://www.varnish-cache.org/docs/3.0/tutorial/purging.htmlVarnish Book : Cache invalidation ・https://www.varnish-software.com/static/book/Cache_invalidation.html キャッシュ更新パターン ざっと以下の5パターンがある 1.Varnish のキャッシュオブジェクトにTTLを設定する(beresp.ttl) 2.単一オブジェクトのキャッシュをクリア(purge) 3.単一オブジェクトのキャッシュを書き換え(req.hash_always_miss) 4.次回アクセス時にはキャッシュを更新するようにリストで管理(ban) 5.ban 対象のキャッシュをリクエストとは無関係にクリア(smart ban) Varnishキャッシュのクリアについてメモ | Siguniang's Blog […]

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 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 4 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 4 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 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… 1 year ago
%d bloggers like this: