mysql - HAProxy:从 DBCP 断开连接,为什么?

标签 mysql timeout connection-pooling load-testing haproxy

我有一个针对 MySQL 运行查询的 Web 应用程序 (Tomcat/Hibernate/DBCP 1.4),它在特定负载下运行良好,比如每秒 50 个查询。当我通过 HAProxy 路由相同的中等负载时(仍然只使用一个数据库),我遇到了一个失败,可能是每 500 个查询一次。我的应用报告:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 196,898 milliseconds ago.    The last packet sent successfully to the server was 0 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor210.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567)
...
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3017)
...

同时 HAProxy 日志显示了很多条目,例如:

27] mysql mysql/db03 0/0/34605 2364382 cD 3/3/3/3/0 0/0
Oct 15 15:43:12 localhost haproxy[3141]: 127.0.0.1:35500 [15/Oct/2012:15:42:50.0

“cD”显然表示客户端超时状态。因此,虽然我的 webapp 说 HAProxy 拒绝接受新连接,但 HAProxy 说我的 webapp 不接受返回的数据。

我没有包括我的 HAProxy 配置,因为我尝试了许多不同的参数值,结果基本相同。特别是,我在全局和服务器部分都将 maxconn 设置为高值和低值,并且统计信息中总是发生的情况是最大 session 增加到不超过 7 个左右。我的 JDBC 池大小也很高。

通常可以同时使用 JDBC 池和 HAProxy 池吗?人们以前遇到过这种问题吗?

我有一个关于如何解决这个问题的想法,即在每次查询之前发送一个“验证查询”。但是那里有一定的开销,我仍然想知道为什么我的 webapp 在直接进入 MySQL 时成功,但在通过 HAProxy 时连接断开。

我怎样才能进一步调试并获得比“cD”更多的信息?我尝试在 Debug模式下运行 HAProxy,但它似乎没有显示更多信息。

最佳答案

试试这个:

tune.bufsize 20480
tune.maxrewrite 2048

参见 the ha-docs为他们的意义。当您进入潜在致命参数的灰色区域时,您必须全神贯注地执行此操作。但值得一试,看看这是否有效。我刚刚解决了一个与文档相比毫无意义的问题。

默认值是 16k 和 1k。

关于mysql - HAProxy:从 DBCP 断开连接,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12931365/

相关文章:

timeout - 是否可以编写脚本来避免VPN超时

SQL 池与 Entity Framework

java - 如何检查连接池是否在 java 中工作?

mysql - 更改mysql数据库中项目顺序的最有效方法

mysql - 具有固定值的虚拟表 mysql

Java,限制BufferedReader读取时间

c# - 简单的 LINQ to Entities 更新抛出 'Timeout expired'

database - 不使用数据库连接池的原因?

Mysql 之间来自其他字段的两个日期

mysql - 我如何在没有 MySQL 的情况下浏览 mysql 数据库文件(*.frm、*.myd 和 *.myi)?