如何在haproxy中使用数千个后端?新地图功能对此有用吗?

rcr*_*crc 9 reverse-proxy load-balancing haproxy

我想使用haproxy作为代理和数千个后端的负载均衡器.因此,需要根据主机名将请求代理到正确的后端,然后在后端内进行负载平衡.我正在使用haproxy-1.5dev21.

配置文件如下所示:

frontend public
  bind :80
  mode http
  acl host1 hdr_reg(host) host1.com
  use_backend be_host1 if host1

  acl host4000 hdr_reg(host) host4000.com
  use_backend be_host4000 if host4000

backend be_host[n]
  server hostn_1
  server hostn_2
Run Code Online (Sandbox Code Playgroud)

问题是,如果有5000个主机,每个请求会增加30毫秒的延迟.对于20k后端,haproxy需要很长时间才能加载,更不用说每个请求的延迟灾难了.

我可以做一些比顺序acl规则更好的事情吗?我还没有找到新地图功能的示例 - 发行说明说它可以用于大量重定向规则.我试过这个:

use_backend %[hdr(host), map(host_to_backend_map.file)]
Run Code Online (Sandbox Code Playgroud)

使用地图时显然有些愚蠢,但任何指导都会有所帮助.谢谢!

rcr*_*crc 12

在专家输入后,配置文件中删除了一些缺点,我将其列在此处,以防其他人发现它有用.

  1. 使用hdr(Host)而不是hdr_reg().这极大地缩短了评估ACL所花费的时间.更好的是,避免使用内联评估,例如

    use_backend host1 if { req.fhdr(host,1) -m str host1.domain.com }

  2. 使用nbproc> 1.如果是并发连接,这会有所帮助.虽然它使调试变得困难.

  3. 对于后端,直接使用IP地址而不是'server hostn_1 dns_of_server:port_number'

  4. 将' fullconn 1000 '放在默认值部分中.这极大地改善了加载时间.

最后,使用最新的haproxy git checkout并观察加载时间的增强.它大大降低了.它现在的秒数与之前的几分钟相比.

此外,关于"map"功能,新的动态use_backend方案正在进行中,应该不需要编写尽可能多的ACL.

  • 更新 - 动态路由到后端的新功能在:`use_backend bk _%[hdr(host),map(host_to_backend_map.file)]如果为TRUE (3认同)