1

varnish 4 を使用して、複数のサーバーからの同じリクエストの異なるコンテンツをキャッシュします。あるサーバーからの最初のリクエストをキャッシュし、後続のすべてのリクエストに対して同じコンテンツを提供し続けているようです。

curl を実行すると、2 つのキャッシュと異なる年齢で応答が得られます。

粘着性の動作に負荷などの要因はありますか? Jmeter と apache ベンチマークを負荷で使用しましたが、それでも同じ動作が得られました。

私の vcl_hash は良いですか? バックエンド サーバーの url と ip のハッシュの組み合わせでオブジェクトを保存したい。

少なくとも私の場合、キャッシュ オブジェクトの ttl の後に、varnish が 2 番目のサーバーからキャッシュされ、ttl が完了するまで同じ値を返します。しかし、これは私たちが期待する動作ではありませんか?

私は何か不足していますか?

ラウンド ロビンと hash_data を使用します。以下は私のconfig.vclです

backend s1{
    .host = "190.120.90.1";
}

backend s2{
    .host = "190.120.90.2";
}

sub vcl_init {
    new vms = directors.round_robin();
    vms.add_backend(s1);
    vms.add_backend(s2);
}

sub vcl_recv {
    set req.backend_hint = vms.backend();
}

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return(lookup);
}
4

1 に答える 1

3

最初に考慮すべきことは、オブジェクトが取得された後にのみバックエンド IP を取得することです。したがって、フェッチの前に vcl_hash が発生するため、ハッシュ メソッドでその IP を使用することはできません。

2つ目はラウンドロビンについてです。Varnish がオブジェクトをフェッチしているときにのみ発生するため、オブジェクトが既にキャッシュされている場合は発生しません。

質問に正確に答えるには、アプリケーションが同じリクエストに対して異なるコンテンツを配信する理由を知る必要があります。リクエストが常に同じである場合、どのバックエンドがリクエストされているかをどのように示しますか? その要求に応答する必要があるものを決定する必要がある、要求の Cookie、ヘッダー、または発信元 IP のようなものが必要です。

特定のバックエンドを設定して vcl_hash で使用できることを知っている。例として、次の名前のヘッダーの存在に基づいてバックエンドを設定するとしますbackend_choice

sub vcl_recv {
  if (req.http.backends_choice == "s1") {
    set req.backend_hint = s1;
  # If the header is not "s1" or does not exist
  } else {
    set req.backend_hint = s2;
  }
  ...
}

sub vcl_hash {
  hash_data(req.url);
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }
  # We use the selected backend to hash the object
  hash_data(req.backend_hint);
  return(lookup);
}

この回答があなたのニーズに対応することを願っています。見逃したものがある場合は、お気軽にコメントするか、質問に追加してください。回答に情報を追加させていただきます。

于 2016-11-23T20:31:01.870 に答える