2016-11-22 100 views
1

使用清漆4緩存來自多個服務器的相同請求的不同內容。它看起來像緩存來自一臺服務器的第一個請求,併爲每個後續請求不斷提供相同的內容。清漆4從多個不同內容的服務器緩存

做捲曲給予兩個緩存和不同年齡的響應。

是否有像負載或其他任何粘性行爲的因素? 使用Jmeter和Apache的基準加載,但仍然有同樣的行爲。

我的vcl_hash好嗎?想要使用後端服務器的url和ip的散列組合保存對象。

至少在我的情況下,看起來像在緩存對象的ttl之後,varnish從第二個服務器緩存並返回,直到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); 
} 

回答

3

首先要考慮的是,你將有隻有在對象已經從它取出後端IP。所以你不能在你的散列方法上使用該ip,因爲vcl_hash發生在fetch之前。

是關於循環法。它只有在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); 
} 

希望這個答案滿足您的需求。如果有什麼我錯過了,隨時發表評論或添加到您的問題,我會很高興爲我的答案添加一些信息。

+0

完美..我想錯了..你的答案應該爲我工作..關於不同的內容,響應緩存並提供緩存的對象,並在平均時間,如果用戶更新他的內容在社交網絡緩存對象應該是無效並返回新的資源(我需要考慮我認爲的體系結構) – user1609085

+1

我建議您在您的Varnish配置中實施清除,並在需要使對象無效時使用它。這裏是它的鏈接:http://book.varnish-software.com/4.0/chapters/Cache_Invalidation.html#http-purge – alejdg