2016-11-22 6 views
1

바니시 4를 사용하여 여러 서버의 동일한 요청에 대한 다른 내용을 캐시합니다. 한 서버의 첫 번째 요청을 캐시하고 모든 후속 요청에 대해 동일한 콘텐츠를 제공하는 것처럼 보입니다.바니시 4로 다른 내용의 여러 서버에서 캐시하기

curl을 수행하면 두 개의 캐시와 다른 연령대의 응답을 제공합니다.

끈적 거리는 행동에 대해 부하 또는 다른 어떤 요인이 있습니까? 로드가있는 Jmeter와 Apache 벤치 마크를 사용했지만 여전히 동일한 동작을합니다.

내 vcl_hash가 좋은가요? 백엔드 서버의 url과 ip의 해시 조합으로 객체를 저장하고 싶습니다.

필자의 경우, 캐시 객체의 ttl 다음에 보이는 것처럼 보입니다. varnish는 두 번째 서버에서 캐싱하고 ttl이 완료 될 때까지 동일한 값을 반환합니다. 그러나 이것이 우리가 기대하는 바가 아닙니다.

나는 무엇이 있습니까?

라운드 로빈과 hash_data를 사용합니다. 아래

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); 
} 

답변

3

먼저 고려해야 할 것은 당신이 객체가 그것에서 인출 된 후에 만 ​​백엔드 IP를 가지고가는 것을 내 config.vcl이다. 따라서 vcl_hash가 가져 오기 전에 발생하기 때문에 해시 메소드에서 해당 IP를 사용할 수 없습니다.

두 번째은 대략 라운드 로빈입니다. Varnish가 오브젝트를 페치 할 때만 발생하므로 오브젝트가 이미 캐시 된 경우에는 일어나지 않습니다.

정확히에 대한 답변을 얻으려면 응용 프로그램이 동일한 요청에 대해 다른 콘텐츠를 제공하는 이유를 알아야합니다. 요청이 항상 동일한 경우 요청되는 백엔드를 어떻게 나타 냅니까? 요청에 응답해야하는 요청의 쿠키, 헤더 또는 원본 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); 
} 

희망이 답변은 귀하의 요구를 해결합니다. 내가 놓친 것이 있다면, 자유롭게 의견을 말하고 질문에 추가하면 내 대답에 약간의 정보를 추가하게되어 기쁩니다.

+0

완벽 ... 나는 생각했다. 당신의 대답은 나를 위해 일해야한다. 다른 내용에 대해, 응답은 캐시되고 캐시 된 obj를 전달하고 사용자가 소셜 네트워크에서 그의 내용을 업데이트하면 캐시 된 객체는 있어야한다. 무효화 된 새로운 res (내가 생각하는 아키텍처에 대해 생각해야합니다) – user1609085

+1

당신이 당신의 광택 구성에 퍼지를 구현하고 당신이 개체를 무효화해야 할 때마다 사용하는 것이 좋습니다 것입니다. 여기에 링크가 있습니다 : http://book.varnish-software.com/4.0/chapters/Cache_Invalidation.html#http-purge – alejdg