我正在 HAProxy 上运行一些关于“uri whole”负载平衡算法的测试。我的操作系统是 Ubuntu 16.04.2 LTS,我的版本是 HA-Proxy 版本 1.7.7-1ppa1~xenial 2017/06/27。
编辑:我正在使用 Server-Sent-Events (SSE) 来处理长时间运行的请求。
这是我的后端配置:
backend Proxy
mode http
balance uri whole
hash-type consistent
http-reuse safe
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option http-server-close
option httpchk
http-check expect ! rstatus ^503
timeout tunnel 24h
server xxxx 192.168.0.10:8080 check maxconn 2 maxqueue 1
server yyyy 192.168.0.11:8080 check maxconn 2 maxqueue 1
以下是我的观察:
1 - 请求 A 被发送到其中一个服务器,具体取决于问号后的哈希值和其他一些选项。假设在服务器 xxxx 上。
2-针对完全相同 URI 的下一个请求将在服务器 xxxx 上进行,其 maxconn 为 2。
3 – 第三个将留在队列中。
4 - 第四个无法到达任何地方,我从 HAProxy 收到“503 服务不可用 - 没有可用的服务器来处理此请求。”。向其他服务器发送请求的唯一方法是将服务器 xxxx 标记为“关闭”或“维护”。没有“哈希类型一致”或“备份”选项也一样。
5-所有健康检查都发送到同一台服务器。
关于第 4 点和第 5 点,我的问题如下:
我认为“uri whole”是一种负载平衡算法。如果服务器 xxxx 无法处理第 4 个请求(我理解哈希不会改变),那么第 4 个请求是否不应该在服务器 yyyy 上进行平衡?
为了绕过此行为,我尝试配置健康检查以告诉 HAProxy 将响应 503 代码的服务器标记为“关闭”。但它不起作用...我的后端定义中是否缺少某些内容?
甚至健康检查也只针对一台服务器。这没什么用... 有什么我不明白的吗?
我的目标是平衡第二台服务器上的第 4 个请求(理想情况下是第 3 个请求):)
感谢您的帮助!
答案1
听起来请求 1 和 2 仍然与后端保持连接(长时间运行的请求?)。请求 3 已排队(仅允许 2 个连接),请求 4 已被丢弃,因为您将队列限制为一个请求。
后端并未关闭——仍有两个连接处于打开状态。
在 503 上将后端标记为关闭不会触发,因为 503 来自 haproxy,而不是后端。
抱歉,如果这不能真正解决您的问题,但也许它可以帮助您更好地理解它:)