2012-10-17 57 views
4

我有一个运行MySQL查询的webapp(Tomcat/Hibernate/DBCP 1.4),并且这对某个负载很有效,比如50个查询。当我通过HAProxy路由相同的中等负载(仍然只使用单个数据库)时,我遇到了故障,可能每500个查询就有一个故障。我的应用报告:HAProxy:从DBCP丢弃连接,为什么?

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设置为高值和低值,并且在统计数据中总是发生的情况是最大会话数不超过7个。我的JDBC池大小也很高。

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

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

如何进一步调试并获取比“cD”更多的信息?我尝试在调试模式下运行HAProxy,但似乎没有透露更多信息。

+0

我也有类似的问题。你在下面提到你“继续前进”......你能告诉我你做了什么来解决这个问题吗? – luksch

回答

0

试试这个:

tune.bufsize 20480 
tune.maxrewrite 2048 

它们的含义见the ha-docs。当你进入潜在致命参数的灰色区域时,你必须全神贯注。但值得一试,看看这是否有效。我刚刚解决了一个与此文档无关的问题。

默认值为16k vs 1k。

+1

谢谢。对不起,我不知道这是否是正确的解决方案,因为在我得到你的答案之前我继续前进。 –

+0

您可以随时展示您的欣赏并将其颠覆。无需接受无法验证的内容。 –

+0

@JamesMcCabe你说你搬了...因为你找到了解决方案? – blo0p3r