HAProxy在TCP模式下不返回错误

时间:2014-05-28 21:38:46

标签: postgresql tcp syslog haproxy

我有HAProxy路由到PostgreSQL机器列表。当主机打开PostgreSQL时,我可以使用下面的行成功连接。在所有主机上关闭PostgreSQL后,我希望看到来自HAProxy的错误消息,有些内容与“Connection refused”有关,但没有看到任何内容......这是我的示例配置:

global

    log             127.0.0.1 local4 debug
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 3000

frontend cluster01
    bind *:33300
    mode tcp
    option tcplog
    default_backend cluster01

backend cluster01
    mode tcp
    option tcplog
    balance     roundrobin
    server host1 <host ip>:5432 check
    server host2 <host ip>:5432 check

这是我试图执行的命令:

psql -U postgres -d <dbname> -p 33300 -h 127.0.0.1

以下是'回复':

psql: 

以下是syslog中的条目:

2014-05-28T21:17:15.486474+00:00 localhost.localdomain [info] haproxy[28503]: 127.0.0.1:58014 [28/May/2014:21:16:55.170] cluster01 cluster01/<NOSRV> -1/-1/0 0 SC 0/0/0/0/0 0/0

两个问题:

  1. 我的配置对于记录错误是否正常?

  2. HAProxy是否支持TCP连接的个性化错误消息?我注意到在特定的HTTP响应代码上,HAProxy支持 errorfile 条目,但我看不出有关TCP的任何相关内容......我错了吗?

  3. 任何问题都可以毫不犹豫地询问

1 个答案:

答案 0 :(得分:2)

您的错误已正确记录:“SC”标志表示无法建立服务器连接,并且服务器名称也表示连接未传递到任何服务器。这通常是因为您的服务器已关闭(或至少被启用的检查视为已关闭)。

在连接失败的情况下发送任何内容是不可能的(也不可取的),因为基于TCP的协议几乎是无限的列表,所有这些协议都不兼容,并且其中许多甚至不期望响应指示错误。相反,haproxy试图模仿它在另一方面的体验,甚至尝试将重置发送到客户端,如果它从服务器获得一个,但是没有办法保证它会以这种方式传递。