在真实的业务中,一般对于数据库的架构演进都是:
单机->主从读写分离->分库分表
所以这票文章我们介绍下使用mysql进行数据库的读写分离。这里为了不修改代码,我们还是采用Mycat2作为数据库中间件,通过在Mycat2里面进行配置,实现数据的读写分离。下面开始演示下:
一、准备一个mysql主从环境
既然是mysql读写分离,因此我们需要一个mysql的主从集群,搭建mysql的主从集群,可以参考这篇文章《如何使用docker搭建一个mysql5.7的主从环境》。在本文的演示环境,我们准备的是1主2从的环境。
二、准备一个mycat
既然是使用mycat作为数据库中间件,因此我们在这里,需要准备一个mycat,详细的mycat安装教程见这篇文章《Mycat数据库中间件系列(一)Mycat2的安装教程》。
备注:
1、这里在搭建mycat的时候,我们在${mycat_home}/conf/datasources目录下的prototypeDs.datasource.json文件里面配置的数据库是上面1准备的数据库的master节点,例如:
三、开始配置mycat
3.1、使用navicat连接上mycat
连接的时候注意下,连接mycat,不是连接数据库,所以对应的地址、端口、用户名、密码都需要填写mycat的。连接后如下图:
3.2、添加从库数据源
这里我们添加一个从库的数据源,配置读写分离,添加从库的时候我们直接使用mycat的注解语法进行添加即可,如下:
/*+ mycat:createDataSource{ "name":"dr0", "url":"jdbc:mysql://192.168.31.10:33308/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123456" } */;
可以看到在navicat上执行成功了。
再执行下查看数据源的注解:
/*+ mycat:showDataSources{} */;
可以看到dr0这个从数据源加载进来了,此时两个数据源都是read_write的。
我们需要更新下配置,把dr0数据源配置为从节点,执行如下的注解
/*! mycat:createCluster{"name":"prototype","masters":["prototypeDs"],"replicas":["dr0"]} */;
再看看集群情况的情况
/*+ mycat:showClusters{} */;
此时我们就配置好主从数据了。
3.3、创建一个新的mysql表
在navicat的school里面创建一个新的表,例如school_branch表,语句如下:
CREATE TABLE IF NOT EXISTS `school`.`school_branch` ( `id` int(11) NOT NULL AUTO_INCREMENT, `school_name` varchar(255) NULL COMMENT '学校名称', `branch_name` varchar(255) NULL COMMENT '校区名称', PRIMARY KEY (`id`) );
然后再插入一条数据:
INSERT INTO `school`.`school_branch`(`id`, `school_name`, `branch_name`) VALUES (1, '北京一中', '海淀校区');
此时我们去mysql的master节点和slave节点看看这张表数据是否已经同步,没有任何问题
然后我们把slave1上的从节点branch_name修改为海淀校区1:
然后我们使用navicat在mycat的连接里面查询下school表
可以看到查询出来了数据。并且是从的数据,我们再执行一下查询:
可以看到查询结果不一样,这个主要是因为他这里的查会随机从主节点、从1节点,从2节点上查询。其他节点的数据我们没有修改过。所以会显示出来当前查询节点的数据。
备注:
1、这里的话mycat上如果创建的库名称和mysql上的库名称一样的话,则mycat不会在mysql节点创建当前的库,而是创建一个逻辑库指向。
2、mycat里面的库我们统称为逻辑库。
3、在查询的时候这里是随机从主节点或者从节点查询,因为这两个都有读权限。
/*+ mycat:showDataSources{} */;
写数据的话,则只会写到主节点上去。
4、上面我们使用注解的方式创建的从数据源,创建了之后,在mycat的安装包里面可以看到有从数据源的配置文件,文件位于:${mycat_home}/conf/datasources
在这个文件中如果我们需要把某个数据库设置为只能读或者只能写,只需要修改对应的instanceType字段即可。
如果直接修改配置文件的话,则需要重新启动mycat。
还没有评论,来说两句吧...