当前位置: 代码迷 >> 综合 >> MySQL 5.8(8)+MGR+MySQL Connector/J(8.0.12)的故障转移(failover)实验
  详细解决方案

MySQL 5.8(8)+MGR+MySQL Connector/J(8.0.12)的故障转移(failover)实验

热度:17   发布时间:2023-11-22 16:55:59.0

MySQL官网

MySQL官网
MySQL Connector/J 相关教程

准备

这是官网第二章的一个版本的摘要,不想上官网看的同志们,可以在这里看。
这是官网第二章的一个摘要

JDBC的版本可以在jar包中的MANIFEST.MF中查看
查看版本

MGR的数据库集群可以参考网上的一些文章,东拼西凑的能看个大概。

过程

驱动版本

MySQL Connector/J 的版本选8.0.12可以用maven下得到,同时也会带下来protobuf-java:2.6.0
这里写图片描述
相关依赖可以参考官网上,有说。依赖(JAR包)下好后,可以使用新的驱动

Class.forName("com.mysql.cj.jdbc.Driver");

驱动相比以往有些变化,不过功能更多,很好用,其中就包括我们要测得failover功能。

多主机连接代码示例
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;
import java.sql.DriverManager;public class ReplicationDemo {public static void main(String[] args) throws Exception {Properties props = new Properties();// We want this for failover on the slavesprops.put("autoReconnect", "true");// We want to load balance between the slavesprops.put("roundRobinLoadBalance", "true");props.put("user", "foo");props.put("password", "password");//// Looks like a normal MySQL JDBC url, with a// comma-separated list of hosts, the first// being the 'master', the rest being any number// of slaves that the driver will load balance against//Connection conn =DriverManager.getConnection("jdbc:mysql:replication://master,slave1,slave2,slave3/test",props);//// Perform read/write work on the master// by setting the read-only flag to "false"//conn.setReadOnly(false);conn.setAutoCommit(false);conn.createStatement().executeUpdate("UPDATE some_table ....");conn.commit();//// Now, do a query from a slave, the driver automatically picks one// from the list//conn.setReadOnly(true);ResultSet rs =conn.createStatement().executeQuery("SELECT a,b FROM alt_table");.......}
}

这里我只放Connect/J 配置 主从复制的代码。

有话说
  • 根据官网所说Connect/J 可以根据url不同干三件事,分别是不带关键字的、关键字为loadbalance的和关键字为replication的,此外还有一只X协议的就先不说了。
  • 据官方文档说,最简单的不带关键字的多主机连接方式,本身是带有failover的功能的。同志们可以找到官网示例,运行下看看,结果确实能在master宕掉后,连下一台。loadbalance主要是用来做负载的,replication也可以failover。
  • 还有一些参数,这里我说两个比较重要,是我在调试示例的时候遇到的坑,failoverReadOnly,这个不是坑,这个参数用于连接slave机器的方式,表明是可读可写方式,默认是只读的。retriesAllDown就比较坑了,本意是全宕机后重连次数,默认是120,我在调试的时候发现Connect/J在连接数据库的时候是默认每次都当成失败一样去连,也就是说至少retriesAllDown=1,即至少重试1次才能连,因此retriesAllDown=0是永远不会成功的,捂脸哭。
    大家在调试源码的时候,会发现有个循环的代码片段写了尝试次数大于等于retriesAllDown之后跳出。
实验结果

在这里我要先说,实验结果,是失败哒~!!!哈哈哈,没想到吧,失败了!Connect/J 8.0.12的官方文档指导的实验失败了!看了前面一大篇之后,是不是觉得白看啦略略略
言归正传,根据官方文档说,用一般的url链接写法,本身就可以达到failover的效果,为什么不行呢?这是因为在这个实验中,mrg集群的mysql数据库,在master宕机后,内部会从slaves重新选举出一个新的master,这个newMaster并不能咱们程序所感知。这一块,通过查看failover的源码就可以知道。下面是三种方式建立connection的方式(也可能只是loadbalance和replication的)
loadbalance的连接建立
replication的master的连接建立
普通方式建立连接
从上图中可以看到不论哪种方式,都是用的循环咱们定义的url中的ip:port们,一个个的尝试建立连接。那么像replication这种建立master连接的方式是如何分辨主从的呢?
这里写图片描述
是的!你没看错!他就是取得第一个!URL中的第一个!

最后

虽然这次失败了,不过也不排除,我的某方面粗心大意,看的不全这种情况,如果过路的哪位仁兄,真的发现可以的话,还请务必告知在下,技术知识的交流。

大写的

谢谢!!!

  相关解决方案