MyCAT简单介绍:
所有前端的数据库连接都会接入到mycat中,mycat识别会话中的读或者写的请求,分发到mycat配置的后端数据库中
mycat后端是一个主备集群,mycat不负责数据同步,只负责读写分析和大表分片的规则和路由
mycat核心配置文件有三个:
server.xml配置mycat自我相关的参数
schema.xml配置mysql数据库,写操作的数据源和读操作的数据源
rule.xml 配置Mycat分片规则
schema.xml简单分析:
dataHost定义mycat连接的mysql实例,并且区分定义读的节点和写的节点,实现读写分离
dataNode对这些实例进一步关联,完成分库
如dataNode1是实例1的第一个库,dataNode2是实例2的第一个库
table标签使用dataNode1或者dataNode2或者两者皆有,也就实现了表访问的水平切分,完成分库
table标签使用rule规则,实现多个dataNode之间的访问策略
rule.xml 简单分析:
一个table标签可以使用多个dataNode,那么这些dataNode之间的负载怎么切分
就是rule.xml实现的功能了,它是有分片字段和分片函数组成的
分片字段是选取的表中的用于分片的字段,如需要根据省份进行分片,那么分片字段就是省份
分片函数则是对分片字段进行处理的可用函数
如hash-int,计算分片字段的hash值,然后根据配置分片值和dataNode映射关系来路由
简单总结:
mycat使用schema.xml定义逻辑库和逻辑表,和多个物理mysql库、表之间进行映射
使用schema中的dataHost定义writeHost和readHost实现读写分离
使用dataNode关联dataHost,进一步使用table关联一个或多个dataNode,实现表的分片
这种分片方式是表的水平分片,当一个逻辑表存在多个物理分片时,该映射的路由规则由rule来定义
rule由分片字段和分片函数组成,分片函数主要有连续分片和离散分片两类分片函数
分别相当于oracle的range分区表和hash分区表,当然也可以连续+离散的组合分片
这些规则定义在rule.xml中
mycat使用心跳检测heartbeat来确定连接的多个mysql实例的可用性,心跳检测主要有
select user()和show slave status两种方法
mycat默认端口是8066,web连接mycat像直接连接mysql库一样,只需要改端口即可
原连接串 jdbc:mysql://192.168.1.110:3306/
使用mycat的连接串 jdbc:mysql://192.168.1.100:8066/
原连接串 mysql -uxx -pxx -P3306
使用mycat的连接串 mysql -uxx -pxx -P8066
连接后能够使用的库和表即是schema.xml中配置的逻辑库和逻辑表
而在server.xml中定义了mycat的连接逻辑用户名和密码,以及对应的逻辑库和逻辑表
表分片有两种:水平分片和垂直分片,垂直和水平是对于表结构来说的
垂直分片:将表的列切分开,分片后每一片都具有表全部的记录数和部分的列,列式数据库的分表
水平分片:将表的记录按一定规则切分开,分片后每一片只有该表的部分记录,相当于分区表
水平分片有同库内的分表和多个库之间的分库:
分表:表的分区处于同一个库内,和分区表极其相似,小众的,无法拆分对表访问的主机负载
分库:表的分区处于不同库内,大众分片方法,可以拆分对表访问的负载
mycat的E-R分片,这里的E-R是指实体-联系,优化具有父子表关系的两表分片问题
对父表进行分片,对父表相关联的子表的对应记录
在该记录插入之时就会自动路由到它的父表记录所在的dataNode上
这样关联查询时,就不会产生子表和父表跨分片的情况
建议子表外键关联父表分片键,这样路由时无需查库,这样就需要父表分片键是父表的主键了
mycat全局表,一条insert语句会同步插入到全局表的各个dataNode上
使各个dataNode上的全局表数据一致,这个时候如果有跨分片join的情况就可完美解决
比如父表是特别小的表,子表做了分片,那么父表可以做成全局表
mycat分片规则:连续分片和离散分片
连续分片:相当于oracle的range分区,是范围分片,主要是对时间类、数字类分片
离散分片:相当于oracle的hash分区,是hash分片,如枚举分片、取模分片、hash分片
二次分片:相当于oracle的组合分区,先范围分片,每个范围分片进行hash分片
Mycat eye可以监控mycat
现在的mycat问题颇多,建议调研proxy sql或者网易开源的cetus
如果要使用mycat,需要公司二次开发支持,解决BUG,进一步定制功能
[TOC]