我有一個運行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,但似乎沒有透露更多信息。
我也有類似的問題。你在下面提到你「繼續前進」......你能告訴我你做了什麼來解決這個問題嗎? – luksch