Mysql分库分表中间件 技术选型对比

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: Mysql分库分表中间件MyCAT 和 DBLE的技术选型分析

1.1.代理层模式
通过代理层的数据库中间件,将自己伪装成一个数据库,接受业务端的链接。然后负载业务端的请求,解析或者转发到真正的数据库中。
目前业内已经开源了很多的MySQL中间件产品,例如Atlas、DBProxy、MyCAT、OneProxy、DBLE 、DRDS、Vitess、Kingshard、mysql router、MaxScale、58 Oceanus、ArkProxy、Ctrip DAL、Tsharding、Youtube vitess、网易DDB、Heisenberg、proxysql、Mango、DDAL、Datahekr、MTAtlas、MTDDL、Zebra、Cobar等等。
每个中间件都有自己的特点,个别不太成熟的可能会存在一些Bug,选用之前要做好相关的调研与测试工作,上线使用一定要保证自己能完全掌握。如果要完全贴合自身业务,并且掌控得较好的还是要自行开发。
选型重点考虑因素包括:知名度、功能性、稳定性、可扩展性、社区活跃度。这里只重点介绍MyCAT 和 DBLE。
1.2.MyCat介绍
社区爱好者在阿里cobar基础上进行二次开发,解决了cobar的一些问题,且加入了新的功能。
1.功能
1)遵守mysql原生协议
2)基于心跳的自动故障切换
3)支持读写分离,支持mysql主从
4)支持sum、count、max等聚合,支持跨库分页
5)支持服务降级
6)安全,IP白名单、sql注入攻击拦截、prepare预编译
2.原理
拦截:分片分析、路由分析、读写分离分析、缓存分析

1.3.DBLE介绍
dble是上海爱可生信息技术股份有限公司基于mysql的高可扩展性的分布式中间件,存在以下几个优势特性:
 dble 是基于开源项目MyCat的,专注于MySQL是一个更好的选择。 所以取消了对其他数据库的支持,对兼容性,复杂查询和分布式事务的行为进行了深入的改进/优化。

数据水平拆分 随着业务的发展,您可以使用dble来替换原始的单个MySQL实例。
兼容Mysql 与MySQL协议兼容,在大多数情况下,您可以用它替换MySQL来为你的应用程序提供新的存储,而无需更改任何代码。
高可用性 dble服务器可以用作集群,业务不会受到单节点故障的影响。
SQL支持 支持SQL 92标准和MySQL方言。我们支持复杂的SQL查询,如group by,order by,distinct,join,union,sub-query等等。
复杂查询优化 优化复杂查询,包括但不限于全局表连接分片表,ER关系表,子查询,简化选择项等。
分布式事务支持 使用两阶段提交的分布式事务。您可以为了性能选择普通模式或者为了数据安全采用XA模式。当然,XA模式依赖于MySQL-5.7的XA Transaction,MySQL节点的高可用性和数据的可靠性。
 
1.3.1.缺陷修复
1)由于对堆外内存的使用不当,导致高并发操作时对同一片内存可能发生“double free",从而造成JVM异常,服务崩溃。 #4
2)XA事务漏洞:包乱序导致客户端崩溃 #21
3)where关键字写错时,会忽视后面的where条件,会得到错误的结果,比如select * from customer wher id=1;#126
4)对于一些隐式分布式事务,例如insert into table values(节点1),(节点2);原生mycat直接下发,这样当某个节点错误时,会造成该SQL执行了一部分
5)权限黑名单针对同一条sql只在第一次生效。#92
6)聚合/排序的支持度非常有限,而且在很多场景下还存在结果不正确、执行异常等问题 #43,#31,#44
7)针对between A and B语法,hash拆分算法计算出来的范围有误#23
8)开启全局表一致性检查时,对全局表的处理存在诸多问题,例如不能alter table、insert...on duplicate...时不更新时间戳、update...in ()报错等#24, #25,#26 ,#5
9)多值插入时,全局序列生成重复值 #1
10)ER表在一个事务内被隔离,不能正确插入子表数据#13
11)sharding-join结果集不正确#17
 
