一、mycat概念
从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。 Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。
二、mycat特性
- 支持SQL92标准
- 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
- 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
- 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基于Nio实现,有效管理线程,解决高并发问题。
- 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
- 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
- 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
- 支持多租户方案。
- 支持分布式事务(弱xa)。
- 支持XA分布式事务(1.6.5)。
- 支持全局序列号,解决分布式下的主键生成问题。
- 分片规则丰富,插件化开发,易于扩展。
- 强大的web,命令行监控。
- 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
- 支持密码加密
- 支持服务降级
- 支持IP白名单
- 支持SQL黑名单、sql注入攻击拦截
- 支持prepare预编译指令(1.6)
- 支持非堆内存(Direct Memory)聚合计算(1.6)
- 支持PostgreSQL的native协议(1.6)
- 支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
- 支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
- 支持库内分表(1.6)
- 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
三、mycat架构图
核心流程:
sql解析 ->数据源分配 -> 请求响应 -> 结果整合
框架图:
mycat有自身的监控机制,具备如下功能:
- 支持对Mycat、Mysql性能监控
- 支持对Mycat的JVM内存提供监控服务
- 支持对线程的监控
- 支持对操作系统的CPU、内存、磁盘、网络的监控
高可用方案图:
此处AHproxy起到转发的作用,类似网关功能,mycat部署采用多集群策略,数据库基于主从配置。
运用图:
根据业务表特点,可以对特定表配置不同的策略,如以写为主、全局表等。
四、mycat配置文件介绍
1、schema.xml 管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。配置文件节点关系如下:
逻辑库(sehema),逻辑表(table),配置分片(dataNode),配置物理库分片映射(dataHost)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--逻辑库-->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<!-- auto sharding by id (long) -->
<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
<!--逻辑表-->
<table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
</schema>
<!--配置分片-->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!--配置物理库分片映射-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
2、server.xml 保存了所有mycat需要的系统配置信息,定义登录mycat的用户和权限。
3、rule.xml 定义了我们对表进行拆分所涉及到的规则定义。目前的分片规则有分片枚举 、固定分片hash算法、求模、按日期(天)分片、取模范围约束、ASCII码求模范围约束、字符串hash解析、一致性hash、按单月小时拆分、自然月分片 。
分片规则的使用方式:在逻辑表的配置中有一个: rule="auto-sharding-long",rule 对应的是 rule.xml 的 name = "auto-sharding-long"。这里可以结合schema.xml 与rule.xml及具体业务特点来配置。
4、分片规则设计架构:
分布式数据库系统中,分片规则用于定义数据与分片的路由关系,也就是insert,delete,update,select的基本sql操作中,如
何将sql路由到对应的分片执行。分片总体路由图如下:
五、mycat经典实用场景
单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 |
分表分库,对于超过1000 万的表进行分片,最大支持1000 亿的单表分片 |
多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化 |
报表系统,借助于Mycat的分表能力,处理大规模报表的统计 |
替代Hbase,分析大数据作为海量数据实时查询的一种简单有效方案 |
学习地址:
《Mycat权威指南-全部-完整版》