【问题标题】:Mysql Failover (Unable to write operations to new master)Mysql 故障转移(无法将操作写入新主服务器)
【发布时间】:2015-01-27 23:40:40
【问题描述】:

我有一个基于主从关系的主-主 mysql 设置,用于复制目的。我已经设法让复制部分正常工作,并且正在调查故障转移部分,根据手动干预,从属将成为主控(如果原来的主控发生故障)。

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

预期的结果应该是当我通过http://180.148.100.222:8080/index.html(客户端应用程序)启动一个新会话以启动一个写入操作时,它将重定向到 180.148.100.223(因为 180.148.100.222 在这种情况下会失败)并执行写操作成功。

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

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

【问题讨论】:

标签: mysql database replication database-replication failover


【解决方案1】:

通过设置参数failOverReadOnly=false 可以防止故障转移连接处于只读模式。也可以使用com.mysql.jdbc.ReplicationDriver 或通过设置jdbc:mysql:replication://<your url...> 之类的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&connectTimeout=50&failOverReadOnly=false&allowMasterDownConnections=true" />

更多参数见Properties for Connector/J

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


您真正需要的是一个没有负载平衡主节点的解决方案。这可以使用连接池来完成。我使用了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>

注意没有使用ReplicationDriverBasicDataSource 处理故障转移。

迈克尔

【讨论】:

    【解决方案2】:

    在 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

    迈克尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多