目录

1.MyCAT2简介

1.1 什么是MyCAT

1.2 为什么使用MyCAT

1.3 MyCAT解决问题的思路

1.3.1 容量

1.3.2 查询速度

1.3.3 写入问题

1.4 数据库中间件对比

1.5 MyCAT和MySQL的区别

1.6 Mycat1.x 与 Mycat2 功能对比

1.7 支持的数据库

1.8 架构

MyCAT功能:

2.MyCAT2名词解释

2.1 分库分表

2.2 逻辑库

2.3 逻辑表

2.4 物理库

2.5 物理表

2.6 拆分键

2.7 分区键

2.8 物理分表

2.9 物理分库

2.10 分库

2.11 分片表、水平分片表

2.12 全局表(广播表)

2.13 集群

2.14 数据源

2.15 schema(库)

3.安装启动

3.1 安装

3.2 启动mycat

4.MyCAT2配置文件介绍

4.1 用户(user)

4.2 数据源(datasource)

4.3 逻辑库与逻辑表(logicaltable)

4.4 序列号(sequence)

4.5 服务器(server)

5.MyCAT2注释配置

5.1 重置配置

5.2 用户相关

5.2.1 创建用户

5.2.2 删除用户

5.2.3 显示用户

5.3 数据源相关

5.3.1 建数据源

5.3.2 删除数据源

5.3.3 显示数据源

5.4 集群相关

5.4.1 创建集群

5.4.2 删除集群

5.4.3 显示集群

6.MySQL主从搭建

7.MyCAT2的主从配置

8.验证读写分离


1.MyCAT2简介

1.1 什么是MyCAT

        MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用MySQL客户端工具和命令行访问,其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

        MyCAT发展到目前,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储。未来,它还会支持更多类型的存储。

        不过,无论是哪种存储方式,在最终用户看,MyCAT里都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

更多解释见官网: | MYCAT官方网站—中国开源分布式数据库中间件

项目地址:源码地址

GitHub - MyCATApache/Mycat2: MySQL Proxy using Java NIO based on Sharding SQL,Calcite ,simple and fast

Mycat2: Mycat2是Mycat社区开发的一款分布式关系型数据库(中间件)。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力

1.2 为什么使用MyCAT

随着互联网的发展,数据的量级也是呈指数的增长,从GB到TB到PB,操作数据也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。

而NoSQL的出现暂时解决了这一危机。

NoSQL通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来提升性能。 但是,NoSQL存在无法满足某些使用场景的情况,比如,有些使用场景绝对要有事务与安全指标。这时NoSQL肯定无法满足。

所以,我们还是需要使用关系型数据库。

        那么,如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对该问题,MyCAT 就出现了。

我们来总结一下MyCAT的作用:

1)能满足数据库数据大量存储;

2)提高了查询性能;

3)实现读写分离,分库分表。

同时,MyCAT还可以解决如下问题。

1)解决表的容量问题:MySQL的表最大存储多少数据?500W条。

2)解决表查询的性能问题?我的表里面的数据非常多,导致我查询很慢?

3)解决表的DML的性能问题?

4)解决MySQL挂了的问题。

那么,MyCAT是怎么解决上述问题的呢?我们接着往下看。

1.3 MyCAT解决问题的思路

1.3.1 容量

1.3.2 查询速度

最快也是Log(n),你加什么索引都不行。

1.3.3 写入问题

1.4 数据库中间件对比

  1. Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema,集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。

  2. Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。

  3. OneProxy基于MySQL官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件。舍弃了一些功能,专注在性能和稳定性上。

  4. kingshard由小团队用go语言开发,还需要发展,需要不断完善。

  5. Vitess是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。

  6. Atlas是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。

  7. MaxScale是mariadb(MySQL原作者维护的一个版本) 研发的中间件

  8. MySQLRoute是MySQL官方Oracle公司发布的中间件

1.5 MyCAT和MySQL的区别

我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?

        假设一个项目只需要一个人完成时,我们不需要Leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,这个管理者对于他的上层来说就是对项目组的抽象。

        同样的,当我们的应用只需要一台数据库服务器时,我们并不需要MyCAT,如果你需要分库甚至分表,这时候应用要面对很多个数据库时,这时,就需要对数据库层做一个抽象,来管理这些数据库,最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是MyCAT的核心作用。

所以你可以这样理解:数据库是对底层存储文件的抽象,而MyCAT是对数据库的抽象。

1.6 Mycat1.x 与 Mycat2 功能对比

1、1.x与2.0功能对比图

