Mycat关键特性:
- 基于心跳的自动故障切换
- 支持读写分离,支持Mysql主从
- 基于NIO实现,有效管理线程,解决高并发问题
- 支持数据库的多片自动路由与聚合,支持sum、count、max等常用的聚合函数,支持跨库分页
- 支持单库内部任意join,支持跨库2表join
- 支持通过全局表,ER关系的分片策略,实现高效的多表join查询
- 支持全局序列号
- 支持XA分布式事务(弱XA)
- 支持ZK协调主从切换、zk序列
....
Mycat监控:
- 支持对Mycat、Mysql性能监控
- 支持对Mycat 的 JVM 内存提供监控服务
- 支持对线程的监控
- 支持对系统的CPU、内存、磁盘、网络的监控
....
Mycat 概念
- 逻辑库:一个或多个数据库集群构成的逻辑库。个人看法:就是我们最后连接Mycat进行数据表操作的数据库名,通过这个数据库可以操作我们配置的物理数据库
- 逻辑表:存储在逻辑库中,用于给应用提供数据的表称为逻辑表。逻辑表可以是经过数据分片,分布在不同的分片库中的表;也可以是不经过数据分片,只存在一个分片中的表
- 分片表:数据量很大的表切分到多个分片库中,所有的分片组合起来构成一张完整的表
- 非分片表:相对于上面的分片表,就是不需要进行切分的表
- ER表:基于实体关系模型的数据分片策略,子表的记录与其所关联的记录在同一个分片库上,即子表依赖父表,通过表分组保证数据关联查询不会跨库操作
- 全局表:全局表是所有分片都复制同一份数据的表,例如:字典表
Mycat架构图:
从图上我们可见,Mycat 的原理大致就是拦截用户发送的sql,然后经过sql解析、sql优化、sql路由然后最后到sql执行。sql执行之后会根据不同的情况进行排序、聚合、合并操作,最终把结果集返回给用户。
Mycat 配置
server.xml : 服务器参数调整 和 用户授权的配置文件
-
schema.xml : 逻辑库、表定义,库、表定义, 读写配置
- schma:逻辑库配置,多个schma代表多个多个逻辑库
- dataNode:逻辑库对应的分片
- dataHost:实际的物理库配置(可配置主从)
重要参数:
balence 负载均衡类型:
0:不开启读写分离机制
1: 全部的readHost 和 stand by writeHost 参与select 语句的负载均衡
2: 所有的读操作都随机在write、readhost 上分发
3: 所有读请求随机分发到write对应的 readhost执行
switchType 主从切换类型:
-1:不自动切换
1:自动切换(默认值)
2:基于Mysql主从同步状态决定是否切换
3: 基于Mysql galary cluster 的切换机制
rule.xml:分片规则配置
分片规则:
枚举法、固定分片、范围约定、求模法、日期列分区法、通配取模、ASCII 取模、编程指定、字符串拆分hash解析、一致性hash
参考链接:https://www.cnblogs.com/kingsonfu/p/10627423.htmllog4j.xml :日志文件配置
rule 配置
- 枚举法:枚举节点值,如果没在枚举值中,则判断是否有默认节点,没有则抛错
- 固定分片hash:划分几个不同区域,区域最大为1024,节点通过hash取模决定在哪个分区
- 范围约定:划分几个范围,节点在一个范围内则划分到对应的分区
- 求模法:设置一个值,然后进行取模,然后将节点划分到取模后结果的哪个分区
- 日期列分区法:从开始日期,没隔多久为一个分区
- 通配取模:通过和一个值进行取模操作,然后将取模结果和配置的范围进行匹配,放入对应的分区
- ASCII码取模:和通配取模区别是,通配取模是使用int型分片字段进行取模,而ASCII码是截取字段值ASCII码的指定位数进行取模运算
- 编程约定:通过截取指定分区字段来获取要划分的分区
- 字符串拆分hash解析:截取字符串值进行hash取模计算得到对应的分区
- 一致性hash:(参考百度吧....)
参考链接:cnblogs.com/KelvinDaniels/p/11572775.html
Mycat ER 模型
ER模型是实体关系模型,基本元素是实体、关系和属性。Mycat针对ER关系表的切分规则,使得有相互依赖的表能够按照某一个规则切分到相同的节点中,避免跨库Join关系查询
Mycat 使用场景
- 单纯的读写分离,配置简单,支持主从切换
- 分表分库
- 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改动程序本身,实现多租户化
Mycat 不适用场景
- 非分片字段查询(如果查询条件没有分片字段,则会在所有节点都执行一次sql,DB节点多时,极大消耗性能)
- 分页排序(如果分页sql没有排序条件则无法保证结果的正确性、分页查询偏移量很大时会极其消耗内存和CPU资源)
- 任意表的join(当表在不同库时,join查询会出现问题)
- 分布式事务(Mycat是弱XA事务,无法保证事务的一致性)