11月 142012
 

Varnishは様々なオブジェクトのキャッシュを行いますが
その際にオブジェクトの保存を何処に行うかを選択することができます。
現在のバージョンでは

malloc
file
persistent

といった3つのストレージが存在しており、それぞれに特徴があります。
今回は特にpersistentに焦点をあてて解説します。

malloc

メモリ上にストレージを置いているVarnishで一番高速なストレージです。
メモリ上に置くため当然のことながらサーバの移設での一時停止や再起動、
workerのpanicでの自動再起動などでキャッシュが吹き飛んでしまいます。

file

ファイル上にストレージを置く、若干遅いストレージです。
ファイルと名前はついているものの永続化を目的としておらず、
ストレージへの書き込み時にflushしません。
読み書きはページ・バッファキャッシュ、つまりOSに任せており
Varnishでは特に制御はおこなっていないため、オーバーヘッドが少なく高速です。
正直HDDを使っているときは、あまりおすすめできません。
しかし、SSDやioDriveといった高速なデバイスの場合は使えるストレージです。

先程も書いた通り、永続化を目的としていないためmallocと同様に再起動でキャッシュが吹き飛びます。
名前に騙されてはいけません。

persistent

永続化を目的としたストレージです。
単一のファイルですが、内部では複数のセグメントを持っており
10~60秒に一回程度でオブジェクトを書き込むセグメントを変更します。
(ざっくりコードを見た感じだとセグメント変更時もflushをしていない)
これにより書き込み途中でpanicで自動再起動したとしても、
壊れたセグメントのみを切り離して再開することができ、安全性が高いストレージです。

私がV3.0.3でテストしたところ以下の条件でもキャッシュを維持しました。
 ・親プロセスも含めたVarnishの停止・開始(V3.0.0の時は消えましたが3.0.1で修正されました)
 ・varnishadmなどの管理ツールからの停止・開始
 ・panicなどでの自動再起動(一部消えることはある)

更にVarnish Software公式のアナウンスによるとfileストレージより高速なため
非常に使ってみたいストレージといえるんじゃないかと思います。

しかしまだPersistentストレージは発展の途上です。
最新バージョンである3.0.3では実用上に?がつく残念な仕様が幾つか存在します。

特にセグメントが一巡した(=指定ストレージサイズを使いきった)際に
最初のセグメントから再利用するのですが、期限切れしていない場合は再起動を行い拡張を試みます。
そのため、現時点では非常に玄人向けのマニアックなストレージではないかなと考えています。

もし私が使うのであれば、
 ・セグメントが一巡することが起因の再起動を起こさせないことが確信できている
 ・最上段ではなく2段目以降
であれば使うかなーっと言った感じです。

じゃぁまったく使えないじゃないかというとそうでもなく
VUG6でのプレゼン資料やVarnish Softwareのブログを見る限り、
persistentの強化を進めていくように感じられますし
現在のtrunk(確認したのは2012/11/13バージョン)では再起動も起こらず期待どおりの動きをしています
恐らく近い将来Varnishの主流のストレージになるのではないかと考えています。
もちろん人柱覚悟でtrunkを使うのも有りだと思います

–参考リンク
Testing the persistent storage engine(Persistentがfileより速いよというベンチ内容)
Release status(VUG6で発表されたV3.1までのリリース内容)
ImprovedPersistence(Persistentストレージのマイルストーンについて)
ArchitecturePersistentStorage(Persistentストレージのアーキテクチャ(古めな内容))


8月 212012
 

Varnish3.0.3が公開されました。
今回の変更は多くのバグフィックスとツール系の機能拡充とドキュメントの整備です。

公式リリースノート varnish-cache-3.0.3

バグフィックス

・ストリーミングと正規表現の評価においてクラッシュの要因となるバグを複数修正しました。
・ESIとGZIPにおいて壊れたオブジェクトを返却するケースが存在する問題を修正しました。
・ESIのremoveタグ内にHTMLのコメントがあるケースにおいて不適切な削除を行なっていたのを修正
・ban lurkerのスリープする条件の変更(回収した際は設定値・回収しなかった場合は1秒)
・多くのクラッシュの要因になるバグの修正
・その他いろいろ修正

