Mycat介绍
中间件:代理;
面向企业的开源的数据库集群,性能极高;淘宝正在使用;
京东,美团;
数据库中间件历史:
amoeba:变形虫
分布式高可用结构不稳定
cobar:Mycat前身
数据库中间件原理
cober容易出现后端的物理服务器假死现象;
Mycat特点
1、高性能的读写分离
2、100亿级别的大表水平分片,集群并行计算
3、整合多种数据源的输入和输出
Mycat核心概念
1、Mycat核心组件的概念
逻辑库(对应数据库):Mycat中间提供客户端传入sql,拦截sql根据配置解析
翻译要到物理库执行的真正sql语句;
客户端在连接Mycat后可以操作数据库语句,表格语句等等;
客户端在连接Mycat看到的数据库叫做逻辑库
(并不是真正的数据库,数据可以来源一个物理库,也可以来源于多个物理库)
逻辑库在Mycat中需要使用<schema>标签完成配置,在schema.xml文件中配置
逻辑表:逻辑库数据的细分分配
分片表:
表格的整体数据量过大时,mycat将会使用多个物理库中的真实表格对应做逻辑分片表
的数据分片存储,这种表格在mycat叫做分片表
非分片表
数据存储时,整体数据量不够海量时,可以使用非分片表存储,相对来说
非分片表比分片表配置简单;
全局表
企业中一些工具表格,字典表,它们的共同特点是:数据变动稳定,数据量不大,这种表格
需要和业务表做非常多的关联查询,为了底层数据查询时不做过多的跨库操作,global全局
表示为每个物理库中都复制一份
工具表、字典表:
业务中很多逻辑,都不是用字符表示的
通信成功:200状态码
通信异常:500
通信成功:400
数字代表特殊含义的情况,可以记录在数据库中某个工具表或字典表中;
ER表
mycat独有
分片表的一种特殊情况,多个分片表有关系的时候,经常做关联查询,如果多个分片表格
中相关的数据,但是切分到的存储物理库不同,会导致关联查询/相关数据查询时造成底层的非常大量的
跨库操作;
以订单和订单商品为例,一旦分片表格设置完成,很有可能2个表格相关的数据被切分到了不同的物理库,
相关数据查询时,mycat底层夸库操作非常多,造成查询的效率非常低下;
mycat就全球第一次提出ER表的概念;
ER表根据相关内容的设定主表(t_order)使用table标签配置,从表不能使用纯粹的分片表格设置
需要在table下指定(childtable),根据主表的切分逻辑完成从表的切分;
Mycat中的配置文件
配置文件
根目录的conf中有两个核心的配置文件,配置内容实现:
读写分离、高可用替换、分布式存储、ER分片表逻辑。
server.xml
包括2个重要标签
system:配置mycat启动时占用的系统的一些资源属性(注释掉的不需要动,保持默认)
user:指定当前登陆的用户信息;
属性:
name表示登录当前的mycat的用户名
password表示登录密码
schemas表示当前这个用户可以查看的逻辑库,以“,”分隔
这里的名称必须和schema.xml中的schema标签名称对应
readOnly表示当前用户只读,不能操作写
quarantine标签:安全措施可以设置白名单黑名单
whitehost:白名单列表
blacklist:黑名单列表
schema.xml:当前mycat代理的数据库集群的设定
逻辑库,分片/非分片表,ER表,读写分离,高克用替换
标签结构
schema:逻辑库
table:逻辑表
childtable:逻辑表的从逻辑表
dataNode:数据分片节点的配置,一个数据分片node对应的数据库结构可能很简单
也可能很复杂,指向一个dataHost
dataHost:
heartbeat:心跳检测,语句不一样,替换逻辑可能不同
writeHost:写操作的数据库节点(也可以读)
readHost:与当前writeHost相关的(主从)读节点(只读)
每个标签的属性
schema:name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"
name:逻辑库名称
checkSQLschema:例如sql语句“select * from tb_item”,mycat拦截,将其表格名称根据当前属性的设定进行修改,
false不会自动检查逻辑库名称,不拼接逻辑库名字“select * from tb_item”,
可能会导致无法找到逻辑库执行后续逻辑,true自动检测,
会拼接逻辑库名字“select * from TESTDB.tb_item”
sqlMaxLimit:一种查询的保护措施,执行查询语句时,自动配置的分页数据,只差前100条,在没有limit时
table:<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" type="global"/>
name:逻辑表名称,配置和真实数据库的表名最好相同
dataNode:对应一个,多个数据库节点的标签,多个值表示分片,单个值表示非分片
rule:数据分片的计算规则,auto-sharding-long,利用long整型的id值进行范围划分
(0-500万(index0),500万-1000万(index1),1000万-1500万(index2))
primaryKey:指向表格的主键,最好与真实字段一致
type:表格类型,默认不是global
childtable:从表
<childTable name="orders" primaryKey="ID" joinKey="order_id"parentKey="id">
name:从表名称,保持和数据库真是表格一致
primaryKey:主键名称
joinKey:从表中外键字段;必须和真实数据库的从表外键字段名一致
parentKey:主表的字段名,必须和主表与从表的外键相关,对应主表的字段名称
dataNode标签:数据节点
<dataNode name="dn1" dataHost="localhost1" database="db1" />
name:表示名称,逻辑库,逻辑表指向的依据
dataHost:指向真实管理数据库的标签名称dataHost
database:真实数据库名称,逻辑库和所有真实数据库名称一致
dataHost:管理数据分片的真实数据库的标签,内不包含真实数据库信息
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"
dbDriver="native" switchType="1" slaveThreshold="100">
name:名称,与datanode指向对应
maxCon:底层数据库的连接最大数
minCon:底层数据库的连接最小数
balance:值是0,1,2,3,分别表示对当前dataHost中维护的数据库门的读操作逻辑
0:不开启读写分离,所有的读写操作都在最小的索引号的writeHost(第一个)
1:全部的readHost和备用的writeHost都参与读数据的平衡,去过读的请求过多,
负责写的第一个writeHost也分担一部分
2:所有的读操作,都随机的在所有的writeHost和readHost上进行
3:所有的读操作,都到writeHost对应的readHost上进行(备用的writeHost不参加了)
在集群中没有配置readHost的情况下,读都到第一个writeHost完成
writeType:控制当前dataHost维护的数据集群的写操作
0:所有的写操作都在第一个writeHost标签的数据库进行
1:所有的写操作,都随机分配到所有的writeHost(mycat1.5完全不建议配置了)
dbtype:数据库类型(不同数据库配置不同名称,mysql)
dbDriver:数据库驱动,native,动态获取
switchType:切换的逻辑
0:故障不切换;
1:故障切换,当前写操作的writeHost故障,进行切换,切换到下一个writeHost
slaveThreshold:标签中的<heartbeat>用来检测后端数据库的心跳sql语句;
本属性检查从节点与主节点的同步情况(延迟时间数)
配合心跳语句show slave status;
读写分离时,所有的readHost的数据都可靠。
Mycat的安装
1 基于jdk运行(云主机略)
2 获取安装包
/home/resources
#cp /home/resources/Mycat***.tar.gz ./
将文件拷贝到software
3 解压
#tar -xf Mycat***.tar.gz
4 测试运行
mycat的根目录中bin保存了mycat的核心运行命令文件
mycat
#mycat console