定义自定义负载均衡算法。

11

这是情况:

我有多台 Web 服务器,比如10台。我需要使用一个(软件)负载均衡器,可以使用反向代理服务器来实现,例如 HAProxy 或 Varnish。现在,我们提供的所有流量都是通过 https 而不是 http,所以 Varnish 是不考虑的。

现在,我想将用户请求分成几个类别,这取决于请求的一个输入(POST)参数。根据该参数,我需要将请求分配给服务器,因为基于该参数(即使所有其他输入(POST)参数相同),不同的服务器会提供不同的服务。

因此,我需要定义一个自定义的负载平衡算法,以便对于特定值的该参数,我将负载分配到特定的3个服务器(例如),对于其他值,将请求分配到2个特定服务器,而对于其他值,则分配到剩余的5个服务器。

由于我不能使用 Varnish,因为它无法用于终止 SSL(如果使用 VCL 简单定义自定义算法),因此我考虑使用 HA-Proxy。

所以,问题来了:

有人能帮我用 HA-Proxy 定义自定义负载平衡函数吗?

我已经做了很多研究,但找不到任何可以帮助我们完成这项工作的文档。所以,如果 HA-Proxy 不行,您能否推荐我一些其他反向代理服务,既可以用作负载均衡器,又符合上述两个条件?(SSL 终止和定义自定义负载平衡)。

编辑:

这个问题是在我的另一个问题之后的。 Varnish to be used for https


1
你会考虑使用Hitch → PROXY协议 → Varnish 4.1吗? - Carlos Abalde
1
@CarlosAbalde,我看到了。这不是我要找的东西。请查看链接:http://stackoverflow.com/questions/33475154/varnish-to-be-used-for-https。这也是我提出的一个相关问题。 - vish4071
1
HAProxy 1.6 - 使用req.body_param + ACL来定义后端路由 - https://cbonte.github.io/haproxy-dconv/configuration-1.6.html#7.3.6-req.body_param - Tan Hong Tat
1个回答

5
我不确定你的目标是什么,但我建议完全不要基于HTTP请求体进行自定义路由。这样做的性能非常差,很可能会超过你尝试实现的任何好处。
在负载均衡器上解析超出典型HTTP头的值会使事情变慢。如果可以避免,仅使用Cookie通常是一个不好的主意。
如果您可以控制路径/路由值,那可能比解析每个POST请求更好。
您可以使用NGINX和lua脚本(Kong平台基于它们)来实现您想要的功能,但我无法确定这对您来说有多难...
这里有一篇文章,介绍了根据lua输入设置不同上游的具体示例。 https://github.com/openresty/lua-nginx-module#readme

http://sosedoff.com/2012/06/11/dynamic-nginx-upstreams-with-lua-and-redis.html

server {
  ...BASE CONFIG HERE...

  port_in_redirect off;

  location /somepath {
    lua_need_request_body on;

    set $upstream "default.server.hostname";

    rewrite_by_lua '
      ngx.req.read_body()  -- explicitly read the req body
      local data = ngx.req.get_body_data()
      if data then
        -- use data: see
        -- https://github.com/openresty/lua-nginx-module#ngxreqget_body_data
        ngx.var.upstream = some_deterministic_value
      end
    '

    ...OTHER PARAMS...
    proxy_pass http://$upstream
  }
}

1
除了post之外,你能使用其他参数吗?你不能根据A/B参数来更改路径吗?或者基于IP和用户代理的复合哈希?还有cookie吗? - Tracker1
1
IP地址和用户代理无法使用...实际上,我的A/B参数(具体来说)就是POST参数本身,我不太确定我们是否将该数据存储在cookie中(在会话中),如果没有,更改代码库的这部分也将是一个头疼的问题。 - vish4071
1
假设你正在发布URL表单编码的内容?就像我说的,你可以使用nginx/lua来实现...但这并不是你提到的代理之一。http://wiki.nginx.org/HttpLuaModule#ngx.req.get_post_args - Tracker1
1
另外,还有一个关于读取数据和调整URL的示例的GitHub项目:https://github.com/openresty/lua-nginx-module。不确定是否可以根据输入/变量从Lua更改/使用proxypass指令。 - Tracker1
1
@vish4071 我在我的回答中添加了有关使用nginx完成您的任务的更多详细信息... 您还可以使用外部文件进行重用。 - Tracker1
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接