MyCat2 读写分离
已经搭配好的主从数据库分别为:主:192.168.200.51:3306 从:mysql://192.168.200.53:3306
1.读写分离实验方案说明:
读写分离的基本原理是MyCat2将Update、Delete、Insert这一类写数据的请求转发到MySQL集群中的主节点,然后将Select类的读数据的请求转发到MySQL集群中的相关节点,主要是从节点。
而MySQL的主节点与从节点之间,通常会使用MySQL的主从同步机制来进行数据同步,从而保证读请求能够读取到最新的数据结果。
在这个过程中,MySQL的主从同步其实是与MyCat2无关的,接下来的实验,我们会把重点放在MyCat2的读写分离功能上,而不要太注重主从之间的数据一致性。
2、MyCat2读写分离规则配置
在新版本MyCat2中配置读写分离规则,相比MyCat会简单很多。按照以下几个步骤配置即可:
step1 登录数据客户端,配置真实数据源
真实数据源也就是实际存储数据的数据源,例如之前在prototypeDs.datasource.json文件中配置的prototypeDs也是一个真实数据源
使用注解方式添加数据源
/*+ mycat:createDatasource{ "name":"rwSepw", "url":"jdbc:mysql://192.168.200.51:3306/mysql?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123"} */;
/*+ mycat:createDatasource{ "name":"rwSepr", "url":"jdbc:mysql://192.168.200.53:3306/mysql?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123"} */;
疑问待验证: 是mysql://192.168.200.53:3306/mysql还是mysql://192.168.200.53:3306/mydatabase
查询配置数据源结果
/*+ mycat:showDataSources{} */;
查看/usr/local/mycat/conf/datasources文件夹,生成了对应的2个json配置文件
step2、 配置集群信息,添加dr0从节点.实现读写分离
使用注解方式添加集群信息
/*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
1、这样就创建一个名为prototype的集群,rwSepw指定主库,rwSepr指定从库。其中,replicas从库可以配置多个,表示有多个从库。masters也可以配置多个,第一个表示主库,后面的表示备用库。
2、配置集群后,MyCat2会在conf/cluster目录下创建对应的集群配置文件,rwSepr.cluster.json。里面包含了关于这个集群的详细配置信息。另外,也可以看到,MyCat2默认情况下也提供了一个名为prototype的集群。
查看配置集群信息
/*+ mycat:showClusters{} */;
查看集群配置文件
cat /usr/local/mycat/conf/clusters/prototype.cluster.json
配置文件中几个重要的配置:
readBalanceType 查询负载均衡策略
可选值:
BALANCE_ALL(默认值) #获取集群中所有数据源
BALANCE_ALL_READ #获取集群中允许读的数据源
BALANCE_READ_WRITE #获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE #获取集群中允许写数据源,即主节点中选择
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换
step3、配置逻辑库
有了集群后,还需要在MyCat2中配置一个逻辑库,指向这个集群。这样,客户端就只需要操作这个逻辑库,由MyCat2去完成真实的读写分离逻辑。
-- 1、在mycat2的服务中声明一个逻辑库。
create database datacenter;
-- 2、在mycat2的部署目录下,找到生成的配置文件,conf/schema/datacenter.schema.json。在其中增加targetName:prototype属性。指向真实的集群。
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"wrdb",
"targetName":"prototype",
"shardingTables":{},
"views":{}
}
step4、重新启动 Mycat2,让配置文件生效
cd /usr/local/mycat/bin
./mycat restart
step5、验证读写分离
51数据库的datacenter有一张block表 数据如下
53数据库作为从数据库,数据当然一样
登录mycat2 数据客户端,多次查询这张表,结果都是一样,因为主从表数据一样,我们没有办法证明从从表读了数据
我们手动把53的block表中Id为001005的这条数据pid改为002
然后再次登录mycat2 数据客户端,查询这张表
第一,二次查询
第三次查询
这就证明了mycat2 数据客户端即从主表读数据,也从从表读数据,如果想要其他策略,可以更改集群的readBalanceType参数