Sharding-JDBC 是什么?
Sharding-JDBC 是一个开源的分布式数据库中间件。它定位为轻量级 java 框架,由客户端直连数据库,以 jar 包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA 无需改变原有的运维方式,可理解为增强版的 JDBC 驱动,旧代码迁移成本几乎为零。
Sharding-JDBC 完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。架构图如下:
左边部分是部署架构图,右边部分则是核心逻辑架构图。
从 2016 年开源至今,它已发布了 15 个版本,其中包含 5 个里程碑版本升级。在经历了整体架构的数次精炼以及稳定性打磨后,如今它已积累了足够的底蕴,相信可以成为开发者选择技术组件时的一个参考。
项目的开源地址:
https://github.com/dangdangdotcom/sharding-jdbc
Sharding-JDBC 的定位是什么?
Sharding-JDBC 目前精力主要集中在透明化分布式数据库这部分,经常有人问 Sharding-JDBC 和基于 Proxy 的数据库中间层有什么区别?和 NewSQL 数据库又有什么区别?
尽管部署架构不同,但当前功能上的差异确实不明显。不过结构的不同终会将它们推向不同的方向。Sharding-JDBC 与业务代码部署在一起的架构,非常适合作为微服务的数据访问层基础开发组件。Proxy 和 NewSQL 是面向运维的数据库,而 Sharding-JDBC 的定位与当当一并开源的 DubboX、Elastic-Job 一样,是面向开发的微服务基础类库,它始终以云原生的基础开发套件为目标。
Sharding-JDBC 1.5.0 版本有什么关键更新?
Sharding-JDBC 1.5.0 版本是针对 SQL 兼容性的行全面提升。它主要包含自研 SQL 解析引擎、多数据库兼容、SQL 改写优化和结果归并优化这 4 个方面主要的提升:
- 自研 SQL 解析引擎
SQL 解析作为分库分表类产品的核心,从 1.5.0 版本开始,Sharding-JDBC 采用完全自研的 SQL 解析引擎。由于目的不同,它并不需要将 SQL 转为 AST 语法树,也无需通过 Visitor 的方式二次遍历。它采用对 SQL“半理解”的方式,仅提炼分片需要关注的上下文,因此 SQL 解析的性能和容错性得到了进一步的提高。
- 多数据库兼容
Sharding-JDBC 之前仅可以支持 MySQL。1.5.0 版本开始对 Oracle、SQLServer 和 PostgreSQL 的全面支持,包括各种 SQL 方言以及分页等关键语法的兼容。由于 Oracle 与 SQLServer 的分页需要子查询支持,因此 Sharding-JDBC 也最大限度的支持了分页、COUNT 等子查询。
- SQL 改写优化
在 Sharding-JDBC 1.5.0 版本,SQL 改写进行了调整和大量优化。1.4.x 及之前版本,SQL 改写是在 SQL 路由之前完成的,在 1.5.x 中调整为 SQL 路由之后,因为 SQL 改写可以根据路由至单库表还是多库表而进行进一步优化。
- 结果归并优化
Sharding-JDBC 1.5.0 重写了结果归并模块,并且进一步的优化了分组归并。目前支持的结果归并从功能上分为遍历、排序、分组和分页 4 种类型,它们是组合而非互斥的关系。从结构划分,可分为流式归并、内存归并和装饰者归并。流式归并和内存归并是互斥的,装饰者归并可以在流式归并和内存归并之上做进一步的处理。流式归并是将数据游标与结果集的游标保持一致,顺序的从结果集中一条条的获取正确的数据。内存归并则是需要将结果集的所有数据都遍历并存储在内存中,再通过内存归并后,将内存中的数据伪装成结果集返回。
结果归并模块重写后的类图如下:
Sharding 1.5.0 版本与旧版本兼容么?
新里程碑版本做了如此大的内核修改和提升,那么从旧版本升级至新版本有哪些地方需要修改?相信很多老用户有这样的疑问。答案是:仅需要微小的改动。
Sharding-JDBC 由于扩展自 JDBC 协议,因此无迁移成本。但为了使用更加便利,在分布式主键的配置部分做了细微的调整。
Sharding-JDBC 下一步要做什么?
Sharding-JDBC 1.6.x 的目标是配置动态化和数据库治理,通过将配置存入注册中心,达到治理分库分表 + 读写分离的数据库的目的。在应用端进行数据库发现、流量疏导、故障转移、熔断等功能,向治理服务一样治理数据库。
Sharding-JDBC 将作为面向 OLTP 在线业务的分片化的数据库治理微服务基础组件积极的发展下去。
对于新手来说使用 Sharding-JDBC 很难么?
由于完全兼容 JDBC 协议,除了掌握了配置,以及了解 SQL 的不支持列表,目前并未其他使用成本。只需在 pom.xml 中引入 Elastic-Job 的 maven 坐标,并且参照在 github 上的 example 编写几行代码即可。
最后,请允许我再重复一次,** 项目的开源地址,** 欢迎使用、吐槽和提出建议。
评论