我想使用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 回答
在专家输入后,配置文件中删除了一些缺点,我将其列在此处,以防其他人发现它有用 .
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 .
我遇到了同样的问题 . 我目前正在尝试使用Redis上存储的所有后端的Nginx Lua .
请求流程如下所示 .
在Nginx收到请求 .
根据请求主机,查询Redis . Redis可以使用Lua模块 .
从Redis和Nginx检索后端信息代理请求到适当的后端 .
后端(HAProxy),然后对请求进行负载均衡 .
对此的动机来自http://openresty.org/#DynamicRoutingBasedOnRedis
希望这可以帮助 .