5月 292010
例えばVarnishで複数のバックエンドを持っていてどちらかが倒れても片系でも動くようにする場合
backend c01 {
.host = "192.168.1.1";
.port = "80";
.probe = {
.url = "/healthcheck.gif";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
backend c02 {
.host = "192.168.1.2";
.port = "80";
.probe = {
.url = "/healthcheck.gif";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
director defcache random {
.retries = 5;
{
.backend = c01;
.weight = 5;
}
{
.backend = c02;
.weight = 5;
}
}
特に変哲のない方法なのですが
このようなアクセスをしたいと考えてみましょう
・バックエンドは2台(C01/S01)ある
・C01はVarnishでS01の内容をキャッシュしている
・通常時はS01に対してはアクセスは行わない
・C01に対してはpass動作(Varnish側でキャッシュしない)
・C01が障害時はS01にアクセスを行いキャッシュする(S01に対してあまり負荷をかけない)
図解するとこんな感じです

これをさっきの方法で考えてみるとあれできなくね?どうVCLを書けばいいの?となります
例えばこんな感じで・・・
backend c01 {
.host = "192.168.1.1";
.port = "80";
.probe = {
.url = "/healthcheck.gif";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
backend s01 {
.host = "192.168.1.2";
.port = "80";
}
director defcache random {
.retries = 5;
{
.backend = c01;
.weight = 99999;
}
{
.backend = s01;
.weight = 1;
}
}
sub vcl_recv {
set req.backend =defcache;
}
この場合10万回に一回の割合でしかS01にアクセスをしないのですが
vcl_recvなどでバックエンドを選択する際にC01に対してはpass動作S01は通常動作とはできません
ここで便利なのが
req.backend.healthy
です
これは設定したバックエンドの生死をboolで返してくれます
なのでこんな感じで実現できます
backend c01 {
.host = "192.168.1.1";
.port = "80";
.probe = {
.url = "/healthcheck.gif";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
backend s01 {
.host = "192.168.1.2";
.port = "80";
}
sub vcl_recv {
set req.backend =c01;
if(!req.backend.healthy){
set req.backend=s01;
}else{
return(pass);
}
}
こんな動作どう使え?と思う人もいるかも知れませんが多段キャッシュをする時などで
中間にもVarnishが入っているけどそれが死んでも最悪ストレージに直接・・・みたいなことができますね
passにしているのはメモリを節約するためです
他にもdirectorだけだと実現し辛いいろんな応用が効くと思います
チャレンジしてみてくださいね!

[…] This post was mentioned on Twitter by . said: […]