一主一从读写分离
# 60.一主一从读写分离
上一篇博客我们搭建了主从复制,下一步我们就使用MyCat配置读写分离。
# 创建逻辑库
登录MyCat,然后创建数据库:
create database mydb1;
逻辑库名字和物理库名字可以不一样,这里为了方便就同名了
# 配置逻辑库
退出MyCat,查看配置文件:
ll /usr/local/mycat/conf/schemas/
总用量 12
-rw-r--r--. 1 root root 144 6月 19 22:48 mydb1.schema.json
-rw-r--r--. 1 root root 5299 6月 14 20:55 mysql.schema.json
2
3
4
可以看到多了一个mydb1.schema.json文件,内容如下:
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"mydb1",
"shardingTables":{},
"views":{}
}
2
3
4
5
6
7
8
9
我们指定一个数据源(增加第7行):
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"mydb1",
"targetName": "prototype",
"shardingTables":{},
"views":{}
}
2
3
4
5
6
7
8
9
10
# 配置数据源
我们可以自己写配置文件,也可以通过命令的方式来创建配置文件。
我们可以登录MyCat,然后运行如下语句(也可以使用Navicat连接MyCat):
/*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.56.101:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"Mycat0520@" } */;
/*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.56.103:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"Mycat0520@" } */;
2
3
以上两条语句创建了两个数据源,我们取名为rwSepw(最后一个字母w指write),rwSepr(最后一个字母r指read),然后指定数据源信息
如果添加错了数据源,怎么修改?也是通过命令:
/*+ mycat:setSequence{"name":"rwSepw","user":"root123"} */;
也可以删除后再新增:
/*+ mycat:dropDataSource{"name":"rwSepw" }*/;
查看数据源配置结果:
/*+ mycat:showDataSources{} */;
部分显示内容如下,可以看到确实新增了2个数据源:
NAME | USERNAME | PASSWORD | MAX_CON | MIN_CON |
---|---|---|---|---|
rwSepr | root | Mycat0520@ | 1000 | 1 |
rwSepw | root | Mycat0520@ | 1000 | 1 |
prototypeDs | learnMycatUser | Mycat0520@ | 1000 | 1 |
相应的配置文件也有生成:
ll /usr/local/mycat/conf/datasources
总用量 12
-rw-r--r--. 1 root root 436 6月 19 21:17 prototypeDs.datasource.json
-rw-r--r--. 1 root root 575 6月 20 07:32 rwSepr.datasource.json
-rw-r--r--. 1 root root 575 6月 20 07:24 rwSepw.datasource.json
2
3
4
5
# 配置集群
刚刚我们配置逻辑库的时候,指定的数据源名称是prototype,这可以是某一个数据源的名称,也可以是一个集群的名称。
接下来,我们就创建一个集群,并将刚刚新建的两个数据源添加到集群中,然后做好读写分离的配置:
/*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
查看集群信息:
/*+ mycat:showClusters{} */;
部分查询结果:
NAME | SWITCH_TYPE | MAX_REQUEST_COUNT | TYPE | WRITE_DS | READ_DS |
---|---|---|---|---|---|
prototype | SWITCH | 2000 | BALANCE_ALL | rwSepw | rwSepw,rwSepr |
可以看到写的数据源(WRITE_DS)是rwSepw,读的数据源(READ_DS)则有2个rwSepw,rwSepr,这是因为master也可以用来读。
相应的配置文件也有生成:
ll /usr/local/mycat/conf/clusters
总用量 4
-rw-r--r--. 1 root root 325 6月 20 07:32 prototype.cluster.json
2
3
文件内容如下:
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,
"minSwitchTimeInterval":300,
"showLog":false,
"slaveThreshold":0.0
},
"masters":[
"rwSepw"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"rwSepr"
],
"switchType":"SWITCH"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
字段说明:
readBalanceType,查询负载均衡策略,可选值:
- BALANCE_ALL(默认值):获取集群中所有数据源,也就是所有数据源都负责读请求
- BALANCE_ALL_READ:获取集群中允许读的数据源
- BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先
- BALANCE_NONE:获取集群中允许写的数据源,即主节点中选择一个
switchType:SWITCH进行主从切换,NOT_SWITCH不进行主从切换
# 重启MyCat
cd /usr/local/mycat/bin
./mycat restart
2
# 验证读写分离效果
我们可以通过查询日志,判断数据到底是从哪个数据库中查询出来的;
但有个更简单的方法,在master数据库表mytbl
中插入带系统变量数据,造成主从数据不一致:
INSERT INTO mytbl VALUES(2, @@hostname);
hostname是Linux主机的名字,读者可以通过在Linux中输入hostname来查看主机名称,也可通过hostname newName来临时修改主机名字。
在master 192.168.56.101中,hostname是node1:
SELECT * from mytbl
查询结果:
id | NAME |
---|---|
1 | zhang3 |
2 | node1 |
在从机 192.168.56.103中,hostname是node2,查询结果:
id | NAME |
---|---|
1 | zhang3 |
2 | node2 |
然后我们去MyCat中查询:
SELECT * from mytbl
查询多几次,可以看到显示的结果有node1,也有node2,随机显示。