Mysql故障转移(无法将操作写入新主服务器)

时间:2012-02-16 10:48:35

标签: mysql database replication database-replication failover

我有一个基于主从关系的master-master mysql设置,用于复制目的。我已设法让复制部分工作,并正在调查故障转移部分,从而根据人工干预,奴隶将成为主人(如果原始主人失败)。

但是,我无法在“应用中继日志后”将“写入重定向到新主”。我试图通过连接器/ J这样做。应用程序代码中使用的连接字符串为String dbURL = "jdbc:mysql://180.148.100.222,180.148.100.223:3306/dbName";

预期结果应该是当我通过http://180.148.100.222:8080/index.html(客户端应用程序)启动新会话以启动WRITE操作时,它将重定向到180.148.100.223(因为180.148.100.222将在此实例中失败)并进行成功地完成了写操作。

但是,我无法达到结果。当我尝试启动此类订单时,客户端应用程序只会保持加载状态,直到它进入超时状态。

提前致谢 - 我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试在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>

在Windows上使用(protocol=tcp)(protocol=pipe)作为命名管道,对于TCP使用(path=path_to_pipe)作为命名管道(host=hostname)

确保使用的是MySQL Connector / J 5.1.27或更高版本,请参阅Support for Mulitple-Master。它应该在使用IPv6地址时起作用。它(应该)也适用于IPv4并将所有流量引导到第一个主服务器。当第一个主站关闭时,连接切换到第二个主站。但是,我注意到与第二个主服务器的故障转移连接突然是只读的。我试图找出原因......

作为替代方案,您还可以配置负载均衡连接,请参阅this link

迈克尔

答案 1 :(得分:0)

通过设置参数failOverReadOnly=false,可以防止故障转移连接处于只读模式。也可以使用com.mysql.jdbc.ReplicationDriver或告诉您的jdbc连接网址,通过设置网址jdbc:mysql:replication://<your 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" />

有关其他参数,请参阅Properties for Connector/J

配置使用负载平衡主机。如果第一个主设备发生故障,第二个主设备将处理所有流量,直到第一个主设备再次出现(反之亦然)。我不是数据库专家,但我不推荐这样的配置用于生产,因为我猜你的应用程序的事务不知道数据库的内部复制状态。


您实际需要的是没有负载均衡主人的解决方案。这可以使用连接池完成。我使用了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进行故障转移。

迈克尔