2012-10-17 59 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