HAProxy:从DBCP中删除连接,为什么



我有一个Web应用程序(Tomcat/HHibernate/DBCP 1.4),它可以针对MySQL运行查询,在一定的负载下运行良好,比如每秒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"显然表示客户端超时的状态。因此,尽管我的网络应用程序说HAProxy拒绝接受新连接,但HAProxy说我的网络程序不接受返回的数据。

我没有包括我的HAProxy配置,因为我尝试了许多不同的参数值,结果基本相同。特别是,我在全局和服务器部分都将maxconn设置为高值和低值,统计数据中总是出现最大会话数不超过7的情况。我的JDBC池大小也很高。

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

我对如何解决这个问题有一个想法,那就是在每个查询之前发送一个"验证查询"。但这里有一定的开销,我仍然想知道为什么我的网络应用程序直接进入MySQL时会成功,但在通过HAProxy时会断开连接。

除了"cD"之外,我如何进一步调试并获得更多信息?我试着在调试模式下运行HAProxy,但它似乎没有透露更多信息。

试试这个:

tune.bufsize 20480
tune.maxrewrite 2048

请参阅ha文档了解其含义。当你进入潜在致命参数的灰色地带时,你必须全神贯注。但值得一试,看看这是否有效。我刚刚解决了一个与文档相比毫无意义的问题。

默认值为16k与1k。

相关内容

  • 没有找到相关文章

最新更新