5月 182014
 

4/29に全世界同時でVarnish4のリリースパーティーがありまして、東京もやるぞーということでクックパッド様でピザ食べながら発表してきました。
v4rpのタグを眺めていると野外BBQしながらブロック壁に投影しているところもあったりとなかなか良い感じでした。

で、前回と同様にVarnish4での新機能や変更点を発表しようと思いまして、GWもあるしと資料をのんびり書いてましたら結局尻に火がついてしまって前日ぐらいまでガリガリ涙目で書いていました。
2->3の時も涙目だった記憶があるのですが、今回は変更点がかなり多いこともありまして、途中でこれ間に合うんかな・・・とかんがえる事も・・
ということであまり発表練習が出来なかったのでお聞き苦しいところがありましたら申し訳ありませんでした。

で、私の発表資料はこちらです。

GoogleDocs版(アニメーションする)

また、発表の際に忘れていて触れていなかったのですが、是非一度builtin.vclを見てみてみるとデフォルトでどのように動くか、また上書きする際に何を注意すればよいかわかるのでお勧めです。(特にvcl_hitに今回からロジックが入るようになっているので)
VCLの動きは「同じVCLアクション(vcl_recvなど)を複数定義する」の記事で触れているようにまずユーザが定義したVCLが読み込まれてその後にbuiltinのVCLが動きます。
builtin.vcl

最後に
参加者の皆様方お疲れ様でした。また、会場の準備・提供をしていただきましたmirakui様・クックパッド様本当にありがとうございました!


4月 252014
 

先日Varnish4リリースされたよ―(^O^)/な記事を書いた際に、リリースパーティーどっかでやらないかなとVarnish3のリリースパーティーを行った白金台方面を眺めつつチラチラしていたところ、今回もクックパッド様で行うことになりました。
@mirakuiさん本当にありがとうございます。

日程は4/29の19:00~からでGW中なのですが(平日だと思って夜にしていた)
ピザでも摘みながらVarnish関連について話ができればなと考えています。
私のほうではVarnish4で変わったことやとあるサイトの本番(知り合いのサイト)にVarnish4入れて嵌ったドキュメントに記載されていない事項などを話そうと思っています。
v4_io
こんなスライドや
vsl_group
こんなの(比較的見栄えするところをキャプチャしました)を今書いているところです。

またVarnish Softwareよりステッカーなどをいただけることになっていまして、当日間に合えば配布できると思います。

当日皆様とお会いできるのを楽しみにしています。
Varnish 4.0 Release Party in Tokyo申し込み


4月 112014
 

3.0.0の公開から約3年ぶりにメジャーバージョンが上がりました。(公式サイト)
今回も非常に多岐に渡る変更があるのですが、前回とはまた少し毛色が違います。
大きな変更点について見て行きましょう。

ストリームのフルサポート

3.0の時もストリームはサポートしていたのですが、4.0になってより強化されました。

初回コネクション 同時接続してきたコネクション
3.0 ストリームされる 初回コネクションが完了するまでロックされ、その後一気に転送
4.0 ストリームされる 既に初回コネクションでストリーム済みのデータを一気に転送してその後ストリーム

イマイチイメージが掴みづらいかもと思ったのでgifアニメを作ってみました。
やってる内容は、1秒ごとにaを出力するphpに対して開始時間を数秒ずらして3並列で取得していっています。
初回のアクセスが終わった後は何回かアクセスしてみてキャッシュされていることを確認しています。

window配置

初回のクライアント 3秒遅れのクライアント 5秒遅れのクライアント
apacheログ
varnishncsa

検証コード
■slow.php


<?php
header('Cache-Control: max-age=20');
ob_end_flush();
ob_start('mb_output_handler');
for($i=0;$i<10;$i++){
        echo "a\n";
        ob_flush();
        flush();
        sleep(1);
}

■vcl@3.0.5


sub vcl_fetch{
  set beresp.do_stream = true;
  set beresp.ttl   = 1w;
}

■vcl@4.0.0


sub vcl_backend_response{
  set beresp.do_stream = true;
  set beresp.ttl = 1w;
}

ストリームの様子のgif
3.0.5
varnish3-stream


4.0.0
varnish4-stream