ツール系の機能拡充

varnishstat

・json出力オプションの追加(-j)

varnishtest

・resp.bodyでレスポンスボディの評価が可能に

varnishncsa

・VCL中に”Key:Value”の形式でログを出力すると%{VCL_Log:Key}xで取得可能に


■VCL
  sub vcl_recv{
  std.log("hoge:mage");
}

[root@localhost ~]# varnishncsa -F "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{VCL_Log:hoge}x\""
192.168.1.199 - - [21/Aug/2012:08:46:27 +0900] "GET http://192.168.1.199:6081/ HTTP/1.0" 200 5 "-" "Wget/1.12 (linux-gnu)" "mage"


・%{format}tの対応


[root@localhost ~]# varnishncsa -F "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{%Y%m%d%H%M%S}t\""
192.168.1.199 - - [21/Aug/2012:08:51:54 +0900] "GET http://192.168.1.199:6081/ HTTP/1.0" 200 5 "-" "Wget/1.12 (linux-gnu)" "20120821085154"

・formart指定中に\tと\nの指定が可能に


[root@localhost ~]# varnishncsa -F "%h AAA\tBBB\nCCC"
192.168.1.199 AAA       BBB
CCC

cli

・backend.listが追加されました
 バックエンドの状態を確認することができます


■定義
director default random{.retries = 5;
  {.weight = 5;.backend={.host="127.0.0.1";.port="81";}}
  {.weight = 5;.backend={.host="127.0.0.1";.port="82";}}
}
■Admin
backend.list
200
Backend name                   Refs   Admin      Probe
default[0](127.0.0.1,,81)      1      healthy    Healthy (no probe)
default[1](127.0.0.1,,82)      1      healthy    Healthy (no probe)

・backend.set_healthが追加されました
 バックエンドの状態を強制的に変更できます


■定義
backend default {
  .host = "127.0.0.1";
  .port = "81";
}

■状態をsickに変更
backend.set_health default sick


■定義
director default random{.retries = 5;
  {.weight = 5;.backend={.host="127.0.0.1";.port="81";}}
  {.weight = 5;.backend={.host="127.0.0.1";.port="82";}}
}

■状態をsickに変更(一つだけ)
backend.set_health[0] sick

■状態をsickに変更(全部)
backend.set_health sick


パラメータの変更

・http_range_support (BOOL default:ON)
 rangeリクエストのサポートですがEXPERIMENTALから正式になりました。
 ただ3.0.0からデフォルトでONになっていたので、特に気にすることはないと思います。

・send_timeout (sec default:600)
 送信時のタイムアウト時間が60秒から600秒に変更されました。
 idle_send_timeoutでアイドルの設定ができるようになった影響で増えてると思います。

・diag_bitmap (bitmap default:0)
 ban-lurkerのデバッグ用の指定が増えました(0x00080000)

・redhat用のsysconfigでVARNISH_MIN_THREADSが1から50に
 デフォルト値がよくなりました

パラメータの追加

通信に関わるパラメータ

・idle_send_timeout (sec default:60)
 送信時にアイドル状態(データの送信ができなくなった)になった場合のタイムアウト時間です

内部での正規表現の呼び出しについての制限

・pcre_match_limit (1~UINT_MAX default:10000)
 呼び出し回数の制限

・pcre_match_limit_recursion (1~UINT_MAX default:10000)
 再起回数の制限

ドキュメントの整備

その他変更

EL6用RPMの用意
・DNSディレクターにおいてポートの指定がない場合はデフォルトで80を使うようになった
・libvarnishapiの変更
・ABIが変わったのでVMODのリビルドが必要
・内部関数の定義が変わってるので一部のインラインCやVMODが動かなくなる可能性アリ(HTC_Readが個人的に痛い)

多くのバグ修正を含んでいるため適用するのが良いかと思います。