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