3.0.5は最初のアクセス以外はブロックされていますが4.0.0はブロックされていない上に既に転送されているものは最初に一気に転送されているのがわかります。
比較的大きなコンテンツを配信する場合は非常に有用な機能といえます。

オブジェクトがexpireした際にgrace期間が残っている場合は、古いオブジェクトを返しつつバックグラウンドでオブジェクトを更新します

オブジェクトがexpireした時の動作も強化されました。

初回expire後のコネクション 同時接続してきたコネクション フェッチ終了後
3.0 fetchを行い新オブジェクトを転送する、fetchの間は通常どおり待機させられる 古いオブジェクトを転送 新オブジェクトを転送
4.0 バックグラウンドでfetchを行い、自コネクションは古いオブジェクトを転送 古いオブジェクトを転送 新オブジェクトを転送

今回もgifを撮ってみました。
取得に3秒かかるコードでTTLは10秒です。expire時の動きを見てみてください。

検証コード
■date.php


<?php
header('Cache-Control: max-age=20');
echo date("Y/m/d H:i:s")."\n";
sleep(3);

■vcl@3.0.5


sub vcl_fetch{
  set beresp.do_stream = true;
  set beresp.ttl   = 10s;
  set beresp.grace = 10m;
}

■vcl@4.0.0


sub vcl_backend_response{
  set beresp.do_stream = true;
  set beresp.ttl   = 10s;
  set beresp.grace = 10m;
}

grace動作
3.0.5
varnish3-bgfetch


4.0.0
varnish4-bgfetch


3.0ではexpire時にsleepが効いているのが分かります。
4.0ではそれがありません。

varnishlogをグルーピング出力したりqueryで絞り込むことが可能に

これは非常に大きな機能なので別記事で取り上げますが
簡単に言うとリクエストがどのESIにサブリクエストを使っているかなどがグルーピングできたり
携帯端末で1秒以上レスポンスにかかったログの抽出が出来たりします。

directorがvmodになりました

これも別記事で取り上げます。
独自のdirectorが作りやすくなったのと他にも利点があります。

vmodがrequest bodyを見ることが可能になりました

今までも超トリッキーな事をすれば見ることは可能だったのですが正式にサポートされました。
POSTリクエストの中身を見て何かしらの処理を行うようなvmodを作るのが簡単になります。

インラインCがデフォルト無効になりました

これは廃止されるというわけではなくセキュリティ対策としてデフォルト無効になっているだけです。
vcc_allow_inline_cというパラメータで復活可能です。

VCLが大幅に変わった

恒例行事です。別記事で書きます。
公式のアップグレード方法は以下です
Upgrading to Varnish 4

varnishapi周りが刷新

当然ですが3.0向けのvmodは移行が必要です。

バグ修正多数

今までバグ修正はされていたもののリリースには含まれていなかった様々なバグ修正が今回のタイミングで取り込まれています。
たとえば
syntheticでASCIIコード以外を出力しようとした場合に文字化けするバグ修正が取り込まれていたり
vclをdiscardしてもヘルスチェックが止まらないバグなどが直っています

varnishstatの表示改善

これは実際に触ってみたほうが早いですが、カウンタの説明が出るようになっています。

パラメータの変更

これも別途記事で書きます。

まとめ

他にも取り上げては居ませんがかなりの変更点があります。

さて、ここまでわざとぼかして書いていたのですが
今回の一番大きな変更はクライアントとバックエンドのスレッドを分離したことです。
これにより、ストリームやgrace時の動作改善などが可能となりました。
また現versionでは残念ながら実装されていませんが、パラレルフェッチESIも可能となるはずです。(予定には入っているようです)
また、これはコード上の話ですが3.0まではHTTPを処理する箇所がvarnishのコードと結構くっついていたのですが
4.0では分離されており拡張が容易な構造にリファクタリングされています。
これはHTTP2.0を見据えた変更です。
最初に2.1から3.0の変更とは毛色が違うといったのは、構造を大幅にリファクタリングしたということです。

また、検証をしている段階では比較的安定しており、最近趣味で手伝っているPVもそれなりに多いサイトに週末にでも投入して動作検証も行う予定です。
その結果も記事などにできればなぁと考えています。

あと今回もリリースパーティーやるみたいなので
誰かやらないかなとチラチラと・・・