HAProxy——暂停/排队所有流量而不会丢失请求

Mar*_*arc 5 high-availability load-balancing haproxy

我基本上有这个线程中提到的相同问题——我想暂时挂起对某个后端所有服务器的所有请求,以便我可以升级后端及其使用的数据库。由于这是一个实时系统,我想对请求进行排队,并在升级后将它们发送到后端服务器。由于我正在使用代码更改进行数据库升级,因此我必须同时升级所有后端服务器,因此我不能一次只关闭一个。

我尝试使用 tcp-request 选项结合删除该线程中提到的静态健康检查文件,但没有运气。将默认的“maxconn”值设置为 0 似乎可以根据需要暂停和排队连接,但是如果不重新启动 HAProxy,似乎无法将值增加回正数,这会杀死所有已排队的请求,直到观点。(使用 -sf 和 -st 的“热重新配置”选项启动一个新进程,这似乎不是我想要的)。

我正在尝试做的可能吗?

Mar*_*arc 9

我最终向 HAProxy 的作者 Willy Tarreau 提出了这个问题。他对我的建议很感兴趣,并对 HAProxy 做了一个小改动,允许通过管理套接字将 maxconn 设置为零(这在我问的时候是不可能的),这解决了我的问题。引用我发给他的后续电子邮件:

你好呀。这很好地解决了我的问题。我发出了“set maxconn frontend my_frontend 0”,等了几秒钟让连接耗尽,然后所有后续连接都暂停。我重新启动了服务器,发出“set maxconn frontend my_frontend 3000”,并且连接正常恢复,没有错误处理现有请求。

作为对 JesseP 的回答的回应——当然,大部分时间我都不想这样做。我们通常会完全按照您提到的方式尝试和暂存我们的数据库迁移,因为暂停流量充其量是有风险的。我们的一些用户设置了低得离谱的客户端超时,因此我们通常不希望流量暂停超过 15 秒。但是对于最近的一次迁移,我们需要同时执行一组复杂的代码和数据迁移,因此提供此选项是一种救命稻草。

所以,总而言之 - 不建议将其用于日常使用,但可以在需要时选择。