功能1.62
多语句不支持支持
blob值支持一部分支持
全局二级索引不支持支持
任意跨库join(包含复杂查询)catlet支持支持
分片表与分片表JOIN查询ER表支持支持
关联子查询不支持支持一部分
分库同时分表不支持支持
存储过程支持固定形式的支持更多
支持逻辑视图不支持支持
支持物理视图支持支持
批量插入不支持支持
执行计划管理不支持支持
路由注释支持支持
集群功能支持支持更多集群类型
自动hash分片算法不支持支持
支持第三方监控支持mycat-web支持普罗米斯,kafka日志等监控
流式合拼结果集支持支持
范围查询支持支持
单表映射物理表不支持支持
XA事务弱XA支持,事务自动恢复
支持MySQL8需要更改mysql8的服务器配置支持支持
虚拟表不支持支持
joinClustering不支持支持
union all语法不支持支持
BKAJoin不支持支持
优化器注释不支持支持
ER表支持支持
全局序列号支持支持
保存点不支持支持
离线迁移支持支持(实验)
增量迁移CRC32算法支持BINLOG追平(实验)
安全停机不支持支持(实验)
HAProxy协议不支持支持
会话粘滞update后select会粘滞update后select会粘滞且支持设置时间
全局表插入支持全局序列号不支持支持
全局表插入支持主表插入自增结果作为序列号不支持支持
外部调用的分片算法不支持但可定制支持
  1. 多语句:解析器会对SQL进行拆分依次执行(默认配置)
  2. blob值:BLOB (binary large object)二进制大对象,是一个可以存储二进制文件的容器。
  3. 全局二级索引:使用全局二级索引后,能有效减少全表扫描,对于减少连接使用,减少计算节点与存储节点的数据传输有帮助.
  4. 关联子查询:支持不能消除关联的关联子查询
  5. 分库同时分表:把分库分表合一,统一规划
  6. 存储过程:存储过程支持多结果集返回、支持接收affectRow
  7. 支持批量插入:支持rewriteInsertBatchedStatementBatch参数,用于提高批量插入性能(只有把rewriteBatchedStatements参数置为true, MySQL驱动才会帮你批量执行SQL)
  8. 支持执行计划管理:Mycat2的执行计划管理主要作用是管理执行计划,加快SQL到执行计划的转换,并且提供一个方式可以从持久层读取自定义的执行计划。
  9. 自动hash分片算法:由1.6版本的手动配置算法,到2.0的自动hash分片
  10. 单表映射物理表:使用自动化建表语句创建测试的物理库物理表,它会自动生成配置文件,然后通过查看本地的配置文件,观察它的属性

2、映射模型区别

1.7 支持的数据库

MyCAT 支持的数据库比较多,主要有:MySQL,SQL Server,MongoDB等。

1.8 架构

        前端用户可以把MyCAT看作是一个数据库代理,用MySQL客户端工具(如Navicat)和命令访问,而后端支持MySQL、SQL Server、Oracle等主流数据库,用MySQL Native 协议和多个MySQL服务器通信,也可用JDBC协议与大多数主流数据库服务器通信,其核心功能就是分库分表,即将一个大表水平分割为N个小表,真正的存储在后端MySQL服务器中或其他数据库中(这一点我们在“1.1 什么是 MyCAT”中已经讲过了)。

MyCAT功能:

1、读写分离

2、数据分片

  • 垂直拆分(分库)
  • 水平拆分(分表)
  • 垂直+水平拆分(分库分表)

3、多数据源整合

MyCAT原理:

        可以用“拦截”一词形容,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析,如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当处理,最终返回给用户。

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用Mycat还是MySQL。

2.MyCAT2名词解释

2.1 分库分表

按照一定规则把数据库中的表拆分为多个带有数据库实例、物理库、物理表访问路径的分表(重点)

2.2 逻辑库

数据库代理中的数据库,它可以包含多个逻辑表(重点)

2.3 逻辑表

数据库代理中的表,它可以映射代理连接的数据库中的表(物理表)(重点)

2.4 物理库

数据库代理连接的数据库中的库,比如MySQL上的information_schema(重点)

2.5 物理表

数据库代理连接的数据库中的表,比如MySQL上的information_schema.TABLES(重点)

2.6 拆分键

即分片键,描述拆分逻辑表的数据规则的字段(重点)

2.7 分区键

当使用等值查询的时候,能直接映射一个分区的拆分键(重点)

2.8 物理分表

指已经进行数据拆分的,在数据库上面的物理表,是分片表的一个分区。

