课程介绍
1. MyCat简介
1.1 MyCat 引入
如今随着互联网的发展,数据的量级也是成指数式的增长,从GB到TB到PB。对数据的各种操作也是愈
加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求,这个时候NoSQL的出现暂时
解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能
上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有
事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关
系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据
分散到不同的数据库中存储,为应对此问题就出现了——MyCat 。
MyCAT的目标是:
低成本
的将现有的单机数据库
和应用
平滑迁移到"云"端,解决海量数据存储和业
务规模迅速增长情况下的数据存储和访问的瓶颈问题 。
1.2 MyCat 历史
- Mycat 背后是阿里曾经开源的知名产品——
Cobar
。Cobar 的核心功能和优势是MySQL数据库
分片,
此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,
并维持到 2013 年年初,然后,就没有然后了。 Cobar 的思路和实现路径的确不错。基于 Java 开发
的,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,
目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,
因为生态环境在哪里摆着。 - Mycat 是基于 cobar 演变而来,相对于cobar来说 , 有两个显著优势 :
①. 对 cobar的代码进行了彻底的重构,Mycat在I/O方面进行了重大改进,将原来的BIO改成了NIO, 并发量有大幅提高 ;
②. 增加了对Order By、Group By、limit等聚合功能的支持,同时兼容绝大多数数据库成为通用的数据库中间件 。 - 简单的说,MyCAT就是:一个新颖的数据库中间件产品支持mysql集群,或者 mariadb
cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用 mycat 。对于开发人员来说
根本感觉不到mycat的存在
1.3 MyCat 优势
MyCat 是一个彻底开源的,面向企业应用数据库中间件 , 支持事务, 可以视为MySQL集群的企业级
数据库,用来替代昂贵的Oracle集群,在MyCat 中融合内存缓存技术、NoSQL技术、HDFS大数据的 新型SQL Server
,
并结合传统数据库和新型分布式数据仓库的新一代企业级数据库中间件产品 。
并具有优势:
1). 性能可靠稳定
基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用
案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源
项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开
源项目,甚至超越某些商业产品。
2). 强大的技术团队
MyCat 现在由一支强大的技术团队维护 , 吸引和聚集了一大批业内大数据和云计算方面的资深工程
师、架构师、DBA,优秀的团队保障了MyCat的稳定高效运行。而且MyCat不依托于任何商业公司,而
且得到大批开源爱好者的支持。
3). 体系完善
MyCat已经形成了一系列的周边产品,比较有名的是 Mycat-web、Mycat-NIO、Mycat-Balance
等,已经形成了一个比较完整的解决方案,而不仅仅是一个中间件。
4). 社区活跃
与MyCat数据库中间件类似的产品还有 TDDL、Amoeba、Cobar 。
①. TDDL(Taobao Distributed Data Layer)不同于其它几款产品,并非独立的中间件,只能
算作中间层,是以Jar包方式提供给应用调用 ,属于JDBC Shard的思想 。
②. Amoeba是作为一个真正的独立中间件提供服务,应用去连接Amoeba操作MySQL集群,就像操作单
个MySQL一样。Amoeba算中间件中的早期产品,后端还在使用JDBC Driver。
③. Cobar是在Amoeba基础上进化的版本,一个显著变化是把后端JDBC Driver改为原生的MySQL
通信协议层。
④. MyCat又是在Cobar基础上发展的版本, 性能优良, 功能强大, 社区活跃 。
1.4 MyCat 使用场合
要想用好MyCat,就需要了解其适用场景,以下几个场景适合适用MyCat。
1). 高可用性与MySQL读写分离
高可用
:利用MyCat可以轻松实现热备份,当一台服务器停机时,可以由集群中的另一台服务器自动接 管业务,
无需人工干预,从而保证高可用。读写分离
:通过MySQL数据库的binlog日志完成主从复制
,并可以通过MyCat轻松实现读写分离,
实现insert、update、delete走主库
,而在select时走从库
,从而缓解单台服务器的访问压力。
2). 业务数据分级存储保障
- 企业的数据量总是无休止的增长,这些数据的格式不一样,访问效率不一样,重要性也不一样。可以针
对不同级别的数据,采用不同的存储设备,通过分级存储管理软件实现数据客体在存储设备之间
自动迁移及自动访问切换。
3). 大表水平拆分,集群并行计算
- 数据切分是MyCat的核心功能,是指通过某种特定的条件,将存放在同一个数据库的数据,
分散存储在多个数据库中,以达到分散单台设备负载的效果。当数据库量超过800万行且需要做分片时,
就可以考 虑使用MyCat实现数据切分。
4). 数据库路由器
- MyCat基于MySQL实例的连接池复用机制,可以让每个应用最大程度共享一个MySQL实例的所有连接 池,
让数据库的并发访问能力大大提升。
5). 整合多种数据源
- 当一个项目中使用了多个数据库(Oracle,MySQL,SQL Server,PostgreSQL),并配置了多个数
据源,操作起来就比较烦锁,这时就可以使用MyCat进行整合,最终我们的应用程序只需要访问一个数据源即可。
1.5 MyCat 下载
下载地址: https://github.com/MyCATApache/Mycat-download
最新下载地址: http://dl.mycat.io/
2. MyCat入门
- 本章节主要讲解MyCat的在Linux中的安装、基本概念和基本原理,这些是学习MyCat的基础。
2.1 环境搭建
- Mycat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,下面介绍
MyCat的Linux中的环境搭建。
2.1.1 安装MySQL
卸载 centos 中预安装的 mysql
rpm -qa | grep -i mysql
rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps
下载并安装MySQL官方的 Yum Repository
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,大概25KB的样子,然后就可以直接yum安装了。
yum -y install mysql57-community-release-el7-10.noarch.rpm
之后就开始安装MySQL服务器。
yum -y install mysql-community-server
这步可能会花些时间,安装完成后就会覆盖掉之前的mariadb。
至此MySQL就安装完成了,然后是对MySQL的一些设置。
2.1.2 配置MySQL
首先启动MySQL
[root@localhost ~]# systemctl start mysqld.service
查看MySQL运行状态,运行状态如图:
[root@localhost ~]# systemctl status mysqld.service
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
[root@localhost ~]# grep "password" /var/log/mysqld.log
如下命令进入数据库:
[root@localhost ~]# mysql -uroot -p
输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
这里有个问题,新密码设置的时候如果设置的过于简单会报错:
原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:
MySQL完整的初始密码规则可以通过如下命令查看:
密码的长度是由validate_password_length决定的,而validate_password_length的计算公式是:
validate_password_length = validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)
我的是已经修改过的,初始情况下第一个的值是ON,validate_password_length是8。可以通过如下命令修改:
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
设置之后就是我上面查出来的那几个值了,此时密码就可以设置的很简单,例如1234之类的。到此数据库的密码设置就完成了。
但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:
[root@localhost ~]# yum -y remove mysql57-community-release-el7-10.noarch
授权远程访问 :
grant all privileges on *.* to 'root' @'%' identified by '123456';
flush privileges;
授权远程访问之后 , 就可以通过Navicat来连接Linux上的MySQL , 但是记得关闭Linux上的防火墙(或者配置防火墙):
Centos 7配置防火墙如下链接
https://blog.csdn.net/ls1645/article/details/78750561
连接成功
2.1.3 安装JDK1.8
A. 上传JDK的安装包到Linux的root目录下
alt + p -----------> put D:/jdk-8u181-linux-x64.tar.gz
B. 解压压缩包 , 到 /usr/share 目录下
tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/share/
C. 配置PATH环境变量 , 在该配置文件(/etc/profile)的最后加入如下配置
export JAVA_HOME=/usr/share/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin
2.1.4 安装MyCat
1). 上传MyCat的压缩包 alt + p -------->
put D:/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
2). 解压MyCat的压缩包
tar -zxvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /usr/local
3). MyCat的目录结构介绍
2.2 MyCat核心概念
2.2.1 分片
- 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
- 数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
1). 一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分。
2). 另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
MyCat 分片策略 :
虚线以上是逻辑结构图, 虚线以下是物理结构图 ;
2.2.2 逻辑库(schema)
- MyCat是一个
数据库中间件
,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
2.2.3 逻辑表(table)
- 既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
1). 分片表
是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。
总而言之就是需要进行分片的表。如 :tb_order 表是一个分片表, 数据按照规则被切分到dn1、dn2两个节点。
2). 非分片表
一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,
就是那些不需要进行数据切分的表。如: tb_city是非分片表 , 数据只存于其中的一个节点 dn1上。
3). ER表
关系型数据库是基于实体关系模型(Entity Relationship Model)的, MyCat中的ER表便来源于此。
MyCat提出了基于ER关系的数据分片策略 , 字表的记录与其所关联的父表的记录存放在同一个数据分片中,
通过表分组(Table Group)保证数据关联查询不会跨库操作。
4). 全局表
在一个大型的项目中,会存在一部分字典表(码表) , 在其中存储的是项目中的一些基础的数据 ,
而这些基础的数据 , 数据量都不大 , 在各个业务表中可能都存在关联 。当业务表由于数据量大而分片后 ,
业务表与附属的数据字典表之间的关联查询就变成了比较棘手的问题 ,
在MyCat中可以通过数据冗余来解决这类表的关联查询 , 即所有分片都复制这一份数据(数据字典表),
因此可以把这些冗余数据的表定义为全局表。
2.2.4 分片节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。
2.2.5 节点主机(dataHost)
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,
这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,
尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
2.2.6 分片规则(rule)
前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则
就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
2.3 分片配置测试
2.3.1 需求
由于 TB_TEST 表中数据量很大, 现在需要对 TB_TEST 表进行数据分片, 分为三个数据节点 ,每一个节点主机位于不同的服务器上, 具体的结构 ,参考下图 :
2.3.2 环境准备
准备三台虚拟机 , 且安装好MySQL , 并配置好 :
IP 地址列表 :
192.168.192.157
192.168.192.158
192.168.192.159
2.3.3 配置 schema.xml
- schema.xml 作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、逻辑表以及对应的分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
在服务器上创建3个数据库,命名为 db1
修改schema.xml如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="ITCAST" checkSQLschema="true" sqlMaxLimit="100">
<table name="TB_TEST" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db1" />
<dataNode name="dn3" dataHost="host3" database="db1" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.192.157:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.192.158:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="host3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.192.159:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
2.3.4 配置 server.xml
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。在system中添加UTF-8字符集设置,否则存储中文会出现问号
<property name="charset">utf8</property>
修改user的设置 , 我们这里为 ITCAST 设置了两个用户 :
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">ITCAST</property>
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">ITCAST</property>
<property name="readOnly">true</property>
</user>
并且需要将原来的逻辑库的配置 , 替换为 ITCAST逻辑库 ;
设置超时时间 在文件mycat/conf/wrapper.conf 添加
wrapper.startup.timeout=300
2.3.5 启动MyCat
启动:
cd usr/local/mycat/
bin/mycat start
bin/mycat stop
bin/mycat status
查看MyCat:
连接端口号 8066
1). 通过命令行
mysql -h 192.168.192.157 -P 8066 -u root -p
输入密码123456
2). 通过sqlyog连接
2.3.6 MyCat分片测试
进入mycat ,执行下列语句创建一个表
CREATE TABLE TB_TEST (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
我们再查看MySQL的3个库,发现表都自动创建好啦。好神奇。
接下来是插入表数据,注意,在写 INSERT 语句时一定要写把字段列表写出来,否则会出现下列错误提示:
错误代码: 1064 partition table, insert must provide ColumnList
我们试着在mycat插入一些数据:
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
我们会发现这些数据被写入到第一个节点中了,那什么时候数据会写到第二个节点中呢?我们插入下面的数据就可以插入第二个节点了
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
因为我们采用的分片规则是每节点存储500万条数据,所以当ID大于5000000则会存储到第二个节点上。
目前只设置了两个节点,如果数据大于1000万条,会怎么样呢?执行下列语句测试一下
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
如果数据大于1000万条会存储到第三个节点上
分片规则看schema配置 auto-sharding-long
0到500万存到节点1
500到1000万存到节点2
1000万到1500万存到节点3
2.4 MyCat原理介绍
MyCat原理中最重要的一个动词就是
拦截
, 它拦截了用户发送过来的SQL语句, 首先对SQL语句做一些特定的分析,如分片分析、路由分析、读写分离分析、缓存分析
等,然后将此SQL语句发往后端的真实数据库,并将返回的结果做适当处理,最终再返回给用户,如图所示。
在图中,user表被分为三个分片节点dn1、dn2、dn3, 他们分布式在三个MySQLServer(dataHost)上,因此可以使用1-N台服务器来分片,分片规则(sharding rule)为典型的字符串枚举分片规则, 一个规则的定义是分片字段+分片函数。这里的分片字段为 status,分片函数则为字符串枚举方式。
MyCat收到一条SQL语句时,首先解析SQL语句涉及到的表,接着查看此表的定义,如果该表存在分片规则,则获取SQL语句里分片字段的值,并匹配分片函数,得到该SQL语句对应的分片列表,然后将SQL语句发送到相应的分片去执行,最后处理所有分片返回的数据并返回给客户端。以"select *from user where status=‘0’" 为例, 查找 status=‘0’ ,按照分片函数, ‘0’ 值存放在dn1,于是SQL语句被发送到第一个节点中执行, 然后再将查询的结果返回给用户。如果发送的SQL语句为 select * from user where status in ('0','1')
, 那么SQL语句会被发送到dn1,dn2对应的主机上执行, 然后将结果集合并后输出给用户。
3. MyCat配置文件详解
3.1 server.xml
3.1.1 system 标签
3.1.2 user 标签
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">ITCAST</property>
<property name="readOnly">false</property>
<property name="benchmark">1000</property>
<property name="usingDecrypt">0</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
user标签主要用于定义登录MyCat的用户和权限 :
-
<user name="root" defaultAccount="true">
: name 属性用于声明用户名 ; -
<property name="password">123456</property>
: 指定该用户名访问MyCat的密码; -
<property name="schemas">ITCAST</property>
: 能够访问的逻辑库, 多个的话, 使用 “,” 分割 -
<property name="readOnly">true</property>
: 是否只读 -
<property name="benchmark">11111</property>
: 指定前端的整体连接数量 , 0或不设置表示不限制 -
<property name="usingDecrypt">0</property>
: 是否对密码加密默认 0 否 , 1是
cd /usr/local/mycat/lib/
java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:123456
7. <privileges check="false">
- A. 对用户的 schema 及 下级的 table 进行
精细化的 DML 权限控制
; - B. privileges 节点中的 check 属性是用 于标识
是否开启 DML 权限检查
, 默认 false 标识不检查,当然
privileges 节点不配置,等同check=false
, 由于 Mycat 一个用户的schemas 属性可配置多个 schema,
所以 privileges 的下级节点 schema 节点同样 可配置多个,对多库多表进行细粒度的 DML 权限控制; - C. 权限修饰符四位数字(0000 - 1111),对应的操作是 IUSD
( 增,改,查,删)
。
同时配置了库跟表的权限,就近原则
。以表权限为准。
3.1.3 firewall 标签
- firewall标签用来定义防火墙;firewall下whitehost标签用来定义 IP白名单 ,
blacklist用来定义SQL黑名单。
<firewall>
<whitehost>
<host host="127.0.0.1" user="root"/>
</whitehost>
<blacklist check="true">
<property name="selecttAllow">true</property>
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
主机必须是127.0.0.1才能访问root用户
允许root用户查询,不允许删除
黑名单拦截明细配置:
3.2 schema.xml
schema.xml 作为MyCat中最重要的配置文件之一 , 涵盖了MyCat的逻辑库 、 表 、 分片规则、分片节点及数据源的配置。
3.2.1 schema 标签
<schema name="ITCAST" checkSQLschema="false" sqlMaxLimit="100">
<table name="TB_TEST" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
schema 标签用于定义 MyCat实例中的逻辑库 , 一个MyCat实例中, 可以有多个逻辑库
, 可以通过 schema
标签来划分不同的逻辑库。MyCat中的逻辑库的概念 , 等同于MySQL中的database概念 , 需要操作某个逻辑库下的表时, 也需要切换逻辑库:
use ITCAST;
3.2.1.1 属性
schema 标签的属性如下 :
1). name 指定逻辑库的库名 , 可以自己定义任何字符串 ;
2). checkSQLschema 取值为 true / false ;
- 如果设置为true时 , 如果我们执行的语句为
select * from ITCAST.TB_TEST;
则MyCat会自动把schema字符去掉, 把SQL语句修改为 "select * from TB_TEST
;可以避免SQL发送到后端数据库执行时, 报table不存在的异常 。 - 不过当我们在编写SQL语句时, 指定了一个不存在schema, MyCat是不会帮我们自动去除的 ,这个时候数据库就会报错,
所以在编写SQL语句时,最好不要加逻辑库的库名, 直接查询表即可
。
3). sqlMaxLimit
- 当该属性设置为某个数值时,每次执行的SQL语句如果没有加上limit语句, MyCat也会自动在limit语句后面加上对应的数值。
也就是说, 如果设置了该值为100,则执行select * fromTB_TEST
与select * from TB_TEST limit 100
是相同的效果 。 所以在正常的使用中, 建立设置该值 , 这样就可以避免每次有过多的数据返回。
3.2.1.2 子标签table
table 标签定义了MyCat中逻辑库schema下的逻辑表 , 所有需要拆分的表都需要在table标签中定义 。
<table name="TB_TEST" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
属性如下 :
1). name
定义逻辑表的表名 , 在该逻辑库下必须唯一。
2). dataNode
定义的逻辑表所属的dataNode , 该属性需要与dataNode标签中的name属性的值对应。 如果一张表拆分的数据,存储在多个数据节点上,多个节点的名称使用","分隔 。
3). rule该属性用于指定逻辑表的分片规则的名字, 规则的名字是在rule.xml文件中定义的, 必须与tableRule标签中name属性对应。
4). ruleRequired
该属性用于指定表是否绑定分片规则, 如果配置为true, 但是没有具体的rule, 程序会报错。
5). primaryKey
逻辑表对应真实表的主键如: 分片规则是使用主键进行分片
, 使用主键进行查询时, 就会发送查询语句到配置的所有的datanode
上;如果使用该属性配置真实表的主键, 那么MyCat会缓存主键与具体datanode的信息,再次使用主键查询就不会进行广播式查询了,而是直接将SQL发送给具体的datanode。
6). type
该属性定义了逻辑表的类型,目前逻辑表只有全局表和普通表。全局表:type的值是 global , 代表 全局表 。普通表:无
7). autoIncrement
mysql对非自增长主键,使用last_insert_id()
是不会返回结果的,只会返回0。所以,只有定义了自增长主键的表,才可以用last_insert_id()返回主键值。 mycat提供了自增长主键功能,但是对应的mysql节点上数据表,没有auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的。如果使用这个功能, 则最好配合数据库模式的全局序列。
使用 autoIncrement="true"
指定该表使用自增长主键
,这样MyCat才不会抛出 “分片键找不到” 的异常。 autoIncrement的默认值为false。
8). needAddLimit
指定表是否需要自动在每个语句的后面加上limit限制, 默认为true。
3.2.2 dataNode 标签
<dataNode name="dn1" dataHost="host1" database="db1" />
dataNode标签中定义了MyCat中的数据节点, 也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。
具体的属性 :
3.2.3 dataHost 标签
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0"
dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.192.147:3306" user="root" password="itcast"></writeHost>
</dataHost>
该标签在MyCat逻辑库中作为底层标签存在, 直接定义了具体的数据库实例、读写分离、心跳语句。
3.2.3.1 属性
3.2.3.2 子标签heartbeat
- 配置MyCat与后端数据库的心跳,
用于检测后端数据库的状态
。heartbeat用于配置心跳检查
语句。 - 例如 : MySQL中可以使用select user(), Oracle中可以使用 select 1 from dual等。
3.2.3.3 子标签writeHost、readHost
- 指定后端数据库的相关配置, 用于实例化后端连接池。 writeHost指定写实例,
readHost指定读实例。在一个dataHost中可以定义多个writeHost和readHost。
但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost也将不可用。
3.3 rule.xml
rule.xml中定义所有拆分表的规则, 在使用过程中可以灵活的使用分片算法, 或者对同一个分片算法使用不同的参数, 它让分片过程可配置化。
3.3.1 tableRule标签
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
A. name : 指定分片算法的名称
B. rule : 定义分片算法的具体内容
C. columns : 指定对应的表中用于分片的列名
D. algorithm : 对应function中指定的算法名称
3.3.2 Function标签
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
A. name : 指定算法名称, 该文件中唯一
B. class : 指定算法的具体类
C. property : 根据算法的要求执行
3.4 sequence 配置文件
在分库分表的情况下 , 原有的自增主键已无法满足在集群中全局唯一的主键 ,因此, MyCat中提供了全局sequence来实现主键 , 并保证全局唯一。那么在MyCat的配置文件sequence_conf.properties 中就配置的是序列的相关配置。主要包含以下几种形式:
1). 本地文件方式
2). 数据库方式
3). 本地时间戳方式
4). 其他方式
5). 自增长主键