我让 haproxy 监听几个端口并指向几个后端服务器。
理想情况下,我希望到同一端口的重复通信指向同一个后端。
“平衡源”是行不通的,因为请求通常来自同一来源。
这可行吗?
我也接受非 haproxy 解决方案。使用的协议并不重要,但肯定不是 http。只要假设它是 ssh,就不会出错。
编辑:为了澄清起见,假设我有 10 个“后端服务器”和 5 个“客户端”。每个后端服务器一次只能处理一个连接。我的服务器数量比需要的多,以防某些服务器不可用。我将手动将每个客户端指向 haproxy 端口。我想确保每个客户端始终能连接到后端服务器(这很简单),但最好每次都连接到同一个后端服务器(只要它可用)。
答案1
以下是我解决问题的方法。
frontend name_of_frontend
bind *:20000-20010
default_backend servers
backend servers
balance roundrobin
stick-table type integer size 1k expire 3h
stick on dst_port
server name ip-address check maxconn 1
...
server name ip-address check maxconn 1
Willy 在之前的回答的评论中警告说“它不能保证每个客户端都会转到不同的端口”。
在我的具体情况下,我可以完全控制我的“客户端”。我将它们指向代理服务器上的不同端口的唯一原因是这样我就可以将它们识别为不同的客户端。这绝对不是一个“公共”系统。
答案2
Haproxy 不实现 ip:port 持久性,因为在代理中这没有任何意义。在基于数据包的负载平衡器(例如 LVS)中,这样做很有意义,因为它允许无状态负载平衡,具有类似循环的分布和持久性。但在代理中,连接必须从头到尾在两端保持。所以我真的不知道你到底想实现什么。
如果您需要的只是目标端口 -> 服务器关系,这看起来很奇怪,因为您需要监听比服务器多得多的端口才能实现平稳平衡。我真的不确定您是否想这样做。
答案3
我不是 haproxy 专家,但我知道它做除此之外还有其他负载平衡选项source
(至少有循环)。我建议查看 HAProxy 文档,了解每种负载平衡模式的功能和限制。
您还可以通过使用pf
防火墙(其众多版本之一)来实现您想要的效果——普富思如果你需要 GUI,这是一个不错的选择。使用选项集在防火墙上设置负载平衡(循环或类似)sticky-address
,你应该有一个可行的设置。