分库分表推荐Spring Cloud Alibaba+Seata+Shardingsphere
分库分表是高并发系统中从可扩展性全面保障业务稳定性的最佳手段之一,当然它也有很多成熟的开源解决方案,比如Apache-Shardingsphere、Mycat和Zebra等,本小节会简单的分析下分库分表相关的生态领域。
ShardingSphere
Apache-Shardingsphere框架整体发展经历了很多阶段,①当当网内部数据库中间件 ②Sharding-JDBC ③Sharding-Sphere ④Apache ShardingSphere。Apache-Shardingsphere拥抱开源社区并开放源码和持续技术建设,目前star 13.1k fork 4.4k,是一款非常优秀开源分布式数据库中间件。
第一阶段:它是当当网内部应用框架ddframe中并从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,并实现透明化数据库分库分表访问。Sharding-JDBC是继dubbox和elastic-job之后,ddframe系列开源的第3个项目。
第二阶段:在众多开源的分布式数据库中间件中,当当网的开源组件Sharding-JDBC是一个非常优秀的技术解决方案,一直以来,Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
第三阶段:当应用场景多元化之后,仅通过JDBC 层的嵌入,难于应对更加复杂的业务场景,比如:Java 之外的异构语言、数据库管理端命令行和Consul UI等等。但是基于Proxy去模拟数据库的中间代理层的方案则更加容易支撑相应的应用场景。由于Proxy版本的出现,使得Sharding-JDBC这个名字已经不再适合,但是开源社区无法放弃过去两年多Sharding-JDBC的影响力所带来的用户沉淀。因此,还是保留了“Sharding”这个关键词。而且对于分布式数据库中间件来说,无论是分库分表、柔性事务还是数据治理,“Sharding”是这一切的起源。于是官方的开源社区将原有的Sharding-JDBC与新开发的 Sharding-Proxy 以及正在孵化中的Sharding-Sidecar一起组成了一个生态圈,将其命名为Sharding-Sphere,即 Sharding 生态圈。
第四阶段;2018年11月10日,开源分布式数据库中间件生态圈Sharding-Sphere正式进入Apache基金会孵化器,并再次更名为Apache ShardingSphere。2019年4月23日,发布4.0.0-RC1,它是ShardingSphere进入Apache基金会后第一个Release Version。2020年4月16日,Apache基金会董事会宣布Apache ShardingSphere成功晋升为Apache顶级项目。
Mycat
Mycat 是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 mysql 协议的Server,前端用户可以把它看作是一个数据库代理,用MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生(Native)协议与多个 MySQL服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信, 其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。Mycat发展到目前的版本,已经不是一个单纯的 MySQL代理了,它的后端可以支持 MySQL、SQL Server、 Oracle、DB2、PostgreSQL等主流数据库,也支持 MongoDB这种新型 NoSQL方式的存储,未来它也还会支持更多类型的存储数据库。而在最终用户看来,无论是那种存储方式,在Mycat里,都是一个传统的数据库表,支持标准的 SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度,在测试阶段,可以将一个表定义为任何一种 Mycat支持的存储方式,比如MySQL的 MyASIM表、内存表、或者MongoDB、LevelDB以及号称是世界上最快的内存数据库 MemSQL 上。试想一下,用户表存放在 MemSQL 上,大量读频率远超过写频率的数据如订单的快照数据存放于 InnoDB 中,一些日志数据存放于 MongoDB 中,而且还能把 Oracle 的表跟 MySQL 的表做关联查询,你是否有一种不能呼吸的感觉?而未来,还能通过 Mycat自动将一些计算分析后的数据植入到Hadoop中,并能用 Mycat+Storm/Spark Stream 引擎做大规模数据分析,看到这里,你大概明白了,Mycat是什么?Mycat就是 BigSQL,Big Data On SQL Database。
Mycat目前star 8.8k fork 3.8k,最新版本是1.6.7.6-release,社区活跃度非常高。
Zebra
Zebra是一个基于JDBC API协议上开发出的高可用、高性能的数据库访问层解决方案,是美团点评内部使用的数据库访问层中间件。具有以下的功能点:
配置集中管理,动态刷新;支持读写分离、分库分表;丰富的监控信息在CAT上展现;异步化数据库请求,多数据源支持。Zebra 简化了读写分离、分库分表的开发工作,使得业务方在分库分库、读写分离的情况下,依然可以像操作单个库那样去操作,屏蔽底层实现的复杂性,对业务透明。Zebra还提供了从读写分离到分库分表全生命周期的技术支持。Zebra提供的完善的监控体系帮助开发掌控数据库请求的整个链路,快速定位问题。
Zebra 目前star1.9k fork 583,最新版本是2.9.1,当然最后一次更新是2018年12月17日,社区活跃度不是很高,所以一般从技术选型的角度,优先推荐Apache-Shardingsphere或者Mycat。
对比以上三种分库分表解决方案
如下表,只是对比了Apache-Shardingsphere和Mycat,因为Zebra技术选型不是很多,在这里就不做横向对比。
Apache-Shardingsphere | Mycat | |
---|---|---|
工作层面 | JDBC协议 | Mysql协议/JDBC协议 |
运行方式 | Jar包或者代理客户端 | 独立服务以及代理客户端独立部署 |
开发方式 | 代码/配置改动 | 连接地址(数据源) |
运维方式 | 无 | 管理独立服务,运维成本高 |
性能 | 高并发、高性能 | 独立服务+网络开销,存在性能损耗风险。 |
功能范围 | 协议范围 | 分布式事务和数据迁移等 |
适用操作 | OLTP | OLTP+OLAP |
支持数据库 | 基于JDBC协议的数据库 | Mysql和其他支持JDBC协议的数据库 |
分布式事务 | 支持XA和Seata AT模式 | 支持弱XA,支持XA分布式事务(1.6.5) |
是否支持自定义sharding路由 | 支持 | 支持 |
最大支持sharding路由维度 | 2 | 1 |
支持语言 | Java | 支持JDBC协议的开发语言 |
动态调整数据源 | 研发/或者第三方插件支持(Mybatis-Plus) | 添加新组合配置并重启Mycat |
为什么选择ShardingSphere
除了上述技术优势以外,主要还是ShardingSphere偏主流,比如它支持Seata,后续还会支持Nacos等,这些都和Spring Cloud Alibaba契合度非常高的,所以在选择一个技术之前,不要只看它的技术有多牛,要看是否是主流的技术趋势。
公众号初衷
知识输出是笔者的初衷,借助知识输出,能够认识更多的牛人,能够和牛人沟通,也是自己技术提升的一个机会。