2.9 物理分库

一般指包含多个物理分表的库。

2.10 分库

一般指通过多个数据库拆分分片表,每个数据库一个物理分表,物理分库名字相同。

2.11 分片表、水平分片表

按照一定规则把数据拆分成多个分区的表,在分库分表语境下,它属于逻辑表的一种。

2.12 全局表(广播表)

每个数据库实例都冗余全量数据的逻辑表(重点)。

        它通过表数据冗余,使分片表的分区与该表的数据在同一个数据库实例里,达到JOIN运算能够直接在该数据库实例里执行。它的数据一致一般是通过数据库代理分发SQL实现,也有基于集群日志的实现。

2.13 集群

多个数据节点组成的逻辑节点,在MyCAT2里,它是把对多个数据源地址视为一个数据源地址(名称),并提供自动故障恢复、转移、即实现高可用、负载均衡的组件。

2.14 数据源

连接后端数据库的组件,它是数据库代理中连接后端数据库的客户端。

2.15 schema(库)

在MyCAT2中配置表逻辑,视图等的配置。

3.安装启动

3.1 安装

前提:

使用MyCAT 2要安装jdk,MyCAT 2基于JDK 1.8开发。

安装jdk 1.8
[root@proxy ~]# yum localinstall jdk-8u261-linux-x64.rpm -y
[root@proxy ~]# java -version
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

1、下载安装包 下载对应的tar安装包,以及对应的jar包

资源地址:http://dl.mycat.org.cn/2.0/

安装程序包: http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip

Jar包:http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar

# 下载软件包
[root@proxy ~]# wget -c http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
[root@proxy ~]# wget -c http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar

2、解压

把所需的jar复制到mycat/lib目录

1、解压安装包
[root@proxy ~]# yum install unzip -y
[root@proxy ~]# unzip mycat2-install-template-1.21.zip -d /usr/local/

2、复制jar到mycat/lib目录
[root@proxy ~]# cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/

3、修改文件夹及以下文件的权限

把bin目录的文件加执行权限
[root@proxy ~]# cd /usr/local/mycat/bin/
[root@proxy bin]# chmod +x *

4、mycat目录结构

[root@proxy ~]# ll /usr/local/mycat/
total 8
drwxr-xr-x 2 root root 4096 Mar  5  2021 bin		# 执行命令的目录
drwxr-xr-x 9 root root  275 Mar  5  2021 conf		# 配置文件目录
drwxr-xr-x 2 root root 4096 Jan  6 10:08 lib		# 依赖包
drwxr-xr-x 2 root root    6 Mar  5  2021 logs		# 日志包

5、启动一个MySQL

因为mycat代理启动时需要一个默认的数据源,所以我们在启动时为其准备一个数据源。

1、安装mysql
[root@proxy ~]# yum install mysql-server -y

2、启动mysql
# systemctl enable --now mysqld

3、修改root密码
# mysqladmin -uroot password '123456'

4、添加mycat用户
# 注意:MySQL 8.0 主从同步mycat 连接账号设置
# 本文使用mycat用户连接
master上创建用户:
CREATE USER 'mycat'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
--必须要赋的权限mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'mycat'@'%';
---视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;

6、配置物理库地址

启动之前配置物理库地址。这里使用默认值。

[root@proxy ~]# vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"mycat",
        "weight":0
}

3.2 启动mycat

  • cd mycat/bin
  • ./mycat start
  • ./mycat status
  • ./mycat start 启动
  • ./mycat stop 停止
  • ./mycat console 前台运行
  • ./mycat install 添加到系统自动启动(暂未实现)
  • ./mycat remove 取消随系统自动启动(暂未实现)
  • ./mycat restart 重启服务
  • ./mycat pause 暂停
  • ./mycat status 查看启动状态…

[root@proxy ~]# cd /usr/local/mycat/bin/
[root@proxy bin]# ./mycat start
Starting mycat2...
[root@proxy bin]# ./mycat status
mycat2 is running (3934).

登录Mycat

管理端口9066
1、登录数据端口
数据端口8066
[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.1.51
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.33-mycat-2.0 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| `Database`         |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.31 sec)

MySQL [(none)]> \q
Bye

4.MyCAT2配置文件介绍

4.1 用户(user)

配置文件位置mycat/conf/user/{用户名}.user.json。

这个配置文件主要是用来配置MyCAT的登录用户的,也就是我们连接8066这个端口的用户信息。

# cat /usr/local/mycat/conf/users/root.user.json 
{
	"dialect":"mysql",
	"ip":null,
	"password":"123456",
	"transactionType":"proxy",
	"username":"root"
}

配置说明

1)dialect:数据库(方言)类型

2)ip:配置白名单使用,一般写null 如果要限制这个用户

3)password:配置MyCAT用户的密码(明文)

4)isolation:设置初始化的事务隔离级别

  • READ_UNCOMMITTED:1
  • READ_COMMITTED:2
  • REPEATED_READ:3,默认
  • SERIALIZABLE:4

5)transactionType默认值:proxy(本地事务,在涉及大于1个数据库的事务,commit阶段失败会导致不一致,但是兼容性最好)可选值:xa(事务,需要确认存储节点集群类型是否支持XA)

4.2 数据源(datasource)

作用:配置MyCAT连接后端的物理库的数据源。

配置文位置:mycat/conf/datasources/{数据源名字}.datasource.json

# cat /data/mycat/conf/datasources/prototypeDs.datasource.json 
{
	"dbType":"mysql",
	"idleTimeout":60000,
	"initSqls":[],
	"initSqlsGetConnection":true,
	"instanceType":"READ_WRITE",
	"maxCon":1000,
	"maxConnectTimeout":3000,
	"maxRetryCount":5,
	"minCon":1,
	"name":"prototypeDs",
	"password":"123456",
	"type":"JDBC",
	"url":"jdbc:mysql://localhost:3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
	"user":"root",
	"weight":0
}

配置说明:

1)dbType:数据源类型

2)name:数据源名字

3)password:后端MySQL的密码

4)url:后端MySQL的JDBC连接地址

5)user:后端MySQL的用户名

6)weight:配置数据源负载均衡的使用权重

4.3 逻辑库与逻辑表(logicaltable)

作用:配置MyCAT里面和MySQL对应的逻辑表。

配置位置:mycat/conf/schemas/{库名}.schema.json

{	
	"customTables": {},	
	"globalTables": {},	
	"normalTables": {},	
	"schemaName": "test",	
	"shardingTables": {},	
	"targetName": "prototype"
}

配置说明 :

1)customTables:自定义表

2)globalTables:全局表

3)normalTables:默认表

4)schemaName:库名

5)shardingTables:分片表

6)targetName:数据源名,也可以是集群名

4.4 序列号(sequence)

作用:使用序列号的分片表,对应的自增主键要在建表SQL中体现。

配置位置: mycat/conf/sequences/{数据库名字}_{表名字}.sequence.json(后面细说)。

4.5 服务器(server)

这个是针对MyCAT的服务器的配置,一般情况下默认就行了,不用怎么配置。

5.MyCAT2注释配置

5.1 重置配置

/*+ mycat:resetConfig{} */

5.2 用户相关

5.2.1 创建用户

/*+ mycat:createUser{ 
  "username":"user", 
  "password":"", 
  "ip":"127.0.0.1", 
  "transactionType":"xa"} 
*/

5.2.2 删除用户

/*+ mycat:dropUser{ "username":"user"} */

5.2.3 显示用户

/*+ mycat:showUsers */

5.3 数据源相关

5.3.1 建数据源

/*+ mycat:createDataSource{ 
  "dbType":"mysql", 
  "idleTimeout":60000, 
  "initSqls":[], 
  "initSqlsGetConnection":true, 
  "instanceType":"READ_WRITE", 
  "maxCon":1000, 
  "maxConnectTimeout":3000, 
  "maxRetryCount":5, 
  "minCon":1, 
  "name":"dc1",
  "password":"123456",
  "type":"JDBC",
  "url":"jdbc:mysql://127.0.0.1:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
  "user":"root",
  "weight":0} 
*/;

5.3.2 删除数据源

/*+ mycat:dropDataSource{
  "dbType":"mysql", 
  "idleTimeout":60000, 
  "initSqls":[], 
  "initSqlsGetConnection":true, 
  "instanceType":"READ_WRITE", 
  "maxCon":1000, 
  "maxConnectTimeout":3000, 
  "maxRetryCount":5, 
  "minCon":1, 
  "name":"dc1",
  "type":"JDBC", 
  "weight":0} 
*/;

5.3.3 显示数据源

/*+ mycat:showDataSources{} */

5.4 集群相关

5.4.1 创建集群

先创建两个数据源dc1和dc2,然后创建集群,dc1是主节点

