我基本上有同样的问题此主题-- 我想暂时暂停对某个后端的所有服务器的所有请求,以便我可以升级后端及其使用的数据库。由于这是一个实时系统,我想将请求排队,并在后端服务器升级后将它们发送到后端服务器。由于我正在通过代码更改进行数据库升级,所以我必须同时升级所有后端服务器,所以我不能一次只关闭一台。
我尝试使用 tcp-request 选项并删除该线程中提到的静态健康检查文件,但没有成功。将默认的“maxconn”值设置为 0 似乎可以暂停并根据需要排队连接,但似乎没有办法在不重新启动 HAProxy 的情况下将该值增加回正数,这会终止在此之前排队的所有请求。(使用 -sf 和 -st 的“热重新配置”选项会启动一个新进程,这似乎不是我想要的)。
我尝试做的事可行吗?
答案1
我最终向 HAProxy 的作者 Willy Tarreau 询问了这个问题。他对我的建议很感兴趣,并对 HAProxy 做了一个小改动,允许通过管理套接字将 maxconn 设置为零(这在我询问时是不可能的),这解决了我的问题。引用我发给他的后续电子邮件:
你好。这很好地解决了我的问题。我发出了“set maxconn frontend my_frontend 0”,等待几秒钟让连接耗尽,然后所有后续连接都暂停。我重新启动了服务器,发出了“set maxconn frontend my_frontend 3000”,连接正常恢复,现有请求没有出错。
回应 JesseP 的回答——当然,大多数时候我都不想这样做。我们通常会尝试按照您提到的方式进行数据库迁移,因为暂停流量至少是有风险的。我们的一些用户将客户端超时设置得非常低,因此我们通常不希望流量暂停超过 15 秒。但对于最近的迁移,我们有一组复杂的代码和数据迁移需要同时执行,有这个选项真是救命稻草。
因此,总而言之 - 不建议日常使用,但如果有需要,可以选择。
答案2
即使您完成了所要求的工作,将来您也还是会面临更长时间的数据迁移、太多的服务器需要更新等问题,并且客户端在等待内容重新上线时最终会超时。
您确实应该尝试构建更新,以便现有服务器仍能运行。这可能涉及使用现有数据库部署一些更新的代码,然后更新数据库,然后部署实际更新。
最后,您应该能够一次部署一台服务器,而不会造成破坏。
答案3
我无法使用 haproxy 的方法,set maxconn frontend myfrontend 0
因为set maxconn frontend myfrontend 1000
当我执行第二个命令来解除对请求的阻止时,我的 haproxy 崩溃了。
我采用了 OpenResty 的另一种方法,并在此处记录:https://github.com/svilen-ivanov/antract
antract 是一组用 Lua 编写的 OpenResty 脚本,可帮助您对后端服务执行简单的零停机维护。其目标是通过在后端服务因维护而停机并重新启动时将传入请求保持在“飞行状态”来限制对用户的影响。用户会看到一个长请求,一切照常进行。