我在生产中使用 HAProxy 将查询平衡到一系列服务器实例,这些服务器实例一次只能处理 1 个查询(由我们自己决定)。我知道我在 haproxy.cfg 文件中后端配置的服务器定义行中将 maxconn 参数设置为 1,但服务器仍然会收到查询,因为我在服务器的日志消息中看到了“查询被拒绝,正在处理”,并且在 HAProxy 日志查询中也看到了返回客户端的 502 http 状态代码。
这是 HAProxy 的配置:
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local6 debug
user haproxy
group haproxy
daemon
stats socket /tmp/haproxy
defaults
log global
mode http
balance roundrobin
option httplog
retries 10
option redispatch
frontend custom 0.0.0.0:50000
backlog 2000
acl p5queue avg_queue(custombe) gt 200
tcp-request content reject if p5queue
default_backend custombe
timeout client 15000
backend custombe
retries 10
option redispatch
timeout queue 600000
timeout connect 1000
timeout server 120000
server custom-server-1 0.0.0.0:50001 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-2 0.0.0.0:50002 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-3 0.0.0.0:50003 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-4 0.0.0.0:50004 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-5 0.0.0.0:50005 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-6 0.0.0.0:50006 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-7 0.0.0.0:50007 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-8 0.0.0.0:50008 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-9 0.0.0.0:50009 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-10 0.0.0.0:50010 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
有人知道为什么当 maxconn 参数设置为 1 时,服务器实例会获取查询?我读过StackOverflow 上关于 maxconn 的解释以及它的工作原理在不同的部分,这就是我现在问这个问题的原因,它不应该像这样工作。
答案1
确保没有其他进程与您的服务有开放的连接。
特别注意,在 期间haproxy reload
,有两个 haproxy 进程将使用您的资源,并且每个进程都会自行执行连接限制。完成进程将不会在所有队列耗尽之前终止。因此,新进程及其客户端很有可能争用席位。
我能想到的最佳解决方法是
- 每个工作进程精确接受两个连接,
- 注意不要
haproxy
在整理过程仍在运行时重新加载。