3.4 Mycat入门与配置
专栏目录
一、基础篇
1.1 MySQL概述
1.2 数据库相关概念
1.3 SQL通用语法及其分类
1.4 SQL-DDL、DML、DQL、DCL
1.5 函数及其分类
1.6 约束与外键的约束
1.7 多表关系与多表查询
1.8 事务及其隔离案例
二、进阶篇
2.1 MySQL体系结构与存储引擎
2.2 索引基础-索引概述
2.3 索引进阶-索引的使用
2.4 SQL优化
2.5 视图的概念与作用
2.6 存储过程及存储函数
2.7 触发器及其使用
2.8 锁的分类及其应用
2.9 Innodb引擎
2.10 MySQL管理
三、运维篇
3.1 日志的分类
3.2 主从复制概念及其搭建
3.3 分库分表概述
3.4 Mycat入门与配置
3.5 Mycat分片
3.6 Mycat管理与监控
3.7 读写分离分类与应用
目录
一、Mycat概述
二、安装
三、入门
四、分片测试
五、mycat配置
一、Mycat概述
Mycat是开源的、活跃的、基于Java语言编写的MysQL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。
优势:
- 性能可靠稳定
- 强大的技术团队
- 体系完善
- 社区活跃
结构:
注:Mycat不存储数据,只是逻辑上对数据分片处理
二、安装
Mycat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,下面介绍MyCat的Linux中的环境搭建。我们需要在准备好的服务器中安装如下软件。
- MySQL
- JDK
- Mycat
- 三台服务器
1.查看mysql状态
systemctl status mysql
2.服务器1上传jdk后解压
3.配置环境变量,后重新加载配置文件
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_171
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
4.检查jdk是否安装成功
java -version
5.返回根目录,上传mycat安装包后解压安装
tar -zxvf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz -C /usr/local/
6.进入mycat安装文件夹,检查是否安装成功
cd /usr/local
ls
cd mycat
ll
- bin:存放可执行文件,用于启动停止mycat
- conf:存放mycat的配置文件
- lib:存放mycat的项目依赖包(jar)
- logs:存放mycat的日志文件
7.进入mycat/lib包下替换mysql连接jar包并为其授权
rm -rf mysql-connector-java-5.1.35.jar
chmod 777 mysql-connector-java-8.0.22.jar
三、入门
由于tb_order表中数据量很大,磁盘lo及容量都到达了瓶颈,现在需要对tb_order表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上,具体的结构,参考下图:
1.检查三台服务器防火墙是否已经关闭
systemctl status firewalld
2.连接mysql创建名为db01的数据库
3.mycat分片配置(schema.xml)
cd /mycat/conf
4.配置mycat的用户及用户的权限信息(server.xml)
5.启动服务:Mycat启动之后,占用端口号8066。查看是否启动成功
cd /usr/local/mycat
bin/mycat start
bin/mycat stop
tail -f logs/wrapper.log
四、分片测试
1.连接mycat
mysql -h 192.168.121.128 -P 8066 -uroot -p123456
通过查看数据库,查看数据库表操作可以看到此时只存在一个数据库DB01,一个数据表tb_order。该表只在mycat中逻辑存在,在具体数据库中不存在。
2.在mycat中创建表
CREATE TABLE TB_ORDER(
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
3.在mycat中插入数据
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(1000000,'goods1000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');
select * from tb_order;
问:三条数据的存储结果存储在哪个节点中?
答:存储于192.168.121.128
问:为什么这三条数据没有平均分布,而是存储于192.168.121.128中?
答:存储分布取决于mycat配置中的rule属性(分片规则),此时的分片规则为auto-sharding-long,该规则引用的分片规则为/usr/local/mycat/conf/rule.xml,其根据id进行分片存储。
若插入的id超过对应的数据节点则出现报错,此时需要增加节点
五、mycat配置
- schema.xml
schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
主要包含以下三组标签:
- schema标签(逻辑库、逻辑表)
- datanode标签(数据节点)
- datahost标签(节点主机、数据源)
- schema标签
schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。
MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性:
- name:指定自定义的逻辑库库名(区分大小写)
- checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除
-
true自动去除(select * from DB01.TB_ORDER)
-
false不自动去除
-
- sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录
- table:定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。
- name:定义逻辑表表名,在该逻辑库下唯一
- dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应;多个dataNode逗号分隔
- rule:分片规则的名字,分片规则名字是在rule.xml中定义的
- primarykey:逻辑表对应真实表的主键
-
type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global
- dataNode标签
dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。
核心属性:
- name:定义数据节点名称
- dataHost:数据库实例主机名称,引用自dataHost标签中name属性
- database:定义分片所属数据库
- dataHost标签
该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
核心属性:
- name:唯一标识,供上层标签使用
- maxCon/mincon:最大连接数/最小连接数
- balance:负载均衡策略,取值0,1,2,3
- writeType:写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
- dbDriver:数据库驱动,支持native、jdbc
总结
schema.xml 就是 Mycat 的“全国分仓配置表”。
它告诉 Mycat:
1.哪些仓库存在(dataHost)
2.每个仓库里装的是什么(dataNode)
3.订单(table)该按什么规则分配(rule)
4.用户从总部(schema)统一访问整个系统。
- rule.xml
rule.xml中定义所有拆分表的规则,在使用过程中可以灵适的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:tableRule、Function。
- server.xml
server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。
user标签
表权限控制示例:
1.修改server.xml配置
2.重启mycat后连接数据库
cd /usr/local/mycat
bin/mycat stop
bin/mycat start
mysql -h 192.168.121.128 -P 8066 -uroot -p123456
use DB01;
insert into TB_ORDER (id,title) values(4,'4');
UPDATE TB_ORDER SET title = 'goods4' where id = 4;
delete from TB_ORDER where id = 4;
执行删除后出现报错“权限不足”
The statement DML privilege check is not passed, reject for user 'root'
本文地址:https://www.yitenyun.com/6970.html











