2

我正在使用 haproxy 1.5.4 。在 pgbouncer 前面。

我的配置启用了 pgsql-check。启用检查后,我会在pgbouncer 日志中看到这些消息。

2015-10-01 05:02:46.203 27104 LOG C-0x6609d0: (nodb)/(nouser)@10.53.6.132:38711 closing because: client unexpected eof (age=8)
2015-10-01 05:02:58.205 27104 LOG C-0x6609d0: (nodb)/(nouser)@10.53.6.132:39111 closing because: client unexpected eof (age=8)
2015-10-01 05:03:10.207 27104 LOG C-0x6609d0: (nodb)/(nouser)@10.53.6.132:39707 closing because: client unexpected eof (age=9)
2015-10-01 05:03:22.208 27104 LOG C-0x6609d0: (nodb)/(nouser)@10.53.6.132:40281 closing because: client unexpected eof (age=8)

这些是我在默认检查存在时收到的相同消息。我的意思是当没有选项 pgsql-check 时。

我还尝试在 pgsql-check 中提供一个有效用户,但我仍然看到这样的 eof 消息。

选项 pgsql-检查用户 pg

2015-10-01 04:58:27.057 27104 LOG C-0x6609d0: pg/pg@10.53.6.132:17813 login attempt: db=pg user=pg
2015-10-01 04:58:27.057 27104 LOG C-0x6609d0: pg/pg@10.53.6.132:17813 closing because: client unexpected eof (age=0)
2015-10-01 04:58:29.058 27104 LOG C-0x6609d0: pg/pg@10.53.6.132:17882 login attempt: db=pg user=pg
2015-10-01 04:58:29.058 27104 LOG C-0x6609d0: pg/pg@10.53.6.132:17882 closing because: client unexpected eof (age=0)

我的问题是pgsql-check与默认的tcp check. 我的印象是它会正确关闭连接,我不会在日志中看到这些消息。

我们是否看到了这些消息pgsql-check

4

2 回答 2

2

当 HAProxy 直接连接到 PostgreSQL(在我的例子中是 postgres 9.4 和 HAProxy 1.5)时,我有同样的消息。

在不提供任何用户名的情况下,我得到:

LOG:  could not receive data from client: Connection reset by peer
LOG:  incomplete startup packet

使用有效的用户名:

LOG:  could not receive data from client: Connection reset by peer

因此,显然,没有用户名的 pgsql-check 似乎非常接近“标准”tcp 检查。使用用户名,它似乎确实发送了一个有效的启动序列。但在这两种情况下,连接都会突然终止,并且似乎没有正确关闭。

解决方案可能是使用通用 TCP 检查来正确打开和关闭连接,但这违背了整个 pgsql-check 的目的。

于 2016-03-14T07:54:24.327 回答
0

我使用通用 TCP 检查进行了这样的配置。我实际上可以确认它也在日志中收到相同的错误。

您可以在我的 github 存储库https://github.com/gplv2/haproxy-postgresql中找到 python 脚本 + 示例配置

即使我确实发送了一个正确的十六进制关闭,我仍然在日志中得到这个:

LOG:无法从客户端接收数据:对等方重置连接

Afaik,我发送了一个正确的关闭,我已经用wireshark多次分析了这个,看看关闭发送到PG数据库的确切内容:

# write: terminate session
tcp-check send-binary 58                       # Termination packet
tcp-check send-binary 00000004                 # packet length: 4 (no body)

这是退出的十六进制转储(命令行客户端测试)

00000000 58 00 00 00 04 X....

事实上,haproxy 中的标准 psql-check 以及定制的通用 psql-check 似乎产生相同的结果是非常有趣的。当我找到解决方案时,我会分享它。

编辑:添加 psql 协议信息的来源: https ://www.postgresql.org/docs/9.5/static/protocol-message-formats.html

afaik,我完全按照记录的方式实现了关闭,但无济于事。

于 2018-10-08T09:36:11.100 回答