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だけだと実現し辛いいろんな応用が効くと思います
チャレンジしてみてくださいね!


  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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください