清漆client.identity - 如何更均匀地分割负载?

时间:2016-09-26 13:14:03

标签: load-balancing varnish

我有两个Varnish服务器,位于F5负载均衡器和两个应用服务器(Apache httpd)之间的中间层。我希望Varnish在两台Apache服务器之间或多或少地平均分配负载。以下是我使用的配置中的重要部分:

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

目的是获取在会话期间不应更改的标头,但应该是半随机的(客户端的User-Agent:标头),并使用它来分割负载之间的负载。两个后端服务器。

不幸的是,在实践中,负载正在被分成大约70-30,其中一个后端的流量大约是另一个后端的两倍。

我还尝试使用我的F5添加的X-Forwarded-For:标题作为client.identity,但遇到了同样的问题。

我可以稍微调整一下权重,以尝试均衡负载,但这不是真正可扩展的,或者对于多个服务器来说是可行的。

我可以使用哪些关于标题的建议会导致更均匀的流量分割?

2 个答案:

答案 0 :(得分:0)

假设您正在使用Varnish 3.x并假设您需要某种粘性(否则您可以使用随机或循环导演),您可以使用client.identity填充client.ip,或者,更好的是,您可以生成/使用自己的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));
    }
}

答案 1 :(得分:0)

我没有足够好的声誉来发表评论,这是一个相当古老的话题,而且 v3 更老,我不应该这样回答,但 Google 提供了这个,并且评论client.ip不准确。

当然,client.ip 是在代理后面工作的。

代理必须为该客户端的 IP 设置标头,例如在 Nginx 中:

proxy_set_header X-Real-IP $remote_addr;

必须转换成有用的字符串来代替client.ip:

std.ip(req.http.X-Real-IP, "0.0.0.0")); 其中 0.0.0.0 只是后备。

在 Varnish 中使用 cookie 是一个很奇怪的选择。