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ストレージのアーキテクチャ(古めな内容))