目录
1、功能介绍
Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的 Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库中。
Mycat 发展到目前的版本,已经不是一个单独的 MySQL代理了,它的后端可以支持 MySQL 、SQLServer、Oracle、DB2、PostgreSQL等主流数据,也支持 MongoDB 这种新型 NoSQL 方式的存储,未来还会支持更多类型的存储。
Mycat 适合1000亿条以下的单表规模,而 Hadoop 等这系统,更适合千亿以上的规模。
2、原理
Mycat 的原理中最重要的一个动词是 “拦截”,它拦截了用户发送过来的 SQL语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
3、应用场景
- 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
- 分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片
- 多租户应用,每个应用一个库,但应用程序只连接 Mycat,从而不改造程序本身,实现多租户化
- 报表系统,借助于 Mycat 的分表能力,处理大规模报表的统计
- 替代 Hbase,分析大数据
- 作为海量数据实时查询的一种简单有效方案,比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或者其他属性查询,此时 Mycat 可能是最简单有效的选择
4、Mycat 中的概念
4.1 数据库中间件
Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。
4.2 逻辑库(schema)
前面讲了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
4.3 逻辑表
4.3.1 逻辑表
读写数据的表就是逻辑表。逻辑表可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
4.3.2 分片表
分片表,是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。
4.3.3 ER表
关系型数据库是基于实体关系模型(Entity-Relationship Model)之上,通过其描述了真实世界中事物与关系,Mycat 中的 ER表即是来源于此。根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组保证数据 Join 不会跨库操作。
表分组是解决跨分片数据 join 的一种很好的思路,也是数据切分规则的重要一条规则。
4.3.4 全局表
在真实的业务系统中,往往存在大量的类似于字典表的表,这些表有如下特征:
- 变动不频繁
- 数据量总体变化不大
- 数据规模不大,很少有超过数十万条记录。
对于这类的表,在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,所以 Mycat 中通过数据冗余来解决这类表的 join,即所有的分片都有一份数据的拷贝,所有将字典表或者符合字典表特征的一类表定义为全局表。
数据冗余是解决跨分片数据 join 的一种很好的思路,也是数据切分规则的另外一条重要规则。
4.4 分片节点
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点。
4.5 节点主机
每个分片节点可能独占一台机器,同一机器可能有多个分片节点,这个机器称为 节点主机,为了规避单节点主机并发数限制,尽量将读写压力高的分片节点均衡的放在不同的节点主机。
4.6 分片规则
按照某种业务规则把数据分到某个分片的规则就是分片规则。
4.7 全局序列号
数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识这种保证全局数据唯一标识的机制就是全局序列号。
4.8 多租户
多租户技术或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。
多租户在数据存储上存在三种主要的方案,分别是:
4.8.1 独立数据库
一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。
4.8.2 共享数据库,隔离数据架构
多个或所有租户共享数据库,但是每个租户一个 Schema(表)。
4.8.3 共享数据库,共享数据架构
租户共享同一个数据库,同一个 Schema,但在表中通过 TenantID 区分租户的数据。这是共享程度最高、隔离级别最低的模式。