2016-09-26 30 views
0

我有兩個Varnish服務器,位於F5負載均衡器和兩個應用程序服務器(Apache httpd)之間的中間層。我想讓Varnish在兩臺Apache服務器之間平均分配負載。下面是我使用的結構的要位:清漆client.identity - 如何更均勻地分割負載?

backend prod1 { 
    .host = "172.16.1.1"; 
    .port = "80"; 
} 

backend prod2 { 
    .host = "172.16.2.1"; 
    .port = "80"; 
} 

director wpprod client { 
    { .backend = "prod1"; .weight = 1; } 
    { .backend = "prod2"; .weight = 1; } 
} 

sub vcl_recv { 
    set client.identity = req.http.user-agent; 
    set req.backend = wpprod; 
} 

這樣做的目的是採取不應該在會話過程中更改頭,而應是半隨機的(客戶端的用戶代理:頭) ,並用它來拆分兩臺後端服務器之間的負載。

不幸的是,在實踐中,負載被分成70-30左右,其中一個後端的流量大約是另一個後端的兩倍。

我也嘗試過使用X-Forwarded-For:標題,我的F5s作爲client.identity添加,但有同樣的問題。

我可以稍微調整權重,嘗試平衡負載,但這不是真正的可伸縮性,或者可用於多臺服務器。

我可以使用的標題的任何建議將導致更均勻的流量分裂?

+0

因此,最終證明這完全不是一個光油問題。在我們網絡的其他地方,一個失控的搜索引擎/蜘蛛正在錘擊這些服務器。由於它佔我們所有流量的40%,並且由於它發送的每個請求都具有相同的User-Agent:,修復該問題可以恢復大約50-50個餘額。 –

回答

0

假設你使用Varnish 3.x並假設你需要某種粘性(否則你可能是一個隨機或循環的導演),你可以用client.ip填充client.identity,或者,甚至更好,你可以生成/使用您自己的Cookie來爲每個客戶分配一個組:

... 

sub vcl_recv { 
    cookie.parse(req.http.Cookie); 

    unset req.http.X-Group; 
    if (cookie.get("group")) { 
     set client.identity = cookie.get("group"); 
    } else { 
     set req.http.X-Group = std.random(1, 1000); 
     set client.identity = req.http.X-Group; 
    } 

    set req.backend = wpprod; 
} 

sub vcl_deliver { 
    if (req.http.X-Group) { 
     header.append(
      resp.http.Set-Cookie, 
      "group=" + req.http.X-Group + "; domain=.example.com; path=/; expires=" + cookie.format_rfc1123(now, 365d)); 
    } 
} 
+0

client.ip將不起作用,因爲清漆服務器位於負載均衡器後面。 (因此,所有的請求看起來都來自同一個IP)。我嘗試使用X-Forwarded-For:但也遇到了同樣的問題(在Varnish服務器之間大約是2:1的分割)。 –

+0

「添加你自己的cookie」的想法當然有優點,但它更多的代碼,因此可能會有更多的東西可能會失控,更多的東西我必須記錄等等。如果有更好的「原生」方式來分割負荷,我認爲這將是可取的。也就是說,我肯定會在我的測試環境中實現這樣的功能,以查看它是否更均勻地分割流量。 –