什么是 MyCat

当对数据拆分后会产生诸多的问题,对于这些问题的解决,可以借助于数据库中间件来进行解决,现在时下比较流行的是使用 Mycat。

Mycat 是一款数据库中间件,对于应用程序来说是完全透明化的,不管底层的数据如何拆分,应用只需要连接 Mycat 即可完成对数据的操作。同时它还支持 MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库。但是 Mycat 不会进行数据存储,它只是用于数据的路由。

  • 一个彻底开源的,面向企业应用开发的“大数据库集群”
  • 支持事务、ACID、可以替代 Mysql 的加强版数据库
  • 一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的 Oracle 集群
  • 一个融合内存缓存技术、Nosql 技术、HDFS 大数据的新型 SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个数据库中间件产品

MyCAT 的目标是:低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。

MyCat 特性

  • 支持 SQL92 标准
  • 遵守 Mysql 原生协议,跨语言,跨平台,跨数据库的通用中间件代理
  • 基于心跳的自动故障切换,支持读写分离,支持 MySQL 主从,以及 galera cluster 集群
  • 支持 Galera for MySQL 集群,Percona Cluster 或者 MariaDB cluster
  • 基于 Nio 实现,有效管理线程,高并发问题
  • 支持数据的多片自动路由与聚合,支持 sum,count,max 等常用的聚合函数
  • 支持单库内部任意 join,支持跨库 2 表 join
  • 支持通过全局表,ER 关系的分片策略,实现了高效的多表 join 查询
  • 支持多租户方案
  • 支持分布式事务
  • 支持全局序列号,解决分布式下的主键生成问题
  • 分片规则丰富,插件化开发,易于扩展
  • 强大的 web,命令行监控
  • 支持前端作为 mysq 通用代理,后端 JDBC 方式支持 Oracle、DB2、SQL Server 、 mongodb
  • 支持密码加密
  • 支持服务降级
  • 支持 IP 白名单
  • 支持 SQL 黑名单、sql 注入攻击拦截
  • 支持分表(1.6 以后版本)
  • 集群基于 ZooKeeper 管理,在线升级,扩容,智能优化,大数据处理(2.0 以后版本)

MyCat 核心概念

  • 逻辑库:Mycat 中的虚拟数据库。对应实际数据库的概念。在没有使用 mycat 时,应用需要确定当前连接的数据库等信息,那么当使用 mycat 后,也需要先虚拟一个数据库,用于应用的连接。
  • 逻辑表:mycat 中的虚拟数据表。对应时间数据库中数据表的概念。
  • 非分片表:没有进行数据切分的表。
  • 分片表:已经被数据拆分的表,每个分片表中都有原有数据表的一部分数据。多张分片表可以构成一个完整数据表。
  • ER 表:子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据 Join 不会跨库操作。表分组(Table Group)是解决跨分片数据 join 的一种很好的思路,也是数据切分规划的重要一条规则
  • 全局表:可以理解为是一张数据冗余表,如状态表,每一个数据分片节点又保存了一份状态表数据。数据冗余是解决跨分片数据 join 的一种很好的思路,也是数据切分规划的另外一条重要规则。
  • 分片节点(dataNode):数据切分后,每一个数据分片表所在的数据库就是分片节点。
  • 节点主机(dataHost):数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
  • 分片规则(rule):按照某种业务规则把数据分到某个分片的规则就是分片规则。
  • 全局序列号(sequence):也可以理解为分布式 id。数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence),如 UUID、雪花算法等。

MyCat 实现

用户可以把 MyCAT 看作是一个数据库代理,用 mysql 客户端工具(如 Navicat)和命令访问,其核心功能就是分库分表,即将一个大表水平分割为 N 个小表,真正的存储在后端 Mysql 服务器中或其它数据库中。

MyCat 的原理:MyCat 底层是基于拦截思想实现,其会拦截用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

Mycat 的应用场景

  • 性能问题

  • 数据库连接过多

  • E-R 分片难处理

  • 可用性问题

  • 成本和伸缩性问题

分片原理

数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式:

  • 水平分片:将不同的表切分到不同的数据库中。
  • 垂直分片:一个数据库中多个表格 A,B,C,A 存储到节点 1 上,B 存储到节点 2 上,C 存储到节点 3 上。

  • MyCAT 通过定义表的分片规则则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。
  1. Schema:逻辑库,与 MySQL 中的 Database(数据库)对应,一个逻辑库中定义了所包括的 Table。
  2. Table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点 DataNode。在此可以指定表的分片规则。
  3. DataNode:MyCAT 的逻辑数据节点,是存放 table 的具体物理节点,也称之为分片节点,通过 DataSource 来关联到后端某个具体数据库上
  4. DataSource:定义某个物理库的访问地址,用于捆绑到 Datanode。

读写分离

数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于 MySQL 来说,标准的读写分离是主从模式,一个写节点 Master 后面跟着多个读节点,读节点的数量取决于系统的压力,通常是 1-3 个读节点的配置.。

Mycat 读写分离和自动切换机制,需要 mysql 的主从复制机制配合。开启 MySql 的主从复制机制。

主从配置需要注意:

  • 主 DB server 和从 DB server 数据库的版本一致
  • 主 DB server 开启二进制日志,主 DB server 和从 DB server 的 server_id 都必须唯一