为了获得容错能力,我在 Thruk 和多个 nagios 后端之间使用 Livestatus 插件运行 haproxy。Thruk 没有连接超时,因此“死机”后端会导致 Thruk 加载时间过长,通常会导致 apache(通过 fcgi 代理到 Thruk)超时。
当 Thruk 发送外部命令时,我遇到了问题。客户端不期望服务器响应,因此它在发送数据后立即关闭连接。如果尚未与远程服务器建立连接,这显然会导致 haproxy 断开连接。它会导致如下日志条目:
127.0.0.1:48350 [07/4月/2014:12:39:17.268] thruk_backend_nagios2_6557_6559 thruk_backend_nagios2_6557_6559/nagios2 0/-1/0 0 CC 0/0/0/0/0 0/0
CC 显然意味着客户端在 haproxy 尝试连接后端服务器时意外关闭了连接。一旦发生这种情况,haproxy 就不会继续尝试建立与后端的连接,这意味着客户端发送的数据会被丢弃。
我认为 tcp-smart-accept/connect 选项可能会有帮助,但它们没有效果。
除了修改客户端或在 Thruk 和 haproxy 之间添加某种存储转发 TCP 代理之外,我还能做些什么吗? haproxy 是否有一个选项可以缓冲客户端的请求,并在建立连接后将其发送到服务器,即使客户端已经消失?