我有一个运行针对MySQL的查询的webapp(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设置为高值和低值,并且统计数据中始终发生的事情是最大会话数上升到不超过7左右。我的JDBC池大小也很高。
通常可以一起使用JDBC池和HAProxy池吗?人们之前遇到过这种问题吗?
我知道如何解决这个问题,即在每次查询之前发送“验证查询”。但是那里有一定的开销,我仍然想知道为什么我的webapp在直接进入MySQL时会成功,但在通过HAProxy时会失去联系。
如何进一步调试并获取更多信息而不仅仅是“cD”?我尝试在调试模式下运行HAProxy,但它似乎没有透露任何内容。
答案 0 :(得分:0)
试试这个:
tune.bufsize 20480
tune.maxrewrite 2048
请参阅the ha-docs了解其含义。当你进入潜在致命障碍的灰色区域时,你必须全神贯注地做到这一点。但值得一试,看看这是否有效。我刚刚解决了一个与此文档无关的问题。
默认值为16k vs 1k。