5月 292010
 

例えばVarnishで複数のバックエンドを持っていてどちらかが倒れても片系でも動くようにする場合

01backend 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}
11backend 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}
21director 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を書けばいいの?となります


例えばこんな感じで・・・

01backend 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}
11backend s01 {
12  .host = "192.168.1.2";
13  .port = "80";
14}
15director defcache random {
16.retries = 5;
17  {
18    .backend = c01;
19    .weight         = 99999;
20  }
21  {
22    .backend = s01;
23    .weight         = 1;
24  }
25}
26sub vcl_recv {
27  set req.backend =defcache;
28}

この場合10万回に一回の割合でしかS01にアクセスをしないのですが
vcl_recvなどでバックエンドを選択する際にC01に対してはpass動作S01は通常動作とはできません

ここで便利なのが
req.backend.healthy
です
これは設定したバックエンドの生死をboolで返してくれます
なのでこんな感じで実現できます

01backend 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}
11backend s01 {
12  .host = "192.168.1.2";
13  .port = "80";
14}
15 
16sub vcl_recv {
17  set req.backend =c01;
18  if(!req.backend.healthy){
19    set req.backend=s01;
20  }else{
21    return(pass);
22  }
23}

こんな動作どう使え?と思う人もいるかも知れませんが多段キャッシュをする時などで
中間にもVarnishが入っているけどそれが死んでも最悪ストレージに直接・・・みたいなことができますね
passにしているのはメモリを節約するためです
他にもdirectorだけだと実現し辛いいろんな応用が効くと思います
チャレンジしてみてくださいね!


  One Response to “Varnishでちょっと特殊な負荷の割り当て方(req.backend.healthy)”

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください