またまたVarnishのLTをqpstudy#03でやってきました
今回はVCLを記述する際に分かりづらいサブルーチンのところとデバッグの仕方を軽く話しました
正直5分という時間で詰め込みすぎた感があって今後の課題かなーと思いつつ
Varnishを使う際の一助になれば幸いだと思っています
Continue reading »
お久しぶりです。
前回のqpstudyは乱入でLTを行ったのですが、今回は枠をいただけると言うことで
またまたVarnish関係のLTを行ないます。
「できる!Varnish ここを知ると便利なVCL(仮)」
というテーマで多少癖があるVCL(Varnishの設定ファイル)を書く上ではまりやすいところや
知っておくと便利なことを簡単に話させていただこうと思っています。
ただし、あくまで(仮)なのでテーマについては変更があるかもしれません。(Varnishってのはブレませんが)
場所:Niftyさん(大森)
日時:10月9日(土)
時間:18:00〜
リンク
qpstudy#03
参加申し込み@atnd
ビアバッシュ
ビアバッシュは前回すごく盛り上がりましたので皆様ぜひぜひ
Varnish2.1.3がリリースされたようです
varnishのブログからの情報だと
安定版の2.0.6と同等の安定性とパフォーマンスを確保したので是非2.1.3を使って欲しいとのことです
実はそのうち記事でだそうと思ってたのですが2.1.2は2.0.6に比べるとパフォーマンスが多少落ちていたのでこれでよくなると嬉しいです
(テスト条件は格納オブジェクト数が10ぐらいだったのでどうかとも思いますが・・・)
また変更点は
・critbitのバグを修正
→2.1.2の際にLAが1に貼りつくという現象がありましたがおそらくそれがなおると思います(まだ未検証なので・・・)
・varnishncsaのバグ修正(ログの取りこぼしなどがあったようです)
・Rangeリクエストのバグを修正
・VCLにlogコマンドを追加
だそうです
RPMビルドの際にひとつだけ注意点があります
varnish.specファイルのバージョン指定が2.1.2になっているのでそこを2.1.3に変更する必要があります
1 | [root@LIP-NAS-01 redhat] # diff varnish.spec.org varnish.spec |
2 | 3c3 |
3 | < Version: 2.1.2 |
4 | --- |
5 | > Version: 2.1.3 |
参考サイト
Varnish 2.1.3 – Use it!
Varnish2.1.3
ダウンロード
The Varnish HTTP Accelerator
昨日池袋でインフラ勉強会のキユーピー3分インフラクッキングでESIとインラインCについてちょこっと話してきました。
LT自体が始めて+飛び入りLTだということでいろいろ自身にツッコミを入れたいところとか多々あるんですが、次回以降の改善点として考えています。
Continue reading »
以前書いた記事(VarnishでESIを使うときの注意するべき点)で
Keep-AliveはOFFにするべき
ESI使用時はcontent-lengthがブラウザ側に返却されないようなのでOFFはほぼ必須です
どうしても使いたい場合はESIを使用するときのみkeep-aliveをOFFに・・・
と
直Varnishはやめた方がいい
Keep-aliveをオフにしても特定のクライアント(ab/wgetなど)で接続が維持されて5秒ほど待ってしまうことがあります
つまりKeep-Aliveが有効かつcontent-lengthがないときの挙動と同じになります
じゃぁどうすればいいか?
自分はフロントにNginxを置いてそこからVarnishにproxyしています
と書きましたがどうやら2.1.X系では改善されたようです
ということで比較してみます
Continue reading »
VarnishはVersion2.1.1からRangeリクエストに対応するようになりました。
例えば最近のドコモ端末で動画を再生する場合501KB以上だと
サーバがRangeリクエストに対応していないと再生出来なかったりしますので対応は必要です。
ただこの機能は実験的で実際のところどうなんでしょうか?試してみました。
Continue reading »
僕のサイトみたいに複数のドメイン(blog.xcir.net/xcir.net/wiki.xcir.net)管理しているけどVarnishサーバは一つの場合
公式サイトの設定例
01 | acl purge { |
02 | "localhost"; |
03 | "192.0.2.14"; |
04 | } |
05 |
06 | sub vcl_recv { |
07 | if (req.request == "PURGE") { |
08 | if (!client.ip ~ purge) { |
09 | error 405 "Not allowed."; |
10 | } |
11 | purge("req.url ~ " req.url); |
12 | } |
13 | } |
だと違うドメインでも同じURLであれば消してしまいます。
ドメインを指定して安全にキャッシュをパージするにはどうすればいいでしょうか?
Continue reading »
Varnishが2.1.xに上がって管理ポートに接続する際にパスワードをかけられるようになりました。
でも実際のところどうするんでしょうか?
varnishadmを使う方法
この場合すごく簡単です
例えば起動パラメータが
1 | DAEMON_OPTS="-a :6081 \ |
2 | -T localhost:6082 \ |
3 | -f /etc/varnish/default.vcl \ |
4 | -u varnish -g varnish \ |
5 | -h classic,12978189 \ |
6 | -S /etc/varnish/secret \ |
7 | -s malloc,300M \ |
8 | -s file ,/var/lib/varnish/varnish_storage.bin,1G" |
の場合
1 | [root@LIP-APP-04 test ] # varnishadm -T localhost:6082 -S /etc/varnish/secret |
2 | 200 154 |
3 | ----------------------------- |
4 | Varnish HTTP accelerator CLI. |
5 | ----------------------------- |
6 | Type 'help' for command list. |
7 | Type 'quit' to close CLI session. |
といった風にコンソール入ることができます
telnetを使う場合
Varnish2.1.2でキャッシュが溜まりきってキャッシュアウトが起こるあたりでLAが1になる問題がありました
全く応答しないわけでもなく普通にレスポンスを返しているのですが気持ち悪くてどうにかならないかなーと思っていたら
公式で解答がありました
I think this is a misjudgment in the critbit hasher, we’re working on a fix.
In the meantime use -hclassic
High load after upgrade from 2.1.0 to 2.1.2
要はcritbitというhashアルゴリズムでちょこっとバグがあるっぽくて今なおしてるので
起動オプションでclassic指定で動かしてね!
ということです
そこで起動オプション(/etc/sysconfig/varnish)で
1 | -h classic,500009 \ |
を指定したところキャッシュがあふれるような状態でもLAは高くなることなく問題なく推移しました
なお数字500009は素数です
大きめで好きな素数をいれてくださいね
2010/06/02追記
素数の一覧は
The Prime Pages
で見れます
また現在発見されている素数でTOP20は
Largest Known Primes
例えばVarnishで複数のバックエンドを持っていてどちらかが倒れても片系でも動くようにする場合
01 | backend c01 { |
02 | .host = "192.168.1.1"; |
03 | .port = "80"; |
04 | .probe = { |
05 | .url = "/healthcheck.gif"; |
06 | .timeout = 0.3 s; |
07 | .window = 8; |
08 | .threshold = 3; |
09 | } |
10 | } |
11 | backend c02 { |
12 | .host = "192.168.1.2"; |
13 | .port = "80"; |
14 | .probe = { |
15 | .url = "/healthcheck.gif"; |
16 | .timeout = 0.3 s; |
17 | .window = 8; |
18 | .threshold = 3; |
19 | } |
20 | } |
21 | director defcache random { |
22 | .retries = 5; |
23 | { |
24 | .backend = c01; |
25 | .weight = 5; |
26 | } |
27 | { |
28 | .backend = c02; |
29 | .weight = 5; |
30 | } |
31 | } |
特に変哲のない方法なのですが
このようなアクセスをしたいと考えてみましょう
・バックエンドは2台(C01/S01)ある
・C01はVarnishでS01の内容をキャッシュしている
・通常時はS01に対してはアクセスは行わない
・C01に対してはpass動作(Varnish側でキャッシュしない)
・C01が障害時はS01にアクセスを行いキャッシュする(S01に対してあまり負荷をかけない)
図解するとこんな感じです
これをさっきの方法で考えてみるとあれできなくね?どうVCLを書けばいいの?となります