Mysql故障切换(无法将操作写入新主机)

Mysql故障切换(无法将操作写入新主机),mysql,database,replication,database-replication,failover,Mysql,Database,Replication,Database Replication,Failover,我有一个基于主从关系的主-主mysql设置,用于复制目的。我已经设法使复制部分工作,并正在研究故障转移部分,根据该部分,一个从机将成为一个主机(如果原始主机发生故障),这是基于手动干预的 但是,我无法“在应用中继日志后将写入重定向到新主机”。我正试图通过连接器/J执行此操作。应用程序代码中使用的连接字符串是string dbURL=“jdbc:mysql://180.148.100.222,180.148.100.223:3306/dbName” 预期结果应该是,当我通过(客户端应用程序)启动新

我有一个基于主从关系的主-主mysql设置,用于复制目的。我已经设法使复制部分工作,并正在研究故障转移部分,根据该部分,一个从机将成为一个主机(如果原始主机发生故障),这是基于手动干预的

但是,我无法“在应用中继日志后将写入重定向到新主机”。我正试图通过连接器/J执行此操作。应用程序代码中使用的连接字符串是
string dbURL=“jdbc:mysql://180.148.100.222,180.148.100.223:3306/dbName”

预期结果应该是,当我通过(客户端应用程序)启动新会话以启动写入操作时,它将重定向到180.148.100.223(因为180.148.100.222在此实例中将失败),并成功执行写入操作

然而,我无法达到这个结果。当我尝试启动(如订单)时,客户端应用程序只是保持在加载状态,直到进入超时


提前感谢-任何帮助都将不胜感激。

在tcp连接的情况下,尝试像这样构建连接url:

jdbc:mysql://address=(protocol=tcp)(host=<IP address host 1>)(port=<your port>)(type=master),address=(protocol=tcp)(host=<IP address host 2>)(port=<your port>)(type=master)/<db_name>
jdbc:mysql://address=(协议=tcp)(主机=)(端口=)(类型=主机),地址=(协议=tcp)(主机=)(端口=)(类型=主机)/
对Windows上的命名管道使用
(协议=tcp)
,或
(协议=管道)
,对tcp上的命名管道使用
(路径=路径到管道)

确保您使用的是MySQL Connector/J 5.1.27或更高版本,请参阅。它应该在使用IPv6地址时工作。它还应该与IPv4一起工作,并将所有流量定向到第一个主节点。当第一台主机停机时,连接切换到第二台主机。但是,我注意到,到第二个主机的故障切换连接突然变成只读的。我想弄明白为什么

或者,您也可以配置loadbalanced连接,请参阅


Michael

通过设置参数
failOverReadOnly=false
可以防止故障切换连接处于只读模式。还可以使用
com.mysql.jdbc.ReplicationDriver
或通过设置类似于
jdbc:mysql:replication://
的url,让您的jdbc连接url在内部选择驱动程序

在具有两个mysql数据库实例(端口3306和3307)的测试环境中,我使用了以下jdbc连接url:

jdbc:mysql:replication://address=(type=master)(protocol=tcp)(host=localhost)(port=3306),address=(type=master)(protocol=tcp)(host=localhost)(port=3307)/test?autoReconnect=true&amp;connectTimeout=50&amp;failOverReadOnly=false&amp;allowMasterDownConnections=true" />
有关其他参数,请参见

配置使用负载平衡主机。如果第一个主服务器宕机,第二个主服务器将处理所有通信,直到第一个主服务器再次出现(反之亦然)。我不是数据库专家,但我不建议在生产中使用这种配置,因为我猜您的应用程序的事务不知道数据库的内部复制状态


您实际需要的是一个不带负载平衡主机的解决方案。这可以使用连接池来完成。我使用了org.apache.commons.dbcp2.BasicDataSource的内置功能,但它有一个缺点:池只创建一次,只有在第一个主池关闭之前才可用。第二个主控台上不会有游泳池。也许这个行为会受到用自己的逻辑扩展BasicDataSource的影响,我还没有完全测试它

我的建议是在完成维护后重新启动应用程序(这将创建一个新的连接池)。在维护期间,您的应用程序可能会因为基于请求创建连接而变慢,而不是从池中拉出来,但您不会有任何应用程序停机时间(…如果您的应用程序是群集的)

代码如下:

 <beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url"        
        value="jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(type=master),address=(protocol=tcp)(host=localhost)(port=3307)(type=master)/test?autoReconnect=true&amp;connectTimeout=5&amp;failOverReadOnly=false&amp;allowMasterDownConnections=true" />
    <beans:property name="username" value="myDBUser" />
    <beans:property name="password" value="myPassword" />
    <beans:property name="initialSize" value="10"/>
</beans:bean>

请注意,
ReplicationDriver
没有使用,
BasicDataSource
处理故障转移

迈克尔

我也有同样的问题: