MyCat 的超强功能与应用场景入门篇


肖哥弹架构 跟大家“弹弹” 关注公号回复 'mvcc' 获得手写数据库事务代码
欢迎 点赞,点赞,点赞。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
一、MyCat 简介
1、什么是 MyCat
MyCat 是目前最流行的基于 java
语言编写的数据库中间件
,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表
。配合数据库的主从模式还可实现读写分离
。
MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。
MyCat 发展到目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持 MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型 NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在 MyCat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
MyCat 官网: www.mycat.io/
2、MyCat 的结构

3、核心功能
MyCat 是一款流行的开源分布式数据库中间件,主要作用是作为应用程序和数据库之间的中间层,用于优化数据库性能、提高可扩展性和简化数据库管理。以下是关于 MyCat 的详细介绍:
核心功能
读写分离:MyCat 可以将读操作和写操作分别分配到不同的数据库节点上,从而提高数据库的并发处理能力和性能。
数据分片:支持垂直分片(将不同表分到不同数据库)和水平分片(将同一表的数据按条件分到多个数据库),能够有效分散单台设备的负载。
多数据源整合:可以整合多种主流数据库(如 MySQL、Oracle、SQL Server、PostgreSQL 等),应用程序只需通过 MyCat 访问即可。
分布式事务支持:支持分布式事务(弱 XA)以及 XA 分布式事务(1.6.5 版本及以上),确保数据一致性。
全局序列号生成:解决了分布式环境下的主键生成问题。
4、设计背景
MyCat 的设计背景主要源于对大规模数据库分片、读写分离以及数据库中间件的需求。以下是 MyCat 设计背景的几个关键点:
解决大规模数据库问题: MyCat 的前身是阿里开源的产品 Cobar,Cobar 的核心功能和优势是 MySQL 数据库分片。随着互联网的发展,数据量级成指数增长,传统的关系型数据库已经无法满足快速查询与插入数据的需求,特别是在高并发和大数据量的场景下。
提高数据库性能和扩展性: MyCat 旨在通过数据库分库分表的策略,解决传统单一数据库服务器因数据量增长而遇到的性能瓶颈问题。它通过提供数据库的高性能、高可用和高扩展性,帮助企业应对数据存储和业务规模迅速增长情况下的数据瓶颈问题。
实现数据库中间件功能: MyCat 作为一个数据库中间件,实现了对多种数据库(如 MySQL、Oracle、SQL Server 等)的透明接入和整合。它提供了统一的 SQL 接口,使得应用程序可以像操作单个数据库一样操作多个数据库。
支持复杂的查询和事务: MyCat 支持事务、ACID,并可以替代 MySQL 的加强版数据库。它通过解决跨节点 Join 处理技术,支持复杂的查询和事务,这对于需要强一致性和事务支持的企业级应用尤为重要。

5、MyCat 架构设计图

MyCat 架构组件说明:
客户端:
应用程序通过标准的 MySQL 协议连接到 MyCat 服务器。
MyCat Server:
接收客户端请求,并根据配置的分片规则将请求分发到后端的 MySQL 实例。
MySQL 实例:
后端的 MySQL 数据库实例,负责处理 MyCat 分发的请求。
MyCat 聚合:
负责收集从多个 MySQL 实例返回的结果集,并进行必要的聚合操作,如排序、合并等。
通信协议模块:
负责底层的收发数据和线程回调处理工作,采用 MySQL 协议与客户端和后端数据库通信。
路由解析模块:
对传入的 SQL 语句进行语法解析,确定路由规则,并将 SQL 分发到正确的数据节点。
结果集处理模块:
对跨分片的查询结果进行汇聚、排序、截取等处理。
数据库连接池:
管理后端数据库的连接池,减少每次建立数据库连接的开销。
监控管理模块:
对 MyCat 的连接、内存等资源进行监控和管理。
6、MyCat 工作流程图

MyCat 工作流程说明:
客户端:
客户端向 MyCat 服务器发送 SQL 请求。
MyCat Server:
MyCat 服务器接收到客户端的请求。
路由解析模块:
MyCat 服务器中的路由解析模块解析 SQL 语句,确定需要访问的数据节点。
后端数据库实例:
根据路由解析结果,MyCat 将请求分发到一个或多个后端数据库实例。
数据节点:
后端数据库实例执行 SQL 语句,这些实例可以是 MySQL、Oracle 等数据库。
结果集处理模块:
数据节点将执行结果返回给 MyCat 的结果集处理模块。
聚合结果:
结果集处理模块对来自不同数据节点的结果进行聚合处理,如排序、合并等。
发送响应:
MyCat 服务器将聚合后的结果发送回客户端。
7、架构与工作原理
MyCat 实现了 MySQL 协议的服务器,前端可以使用 MySQL 客户端工具访问,后端通过 MySQL 原生协议或 JDBC 协议与多种数据库通信。
它通过拦截 SQL 语句,进行分片分析、路由分析、读写分离分析等操作,然后将 SQL 发往真实数据库,并将结果返回给用户。
MyCat 采用分布式架构,支持基于 ZooKeeper 的主从切换和集群化管理,能够实现在线升级、扩容和智能优化。
7、产品架构
计算节点(Mycat)和存储节点(MySQL)组合架构
一般来说,Mycat2 使用数据库(接收 sql 的服务器)作为存储节点进行读写,当然未来也支持直接以自定义接口读写数据。特别地,暂时 Mycat2 没有实现系统表,所以查询系统表的 sql 需要转发到特殊的节点处理后返回到客户端。

