haproxy pgsql-check和eof消息

时间:2015-10-01 05:30:49

标签: haproxy pgbouncer

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

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

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-check user 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看到了这些消息?

2 个答案:

答案 0 :(得分: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检查。使用用户名,它似乎发送有效的启动序列。但在这两种情况下,连接都会突然终止,并且不能正常关闭或看起来。

解决方案可能是使用the generic TCP check来正确打开和关闭连接,但这样做无视整个pgsql-check目的。

答案 1 :(得分: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协议信息的来源:https://www.postgresql.org/docs/9.5/static/protocol-message-formats.html

afaik,我完全按照文献记载的方法实施了关闭操作,