![逐个对服务器进行 haproxy 备份/故障转移](https://linux22.com/image/724936/%E9%80%90%E4%B8%AA%E5%AF%B9%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E8%A1%8C%20haproxy%20%E5%A4%87%E4%BB%BD%2F%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB.png)
我在我们的环境中为不同的应用程序运行 haproxy 1.6。以前我们使用思科产品。Haproxy 有很多优点,但有一件事我无法用 haproxy 配置,或者我不知道如何配置。
假设我有一个如下配置的后端:
backend test_farm
mode http
option httplog
balance leastconn
cookie test_farm insert nocache
option httpchk /test
option allbackups
timeout check 10s
default-server inter 4s fall 15 rise 6
server host1_server1 host1:24320 check cookie PZ22
server host1_server2 host1:24350 check cookie PZ23
server host1_server3 host1:22250 check cookie PZ24
server host1_server4 host1:22280 check cookie PZ25
server host1_server5 host1:22310 check cookie PZ26
server host1_server6 host1:22340 check cookie PZ27
server host2_server1 host2:24320 check cookie BZ22 backup
server host2_server2 host2:24350 check cookie BZ23 backup
server host2_server3 host2:22250 check cookie BZ24 backup
server host2_server4 host2:22280 check cookie BZ25 backup
server host2_server5 host2:22310 check cookie BZ26 backup
server host2_server6 host2:22340 check cookie BZ27 backup
所有服务器都安装了相同的应用程序。我有几个后端,其中包含其他应用程序。但每个后端仅服务于一个特定的应用程序,并且服务器数量各不相同。用户必须尽可能长时间地停留在一台服务器上,以避免重新登录。如您所见,我使用 cookie 插入将用户固定在其第一个连接的服务器上。该应用程序无法在所有服务器上使用会话持久性。
当所有正常服务器都宕机时,Haproxy 只会使用备份服务器,但我不能等到所有服务器都宕机。在这种情况下,也许 4 台服务器可以处理负载,但再失去一台服务器将使剩下的 3 台服务器陷入困境。由于多种原因,我无法简单地在 host1 和 host2 上的所有服务器上进行负载平衡。备份服务器在正常情况下应该没有负载。我读过 1.8 版文档,但这个文档没有变化,我也没有发现任何这方面的新功能。在 cisco 产品上,您可以配置,当 host1 上的 server1 宕机时,立即在 roundrobin 或 leastconn 算法中使用 host2 上的 server1。
这是我的问题,如何配置这种行为。
我想到/尝试了一些方法:
在 acl 中使用 nbsrv,为相同的服务器定义两个或更多后端部分,并添加备份部分:这个方法有效,但我失去了会话亲和性,因此用户将被踢出应用程序,需要重新登录。而且我猜想使用相同服务器的后端越多,执行的检查就越多,这会对负载产生影响,我想避免这种情况。
定义与上述相同的配置,但不使用备份关键字。相反,我将备份服务器的权重定义为 0。然后使用由 cron 触发的脚本,通过 adminsocket 确定有多少服务器处于活动状态,如果两个或更多正常服务器关闭,则增加备份服务器的权重(也通过 adminsocket)。我还没有测试过这个。但你可以想象这也不是首选方法。
让我非常老旧的 C 知识得到更新并尝试编写这种行为,但是你知道,我更愿意坚持使用那些拥有更好的编码知识的开发人员提供的版本。
我希望有人可能有同样的情况,并能给我一些提示,如何使用 bord 媒介来实现这一点。当然,我读完了我在谷歌上找到的所有内容,但没有一个与我的情况相关。
谨致问候,kaniggl
答案1
这是否会如您所期望/想要的那样有效?
其工作方式:当 test_farm 上的活动服务器数量低于 4 时,它会完全切换到 test_farm_backup。
无论如何请记住,只要您在 test_farm 上启动 4 台服务器,流量就会切换。
frontend ft_test_farm
bind 10.10.10.10:80
# detect if we go under 4 active servers
acl test_farm_overflow nbsrv(test_farm) le 4
use_backend test_farm_backup if test_farm_overflow
default_backend test_farm
backend test_farm
mode http
balance leastconn
cookie test_farm insert nocache
option httpchk /test
timeout check 10s
default-server inter 4s fall 15 rise 6
server host1_server1 host1:24320 check cookie PZ22
server host1_server2 host1:24350 check cookie PZ23
server host1_server3 host1:22250 check cookie PZ24
server host1_server4 host1:22280 check cookie PZ25
server host1_server5 host1:22310 check cookie PZ26
server host1_server6 host1:22340 check cookie PZ27
backend test_farm_backup
mode http
balance leastconn
cookie test_farm insert nocache
option httpchk /test
timeout check 10s
default-server inter 4s fall 15 rise 6
server host2_server1 host2:24320 check cookie BZ22
server host2_server2 host2:24350 check cookie BZ23
server host2_server3 host2:22250 check cookie BZ24
server host2_server4 host2:22280 check cookie BZ25
server host2_server5 host2:22310 check cookie BZ26
server host2_server6 host2:22340 check cookie BZ27