HAProxy 在 TCP 模式下不返回错误

Posted

技术标签:

【中文标题】HAProxy 在 TCP 模式下不返回错误【英文标题】:HAProxy not returning error in TCP mode 【发布时间】:2014-05-28 21:38:46 【问题描述】:

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

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: 

这是系统日志中的条目:

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

两个问题:

    我的配置是否适合记录错误?

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

有任何问题都可以问

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

是的,我应该以不同的方式表述第一个问题。应该是“我的配置看起来可以返回错误(给客户端)吗?”。不过,您的第二段似乎已经回答了我的问题,谢谢

以上是关于HAProxy 在 TCP 模式下不返回错误的主要内容,如果未能解决你的问题,请参考以下文章

寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAP

部署HAproxy的TCP代理模式

haproxy tcp模式和http模式的区别

haproxy

Nginx支持TCP代理和负载均衡-stream模块

API 在“flutter run --release”模式下不起作用 [重复]