Mysql ReplicationDriver - 失败处理

时间:2017-06-21 19:17:54

标签: java mysql tomcat8

我有一个谷歌似乎无法回答的MySql主/从复制问题。使用com.mysql.jdbc.ReplicationDriver时,驱动程序如何处理只读副本上的失败?它是否将它们列入黑名单,是否尝试继续尝试它们并且每次都抛出异常(在配置了任何超时之后)?从我的测试来看,似乎我的应用程序只是在我杀死一个只读副本时挂起。我正在使用tomcat,这是我的context.xml ....

<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分钟)而不是一遍又一遍地重试?

1 个答案:

答案 0 :(得分:2)

在这种情况下,MySQL驱动程序将 LoadBalanced驱动程序用于从属服务器,并且仅当从LoadBalanced从服务器集群中选择连接失败时才切换到主服务器。 应用程序挂起,因为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

结果,只有在没有可用的从属

时才会使用master