7.1 参考技术栈
网络层:NIO Netty Vertx
数据库与其客户端:开源数据库通信协议 MySQL,闭源数据库与其客户端 JDBC
单机执行器与分布式执行器:火山模型,Push 模型
查询优化器:Apache Calcite,
查询编译器: Apache Calcite,Mycat 1.6
执行器:Ling4j,RxJava


7.2 1.21 后,移除 zookeeper

原型库直接作为配置中心,把使用物理库与逻辑库相同表结构实现 show 语句的支持,另外建立 mycat 库用于存储 mycat 的特有配置信息
Mycat 本身使用三个命令实现对本地文件配置,运行时配置,原型库文件配置进行加载和存储,可以自行实现脚本
1.执行对多个 Mycat 对原型库读取数据
2.把本地的配置写进原型库
7.3 多实例 Mycat 架构(1.21 前)

通过 Haproxy(Nginx)负载均衡

keeplive 高可用

脚本(bash,k8s,docker 等)高可用

通过 Haproxy(Nginx)负载均衡,keeplive 高可用

logback 传输日志到 kafka

Prometheus 定时采集 Mycat Prometheus 的信息并存储起来,Grafana 通过查询 Prometheus 得到统计信息并可视化

JMX 监控

业务热更新架构,用于切换 Mycat

上述指向的 Mycat 并不一定是 Mycat,而是 Mycat 所在的方向
8、使用限制
8.1 网络协议
一般来说仅内网使用,没有实现加密通信协议,连通外网有安全问题
没有后端数据库之间的数据同步服务
目标是兼容 MySQL7/8 服务器,也一定程度兼容 Mariadb,支持 Mariadb 客户端的批量插入特性
网络通信协议一定支持 native_password 验证,其他验证方式会自动切换到验证插件
支持超过 16mb 的报文
不支持压缩协议
不支持加密协议通信
8.2 事务特性
支持强一致性(不跨库)分布式事务
支持保存点(savepoint,v1.21-2021-11-10)
支持多语句
8.3 数值类型
mycat2 对于单分片 sql 没有限制,而对于跨实例的 sql 使用有符号类型处理,可以尝试在 mycat 中把建表语句的字段类型改成 decimal 避开这个问题
8.4 DDL 语句
不支持修改拆分键
支持物理库的视图视为普通表来使用
仅普通表支持外键
8.4 DELETE 语句
不支持涉及分布式运算的子查询。
不支持多表 delete。
8.5 UPDATE 语句
不支持涉及分布式运算的子查询。
不支持多表 update。
8.6 SELECT 语句
对于 for update 语句会把 sql 中出现的表都加锁。
具体是行锁还是表锁要看 sql 语句。
不支持 SELECT INTO OUTFILE。
8.7 SET 语句
支持 SET SESSION 级别的变量,但是不能被预处理语句引用变量,只有 autocommit 变量具有正确语义
不支持 SET GLOBAL 级别的变量
不支持 SET USER 级别的变量
8.8 SHOW 语句
所有 SHOW 语句都视为兼容性 SQL 进行处理,发往 prototype 节点处理,所以不具备分布式语义
8.9 高级功能
不支持用户自定义数据类型(改代码), 自定义函数(改代码)
支持物理视图,但是不支持 Mycat 中的逻辑视图
不支持存储过程(改代码)
有限支持存储过程
不支持游标
不支持触发器
9、优势
高性能:基于 NIO 实现,有效管理线程,解决高并发问题。
易于扩展:分片规则丰富,支持插件化开发。
强大的监控功能:支持对 MyCat、数据库性能、JVM 内存、线程、操作系统等的监控。
安全性高:支持密码加密、服务降级、IP 白名单、SQL 黑名单及 SQL 注入攻击拦截。
10、应用场景
高可用性与读写分离:利用 MyCat 实现 MySQL 的读写分离和自动故障切换,保证系统持续提供服务。
大表分片与集群计算:对超大表进行水平分表,分散数据存储和计算负载。
数据库路由与整合:作为数据库路由器,整合多种数据源,简化应用程序的数据库访问。
版权声明: 本文为 InfoQ 作者【肖哥弹架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/321bc3fc12171ab0bee4af96b】。文章转载请联系作者。
评论