从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

    • Lucene

    • Elasticsearch

    • MQ

    • MyCat

      • MyCat2-尚硅谷
      • MyCat是什么,为什么要用
      • 搭建环境
      • MyCat概念
      • MyCat的配置文件
      • 一主一从复制
      • 一主一从读写分离
        • 创建逻辑库
        • 配置逻辑库
        • 配置数据源
        • 配置集群
        • 重启MyCat
        • 验证读写分离效果
      • 双主双从复制方案
      • 分库分表
      • MyCat安全设置
      • Mycat2-UI
      • MyCat
    • Lombok

    • 主流框架
  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • 主流框架
  • MyCat
2023-06-28
目录

一主一从读写分离

# 60.一主一从读写分离

上一篇博客我们搭建了主从复制,下一步我们就使用MyCat配置读写分离。   ‍

# 创建逻辑库

登录MyCat,然后创建数据库:

create database mydb1;
1

逻辑库名字和物理库名字可以不一样,这里为了方便就同名了

‍

# 配置逻辑库

退出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
1
2
3
4

‍

可以看到多了一个mydb1.schema.json文件,内容如下:

{
	"customTables":{},
	"globalTables":{},
	"normalProcedures":{},
	"normalTables":{},
	"schemaName":"mydb1",
	"shardingTables":{},
	"views":{}
}
1
2
3
4
5
6
7
8
9

‍

我们指定一个数据源(增加第7行):

{
	"customTables":{},
	"globalTables":{},
	"normalProcedures":{},
	"normalTables":{},
	"schemaName":"mydb1",
        "targetName": "prototype",
	"shardingTables":{},
	"views":{}
}
1
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@" } */;
1
2
3

以上两条语句创建了两个数据源,我们取名为rwSepw(最后一个字母w指write),rwSepr(最后一个字母r指read),然后指定数据源信息

‍

‍

如果添加错了数据源,怎么修改?也是通过命令:

/*+ mycat:setSequence{"name":"rwSepw","user":"root123"} */;
1

‍

也可以删除后再新增:

/*+ mycat:dropDataSource{"name":"rwSepw" }*/;
1

‍

‍

查看数据源配置结果:

/*+ mycat:showDataSources{} */;
1

‍

部分显示内容如下,可以看到确实新增了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
1
2
3
4
5

‍

# 配置集群

刚刚我们配置逻辑库的时候,指定的数据源名称是prototype,这可以是某一个数据源的名称,也可以是一个集群的名称。

接下来,我们就创建一个集群,并将刚刚新建的两个数据源添加到集群中,然后做好读写分离的配置:

/*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
1

‍

查看集群信息:

/*+ mycat:showClusters{} */;
1

‍

部分查询结果:

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
1
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"
}
1
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
1
2

‍

‍

‍

# 验证读写分离效果

我们可以通过查询日志,判断数据到底是从哪个数据库中查询出来的;

但有个更简单的方法,在master数据库表mytbl​中插入带系统变量数据,造成主从数据不一致:

INSERT INTO mytbl VALUES(2, @@hostname);
1

‍

hostname是Linux主机的名字,读者可以通过在Linux中输入hostname来查看主机名称,也可通过hostname newName来临时修改主机名字。

‍

在master 192.168.56.101中,hostname是node1:

SELECT * from mytbl
1

查询结果:

id NAME
1 zhang3
2 node1

‍

在从机 192.168.56.103中,hostname是node2,查询结果:

id NAME
1 zhang3
2 node2

‍

然后我们去MyCat中查询:

SELECT * from mytbl
1

查询多几次,可以看到显示的结果有node1,也有node2,随机显示。

在GitHub上编辑此页 (opens new window)
上次更新: 2023/6/28 11:11:51
一主一从复制
双主双从复制方案

← 一主一从复制 双主双从复制方案→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式