/*! mycat:createCluster{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetry":3,
		"minSwitchTimeInterval":300,
		"slaveThreshold":0
	},
	"masters":[
		"dc1" //主节点
	],
	"maxCon":200,
	"name":"c0",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"dc2" //从节点
	],
	"switchType":"SWITCH"
} */

5.4.2 删除集群

/*! mycat:dropCluster{ "name":"c0"} */;

5.4.3 显示集群

/*+ mycat:showClusters{} */

6.MySQL主从搭建

配置过程略

7.MyCAT2的主从配置

前提,先搭建好MySQL的主从配置,登录MyCAT 2在MyCAT2里面操作,也就是连接8066这个端口

登录Mycat,创建逻辑库,配置数据源

[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.150.24
#在Mycat里创建数据库mydb1
#创建db2逻辑库
create database mydb1;

#修改mydb1.schema.json 指定数据源 "targetName": "prototype",配置主机数据源
[root@proxy ~]# vim /usr/local/mycat/conf/schemas/mydb1.schema.json 
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"mydb1",
        "targetName":"prototype",
        "shardingTables":{},
        "views":{}
}

使用注解方式添加数据源

#登录Mycat,注解方式添加数据源,指向从机
/*+ mycat:createDataSource{
"name":"rwSepw",
"url":"jdbc:mysql://172.16.100.21:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat",
"password":"123456"
} */

/*+ mycat:createDataSource{
"name":"rwSepr1",
"url":"jdbc:mysql://172.16.100.22:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat",
"password":"123456"
} */

/*+ mycat:createDataSource{
"name":"rwSepr2",
"url":"jdbc:mysql://172.16.100.23:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat",
"password":"123456"
} */

#查询配置数据源结果
/*+ mycat:showDataSources{} */;

更新集群信息,添加dr0从节点.实现读写分离

#更新集群信息,添加dr0从节点.
/*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr1","rwSepr2"]} */;
#查看配置集群信息
/*+ mycat:showClusters{} */;
#查看集群配置文件
[root@proxy ~]# cat /usr/local/mycat/conf/clusters/prototype.cluster.json
{
        "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":[
                "rwSepr1",
                "rwSepr2"
        ],
        "switchType":"SWITCH"
}

readBalanceType
查询负载均衡策略
可选值:
BALANCE_ALL(默认值)
获取集群中所有数据源
BALANCE_ALL_READ
获取集群中允许读的数据源
BALANCE_READ_WRITE
获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE
获取集群中允许写数据源,即主节点中选择
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换

8.验证读写分离

1、重新启动Mycat

[root@proxy ~]# cd /usr/local/mycat/bin/
[root@proxy bin]# ./mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...
[root@proxy bin]# ./mycat status
mycat2 is running (15547).

2、验证读写分离

1)在MyCAT创建db1库:

[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.150.24

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

2)在MyCAT创建表:

use db1
create table sys_user(
    id bigint primary key,
    username varchar(200) not null,
    address  varchar(500)
);

3)刷新逻辑表到物理库

/*+ mycat:repairPhysicalTable{} */;

刷新完成之后我们可以在后台的MySQL里面看到数据表已创建完成。

4)在MyCAT里面添加数据:

insert INTO sys_user(id,username,address) values(1,"xiaofang","wuhan");

完成之后刷新后端MySQL物理库,我们发现有数据了。

5)在MyCAT里查询测试:

修改上面3个MySQL数据库中db1库中sys_user表里面的数据,让它不一样,再在MyCAT里面执行查询结果如下

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| master     |
+------------+
1 row in set (0.00 sec)

mysql> update db1.sys_user
    -> set address="wuhan_master";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| slave1     |
+------------+
1 row in set (0.00 sec)

mysql> update db1.sys_user
    ->  set address="wuhan_slave1";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| slave2     |
+------------+
1 row in set (0.00 sec)

mysql> update db1.sys_user
    -> set address="wuhan_slave2";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后在mycat中查询

[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.150.24 -e "select * from db1.sys_user"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+--------------+
| id | username | address      |
+----+----------+--------------+
|  1 | xiaofang | wuhan_slave1 |
+----+----------+--------------+
[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.150.24 -e "select * from db1.sys_user"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+--------------+
| id | username | address      |
+----+----------+--------------+
|  1 | xiaofang | wuhan_slave2 |
+----+----------+--------------+
[root@proxy ~]# mysql -uroot -p123456 -P8066 -h192.168.150.24 -e "select * from db1.sys_user"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+--------------+
| id | username | address      |
+----+----------+--------------+
|  1 | xiaofang | wuhan_master |
+----+----------+--------------+

更多推荐