Varnishのストレージバックエンドを複数指定する

varnish

Varnish の storage backend について

キャッシュサーバの Varnish ではキャッシュの保存先として

  • malloc(キャッシュが RAM に収まる限りは高速だが、RAM からあふれるとスワップアウトして非常に遅くなる)
  • file(mmap で仮想メモリを割り当て。HDD のような disk I/O が遅いデバイスでは非常に遅い)
  • persistent (Varnish 4 から非推奨されたので割愛)

の3種類から選べる。

チューニングのページには When choosing storage backend, the rule of thumb is to use malloc if your cache will be contained entirely or mostly in memory, while the file storage backend performs far better when you need a large cache that exceeds the physical memory available. といったことが書かれているけれども、ストレージは一つしか選べないわけではなくて、実は複数を指定できる。

HTML ファイルのようなテキスト系はサイズも小さいので malloc ストレージにし、画像のようにサイズが大きいバイナリ系は file ストレージにお任せといったことができる。

この設定方法をメモ

Varnish の起動パラメータ

環境

設定ファイルは Ubuntu 系のオフィシャルレポジトリを前提として進める。

  • 起動パラメータは /etc/default/varnish で管理
  • VCL ファイルは /etc/varnish/default.vcl

/etc/default/varnish

先に設定例を掲載

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s default=malloc,64M \
             -s foo=malloc,128M \
             -s bar=file,/var/lib/varnish/varnish_storage.bin,1G"

ストレージは -s オプションで指定する。

ポイントとしては -s storage_name=storage_setting と各ストレージに名前をつける事。

上の例では default, foo, bar という3つのストレージを定義している。
起動後にコマンドラインツールの varnishadm からストレージを確認

]# varnishadm storage.list
Storage devices:
        storage.Transient = malloc
        storage.default = malloc
        storage.foo = malloc
        storage.bar = file

Transient はユーザ定義ではなくシステムが利用するストレージ。

/etc/varnish/default.vcl

各ストレージに名前をつけたので、 VCL 内では条件に応じてストレージを振り分ける。

リクエスト時のホスト名に応じてストレージを変更する設定

検証しやすいように、レスポンスヘッダーの x-storage にストレージ名をつけている

Varnish 3

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

sub vcl_fetch {
    if (bereq.http.host ~ "foo") {
       set beresp.storage = "foo";
       set beresp.http.x-storage = "foo";
    } elsif (bereq.http.host ~ "bar") {
       set beresp.storage = "bar";
       set beresp.http.x-storage = "bar";
    } else {
       set beresp.storage = "default";
       set beresp.http.x-storage = "default";
    }
    return (deliver);
}

Varnish 4

sub vcl_backend_response {
    if (bereq.http.host ~ "foo") {
       set beresp.storage_hint = "foo";
       set beresp.http.x-storage = "foo";
    } elsif (bereq.http.host ~ "bar") {
       set beresp.storage_hint = "bar";
       set beresp.http.x-storage = "bar";
    } else {
       set beresp.storage_hint = "default";
       set beresp.http.x-storage = "default";
   }
}

Varnish にアクセス

cURL で実際にアクセス

-D -- でレスポンスヘッダーを表示させ、 --header "Host: ..." でリクエスト時のホスト名を設定する。

]# curl -D - --silent --header "Host: foo" http://localhost:6
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
x-storage: foo
Transfer-Encoding: chunked
Date: Mon, 12 Jan 2015 14:15:50 GMT
X-Varnish: 385186687
Age: 0
Via: 1.1 varnish
Connection: keep-alive

]# curl -D - --silent --header "Host: bar" http://localhost:6081/ -o /dev/null
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
x-storage: bar
Transfer-Encoding: chunked
Date: Mon, 12 Jan 2015 14:16:05 GMT
X-Varnish: 385186688
Age: 0
Via: 1.1 varnish
Connection: keep-alive

]# curl -D - --silent --header "Host: localhost" http://localhost:6081/ -o /dev/null
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
x-storage: default
Transfer-Encoding: chunked
Date: Mon, 12 Jan 2015 14:16:28 GMT
X-Varnish: 385186689
Age: 0
Via: 1.1 varnish
Connection: keep-alive

ホスト名に応じて x-storage が変わっているのがわかる。

varnishstat でストレージの統計を確認

]# varnishstat -1 | egrep 'SM..(foo|bar|default)'
SMA.default.c_req              4         0.00 Allocator requests
SMA.default.c_fail             0         0.00 Allocator failures
SMA.default.c_bytes       263680        77.97 Bytes allocated
SMA.default.c_freed       263680        77.97 Bytes freed
SMA.default.g_alloc            0          .   Allocations outstanding
SMA.default.g_bytes            0          .   Bytes outstanding
SMA.default.g_space     67108864          .   Bytes available
SMA.foo.c_req                  4         0.00 Allocator requests
SMA.foo.c_fail                 0         0.00 Allocator failures
SMA.foo.c_bytes           263664        77.96 Bytes allocated
SMA.foo.c_freed           263664        77.96 Bytes freed
SMA.foo.g_alloc                0          .   Allocations outstanding
SMA.foo.g_bytes                0          .   Bytes outstanding
SMA.foo.g_space        134217728          .   Bytes available
SMF.bar.c_req                  4         0.00 Allocator requests
SMF.bar.c_fail                 0         0.00 Allocator failures
SMF.bar.c_bytes           270336        79.93 Bytes allocated
SMF.bar.c_freed           270336        79.93 Bytes freed
SMF.bar.g_alloc                0          .   Allocations outstanding
SMF.bar.g_bytes                0          .   Bytes outstanding
SMF.bar.g_space       1073741824          .   Bytes available
SMF.bar.g_smf                  2          .   N struct smf
SMF.bar.g_smf_frag             0          .   N small free smf
SMF.bar.g_smf_large            2          .   N large free smf

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 6 days 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: