2017-06-21 72 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 

在结果,主人将只如果没有可用从属

使用