java - Mysql ReplicationDriver - 故障处理

标签 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 分钟)列入黑名单,而不是一遍又一遍地重试?

最佳答案

在这种情况下,MySQL 驱动程序使用 LoadBalanced 驱动程序作为从属设备,并且仅当从 LoadBalanced 从属设备集群中选择连接失败时才切换到主设备。 应用程序因 retriesAllDown = 120 的默认值而挂起。 如果您设置 retriesAllDown = 4,则负载均衡器将 sleep 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

结果,只有在没有可用的从属设备时才会使用主设备

关于java - Mysql ReplicationDriver - 故障处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684544/

相关文章:

mysql - 如何找到mysql varchar列的最大值

java.lang.IllegalArgumentException : Invalid character (CR or LF) found in method name

mysql - 如何隐藏sql中为空的和值?

php - 如何每23小时隐藏PHP页面中的Mysql记录?

azure - 如何使用 Jenkins 部署到安全(https)tomcat 服务器?

java - 在端口 80 上尝试 https 时 tomcat8 处于 100% cpu

java - 请提供当类和序列化对象具有相同的serialVersionUID时反序列化期间失败的场景/条件?

java - 为什么 PostgreSQL JDBC 驱动程序在身份验证期间向服务器发送错误的数据包 header ?

java - wicket 框架中请求对象的 session 处理

java - 阻止 java 使用某些库