2016-07-28 16 views
0

私は時々 "遅い"となるバックエンドを持つワニスキャッシュ(バージョン4)を持っています。私はヘルスチェックを使用して、このバックエンドが飽和状態にならないように「遅い」ときに、ワニスが古くなったコンテンツをキャッシュから削除するよう強制します。なぜワニスに非常に多くのパスがありますか?

ソミバックエンドが定義されています

backend api { 
    .host = "111.111.111.111"; 
    .port = "80"; 
    .first_byte_timeout = 300s; 
    .probe = { 
      .url = "/some/url"; 
      .expected_response = 200; 
      .timeout = 80ms; 
      .interval = 120s; 
      .window = 1; 
      .threshold = 1; 
    } 

}

backend apibackup { 
    .host = "111.111.111.111"; 
    .port = "80"; 
    .first_byte_timeout = 300s; 
    .probe = { 
      .url = "/some/url"; 
      .expected_response = 200; 
      .timeout = 80ms; 
      .interval = 120s; 
      .window = 1; 
      .threshold = 1; 
    } 

}

そして、猶予モード設定:

sub vcl_hit { 
    if (obj.ttl > 0s) { 
      # A standard hit, deliver from cache 
      return (deliver); 
    } 
    elsif (std.healthy(req.backend_hint)) { 
      if (obj.ttl + 30s > 0s) { 
        # page expired within a limited grace time and backend 
        # is healthy: deliver from cache while cache is updated 
        # asynchronous 
        return (deliver); 
      } else { 
        # page expired too long ago - fetch from backend 
        return (fetch); 
      } 
    } 
    else { 
      if (obj.ttl + obj.grace > 0s) { 
        # backend is not healthy - provide the page from cache 
        # during full grace time set in vcl_backend_response 
        return (deliver); 
      } else { 
        # page expired for the full grace time and backend is 
        # considered unhealthy - try to contact the backend 
        # anyway 

        return (fetch); 
      } 
    } 

}

しかし、この構成でのみ、バックエンドが病気でオブジェクトがキャッシュに存在しない場合、ワニスは503を返します(バックエンドからフェッチしたい)。バックエンドが遅いとき

sub vcl_miss{ 

    if (std.healthy(req.backend_hint)) { 
        return (fetch); 
      } 
    else { 
        set req.backend_hint = apibackup; 
        return (fetch); 
      } 

}

この方法では、結果が期待されているように、この動作を回避するために、私は、ワニスは、「病気」バックエンドからコンテンツを取得強制的にvcl_missで同じのconfを置く必要がありますワニスはキャッシュから失効したコンテンツを提供し、応答時間が改善されます。

しかし、私は今、より多くの「合格」要求を持っていることを発見しました。もちろん、ワニスはキャッシングする必要があります(そしてその前に)。 Aprox * 100以上。だから私は問題を修正しましたが、別のものを作成しました。

ワニスを強制的にキャッシュするために、cookieは両方とも(recvとバックエンドの応答で)設定されていません。私はパス要求の多くを持っているのはなぜ

unset beresp.http.set-cookie; 

unset req.http.Cookie; 

だから、私の質問は...ありますか?どうすればそれを避けることができますか?バックエンドが病気であると オブジェクトがキャッシュに存在しない場合

答えて

0

しかし、これだけの構成で、ワニスは503を返します(と私は バックエンドからフェッチしたいです)。この動作を回避するために、私は「病気」バックエンドからコンテンツを取得ワニスを強制的にvcl_missに同じconfに を置く必要があります。

...

を、私はこの仮定が間違っていると思います。そのvcl_missサブルーチンは組み込みのサブルーチンと同等です。あなたはいつもreturn (fetch)を実行しています。このコードを追加しても、猶予コンテンツが利用できない場合には、ワニスに病的なバックエンドを使用させることはありません。実際、私が知る限り、ワニスに病気のバックエンドを使用させることはできません。

私は、このコードを使用しても何も変わらないことを示すためにおもちゃのワニステストケースを作成しました。 Varnishは、猶予期間のコンテンツが利用できない場合、病的なバックエンドを使用しないため、クライアントに503の応答を送信します。

varnishtest "" 

server s1 { 
    rxreq 
    expect req.url == "/1" 
    txresp -body "foo" 
} -start 

varnish v1 -vcl+backend { 
    import std; 

    sub vcl_hit { 
     if (obj.ttl > 0s) { 
      return (deliver); 
     } 
     elsif (std.healthy(req.backend_hint)) { 
      return (deliver); 
     } 
     else { 
      if (obj.ttl + obj.grace > 0s) { 
       return (deliver); 
      } else { 
       return (fetch); 
      } 
     } 
    } 

    # XXX: nonsense subroutine equivalent to the build-in one just to show this 
    # doesn't force Varnish to fetch contents from sick backends. 
    sub vcl_miss{ 
     if (std.healthy(req.backend_hint)) { 
      return (fetch); 
     } else { 
      return (fetch); 
     } 
    } 

    sub vcl_backend_response { 
     set beresp.ttl = 1s; 
     set beresp.grace = 1s; 
    } 
} -start 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

varnish v1 -cliok "backend.set_health s1 sick" 

delay 1.5 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

delay 1.0 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 503 

    txreq -url "/2" 
    rxresp 
    expect resp.status == 503 
} -run 

更新テストケース:

varnishtest "" 

server s1 { 
    rxreq 
    expect req.url == "/1" 
    txresp -body "foo" 

    rxreq 
    expect req.url == "/1" 
    txresp -body "foobar" 

    rxreq 
    expect req.url == "/2" 
    txresp -body "hello" 
} -start 

varnish v1 -vcl { 
    import std; 

    backend default { 
     .host = "${s1_addr}"; 
     .port = "${s1_port}"; 
    } 

    backend backup { 
     .host = "${s1_addr}"; 
     .port = "${s1_port}"; 
    } 

    sub vcl_hit { 
     if (obj.ttl > 0s) { 
      return (deliver); 
     } 
     elsif (std.healthy(req.backend_hint)) { 
      return (deliver); 
     } 
     else { 
      if (obj.ttl + obj.grace > 0s) { 
       return (deliver); 
      } else { 
       return (fetch); 
      } 
     } 
    } 

    sub vcl_miss{ 
     if (!std.healthy(req.backend_hint)) { 
      set req.backend_hint = backup; 
     } 
     return (fetch); 
    } 

    sub vcl_backend_response { 
     set beresp.ttl = 1s; 
     set beresp.grace = 1s; 
    } 
} -start 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

varnish v1 -cliok "backend.set_health default sick" 

delay 1.5 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

delay 1.0 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 6 

    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 6 

    txreq -url "/2" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 5 
} -run 

varnish v1 -expect cache_hit == 2 
varnish v1 -expect cache_hitpass == 0 
+0

申し訳ありませんが、あなたは正しいです。私は少し詳細を忘れました。私は、ワニスにコンテンツを取得させる代替バックエンドを持っています(しかし同じです)。 –

+0

ありがとう!その詳細は非常に重要でした:)私はあなたの設定を反映するためにテストケースを調整し、期待どおりに動作します。つまり、内容はバックアップバックエンドから取得され、 '' cache_hitpass''カウンタは増加していません。それらの「合格」要求をどのように測定していますか? –

関連する問題