首页 文章

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

提问于
浏览
9

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

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

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

use_backend %[hdr(host), map(host_to_backend_map.file)]

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

2 回答

  • 12

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

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

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

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

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

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

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

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

  • 1

    我遇到了同样的问题 . 我目前正在尝试使用Redis上存储的所有后端的Nginx Lua .

    请求流程如下所示 .

    • 在Nginx收到请求 .

    • 根据请求主机,查询Redis . Redis可以使用Lua模块 .

    • 从Redis和Nginx检索后端信息代理请求到适当的后端 .

    • 后端(HAProxy),然后对请求进行负载均衡 .

    对此的动机来自http://openresty.org/#DynamicRoutingBasedOnRedis

    希望这可以帮助 .

相关问题