2017-06-21 103 views
0

我有一個MySql主/從複製問題,谷歌似乎無法回答。使用com.mysql.jdbc.ReplicationDriver時,驅動程序如何處理讀取副本上的故障?它是否將它們列入黑名單,它是否嘗試繼續嘗試並每次拋出異常(在配置了任何超時之後)?從我的測試中看來,當我殺死一個只讀副本時,我的應用程序正在掛起。我使用Tomcat和這裏是我的context.xml ....Mysql ReplicationDriver - 故障處理

<Resource auth="Container" 
     driverClassName="com.mysql.jdbc.ReplicationDriver" 
     defaultAutoCommit="false" 
     initialSize="10" 
     minIdle="5" 
     logAbandoned="false" 
     maxIdle="10" 
     maxWait="10000" 
     name="jdbc/db" 
     removeAbandoned="true" 
     testOnBorrow="true" 
     removeAbandonedTimeout="86400" 
     testWhileIdle="true" 
     type="javax.sql.DataSource" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     username="powerptc" 
     password="password" 
     url="jdbc:mysql:replication://localhost:3306,host1,host2:3306/db?allowSlavesDownConnections=true&amp;readFromMasterWhenNoSlaves=true" 
     validationQuery="/* ping */ SELECT 1" 
     validationQueryTimeout="5" /> 

有沒有辦法讓司機黑名單失敗讀副本(X分鐘),而不是隻重試一遍又一遍?

回答

2

在這種情況下,MySQL驅動程序對從服務器使用LoadBalanced驅動程序,並且僅在從服務器的LoadBalance羣集中選取連接失敗時切換到主服務器。 應用程序掛起因爲默認值爲retriesAllDown = 120。 如果你設置了retriesAllDown = 4,那麼Load Balancer將睡眠4次250毫秒切換到主設備之前。

默認loadBalanceBlacklistTimeout = 0,表示從站的負載均衡器不使用黑名單。即使你設置了loadBalanceBlacklistTimeout > 0,它也沒有幫助,因爲黑名單的奇怪實現,如果所有主機都添加到黑名單中,黑名單是空的。但是您可以使用下一個技巧:使用ServerAffinityStrategy並將主控主機名稱設置爲從屬列表,但只將從屬設置爲關聯服務器。

我的工作網址爲:

jdbc:mysql:replication://master:3306,slave1,slave2:3306/db?allowSlaveDownConnections=true&readFromMasterWhenNoSlaves=true&loadBalanceBlacklistTimeout=30000&retriesAllDown=4&loadBalanceStrategy=serverAffinity&serverAffinityOrder=slave1,slave2 

在結果,主人將只如果沒有可用從屬

使用