1.3.2.实现改进
1) 对某些标准SQL语法支持不够好的方面作了改进,例如对create table if not exists...、alter table add/drop [primary] key...等语法的支持
2) 禁止普通用户连接管理端口进行管理操作,增强安全性 #56
3) 对全局序列做了如下改进
   删去无工程意义的本地文件方式
   改进数据库方式、ZK方式,使获取的序列号更加准确
   改进时间戳方式和ZK ID生成器方式,消除并发低时的数据分布倾斜问题
  移除自定义语法 限制:全局序列值不能显式指定
原来:insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);
现在1:insert into table1(name) values(‘test’);
现在2:insert into table1 values(‘test’);
注意时间戳方式需要该字段是bigint
4) 改进对ER表的支持,智能处理连接隔离,解决同一事务内不可以同时写入父子表的问题,并优化ER表的执行计划
5) 系统通过智能判断,对于一些没有显式配置但实际符合ER条件的表视作ER表同样处理
6)在中间件内进行智能解析与判断,使用正确的schema,替换有缺陷的checkSQLschema 参数
7)conf/index_to_charset.properties的内容固化到代码 。
 
1.3.3.功能增强
1) 提供了更强大的查询解析树,取代ShareJoin,使跨节点的语法支持度更广(join,union,subquery),执行效率更高,同时聚合/排序也有了较大改进
2) 提供科学的元数据管理机制,更好的支持show、desc等管理命令,支持不指定columns的insert语句 #7
3) 元数据自动检查
   启动时对元数据进行一致性检查
   配置定时任务,对元数据进行一致性检查
   提供更详实的执行计划,更准确的反映SQL语句的执行过程
4) set 系统变量语句的改进
5) set charset/names 语句的支持
6) 分布式事务:XA实现方式的异常处理的改进
6) 大小写敏感支持
限制:需要依赖后端所有mysql结点的大小写敏感配置一致并且在mycat内正确配置。
7) 支持DUAL
 
1.3.4.功能裁减
1) 仅保留枚举、范围、HASH、日期等分片算法,对这几个算法进行了可用性的改进,使之更加贴合实际应用,项目需要时可以按需提供
2) 移除异构数据库支持
3) 禁止某些不支持的功能,这些功能客户端调用时不会报错,但结果并非用户想要的结果,例如大部分的set语句(2.17.08.1版以前)
4) 移除目前实现有问题的第一结点库内分表模式
5) 移除writeType参数,等效于原来writeType = 1
6) 移除handleDistributedTransactions 选项,直接支持分布式事务

1.4.推荐DBLE理由
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;
MyCat已经有几年没有更新了,近期有的升级,只是对有安全漏洞的第三方依赖包升级。
而DBLE更新一直非常活跃,而且有企业支持(上海爱可生信息技术股份有限公司)。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
算法 Java 数据库连接
【分库分表】基于mysql+shardingSphere的分库分表技术
【分库分表】基于mysql+shardingSphere的分库分表技术
17 0
|
1月前
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版操作报错之同步MySQL分库分表500张表报连接超时,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】分库分表
分库分表是一种数据库架构设计的方法,用于解决大规模数据存储和处理的问题。 分库分表可以简单理解为原来一个表存储数据现在改为通过多个数据库及多个表去存储,这就相当于原来一台服务器提供服务现在改成多台服务器组成集群共同提供服务。
57 8
|
1月前
|
存储 cobar 关系型数据库
MySQL分库分表
MySQL分库分表
60 1
|
1月前
|
SQL 监控 算法
Mysql系列-5.Mysql分库分表(下)
Mysql系列-5.Mysql分库分表
170 0
|
1月前
|
SQL 存储 关系型数据库
Mysql系列-5.Mysql分库分表(中)
Mysql系列-5.Mysql分库分表
47 0
|
1月前
|
存储 关系型数据库 MySQL
Mysql系列-5.Mysql分库分表(上)
Mysql系列-5.Mysql分库分表
72 0
|
1月前
|
存储 SQL 关系型数据库
MySQL分库分表
MySQL分库分表
51 0
|
1月前
|
关系型数据库 MySQL 数据库
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
|
1月前
|
关系型数据库 MySQL Java
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)