一主一从读写分离
# 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,随机显示。
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02