我基本上有这个线程中提到的相同的问题 – 我想临时挂起所有的请求到所有后端的服务器,以便我可以升级后端和它使用的数据库。 由于这是一个实时系统,我想排队请求,并在升级后将它们发送到后端服务器。 由于我正在通过代码更改进行数据库升级,所以我必须同时升级所有的后端服务器,所以我不能一次只下载一个。
我尝试使用tcp-request选项,除去该线程中提到的静态健康检查文件,但没有运气。 将默认的“maxconn”值设置为0似乎暂停和队列连接按照需要,但似乎没有办法增加值返回到一个正数,而不重新启动HAProxy,杀死所有已排队的请求,直到点。 (“热重新configuration”选项使用-sf和-st启动一个新的进程,似乎没有做我想要的)。
我正在尝试做什么?
我最终最终提出了HAProxy作者Willy Tarreau的这个问题。 他对我的build议很感兴趣,并对HAProxy做了一些小的改动,允许通过pipe理套接字将maxconn设置为零(这在我问的时候是不可能的),这解决了我的问题。 我从后续的电子邮件中引用他的话:
你好。 这很好地解决了我的问题。 我发出“设置maxconn前端my_frontend 0”,等待几秒钟的连接耗尽,然后所有后续连接都暂停。 我重新启动服务器,发出“设置maxconn前端my_frontend 3000”,连接恢复正常,没有错误的现有请求。
为了回应JesseP的回答 – 绝大多数时候我都不想这样做。 我们通常会按照您提到的方式尝试和完成数据库迁移,因为暂停stream量充其量是有风险的。 我们的一些用户设置的客户端超时时间很低,所以我们通常不希望stream量暂停超过15秒。 但是对于最近的一次迁移,我们有一套复杂的代码和数据迁移同时执行,有这个选项是一个救星。
所以,总结一下,不要把这个推荐给日常使用,但是如果需要的话,可以select。
即使你完成了所要求的内容,将来也会有更长时间的运行数据迁移,更新的服务器数量太多等等,而客户端在等待内容到来时会最终超时返回在线。
你应该真的尝试构build你的更新,使现有的服务器仍然可以运行。 这可能涉及到使用现有的数据库部署一些更新的代码,然后更新数据库,然后部署实际的更新。
最后,你应该能够一次部署一台服务器,而且不会破坏事情。