2016-09-26 55 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”的想法当然有优点,但它更多的代码,因此可能会有更多的东西可能会失控,更多的东西我必须记录等等。如果有更好的“原生”方式来分割负荷,我认为这将是可取的。也就是说,我肯定会在我的测试环境中实现这样的功能,以查看它是否更均匀地分割流量。 –