我正在使用 HAProxy 来平衡应用服务器的负载。每个应用服务器都有一个最大连接数限制,一旦超过该限制,队列就会超出。当发生这种情况时,我将向 HAProxy 添加另一个应用服务器,并使用“优雅重新加载”来保留传入请求,直到服务重新启动。我的问题是,当它重新启动时,现有队列会发生什么 - 它会被保留吗?如果没有,我如何保留它?我显然不希望 HTTP 请求在重新加载时被丢弃。
答案1
来自官方文档:http://www.haproxy.org/download/1.7/doc/management.txt
HAProxy 支持正常停止和硬停止。硬停止很简单,当 SIGTERM 信号发送到 haproxy 进程时,它会立即退出并关闭所有已建立的连接。当 SIGUSR1 信号发送到 haproxy 进程时,会触发正常停止。它只包括解除监听端口的绑定,但继续处理现有连接,直到它们关闭。一旦最后一个连接关闭,进程就会退出。
硬停止方法用于服务管理脚本的“停止”或“重启”操作。优雅停止用于“重新加载”操作,该操作尝试在新的进程中无缝地重新加载新的配置。
这两个信号都可以由新的 haproxy 进程本身在重新加载或重启期间发送,因此它们会在最晚的时刻发送,并且仅在绝对需要时才发送。这分别由“-st”(hard)和“-sf”(graceful)选项执行。
具体来说:
它 [优雅停止] 仅包括解除监听端口的绑定,但继续处理现有连接直到它们关闭。
强调:但继续处理现有连接
您可能会看到后端队列降至 0,因为这些是新进程新形成的后端队列的统计数据。旧的队列已填满到最大,不再显示,因为它属于前一个进程。但根据此链接,它正在被处理,其中还包括一个测试场景,您可以自己验证这一点: