在历经八个月的紧张开发与精心打磨之后,Sharding-Sphere社区为程序员献礼,将Sharding-Sphere 3.0.0正式版于10月24日程序员节发布。在3.0.0发布之际,写下此文,与大家共同回顾这段充满纪念的时光,分享我们的前进历程。

前序

关注开源圈的同学可能知道,Sharding-Sphere的前身是Sharding-JDBC。

起源

Sharding-JDBC是一套扩展于Java JDBC层的分库分表中间件,最初起源于当当的内部应用框架ddframe中的数据库访问层组件。由于分库分表需求的相对普遍,并且具备独特的生命力与关注度,因此将其抽离成为独立的项目,命名为Sharding-JDBC,并于2016年初开源。

Sharding-JDBC的最初目标是透明化分库分表所带来的复杂度,包括数据源的管理、根据业务进行的SQL改写等。作为使用Java语言开发的ddframe框架中的一部分,Sharding-JDBC顺其自然的选择了JDBC作为其分库分表扩展点的接入端。正如其名称Sharding-JDBC所昭示,它是在JDBC层进行Sharding(分库分表)的产品。

核心功能完善

Sharding-JDBC在其后的一年中有条不紊的发布了1.x的6个大版本更新,分别是:

  1. 奠定了SQL解析、请求路由、SQL改写、SQL执行和结果归并的分库分表的核心模型的1.0.x
  2. 原生支持Spring和行表达式的1.1.x
  3. 最大努力送达型柔性事务的1.2.x
  4. 读写分离的1.3.x
  5. 分布式主键的1.4.x
  6. 全新SQL解析引擎的1.5.x

分布式治理

在分库分表功能逐渐成熟之后,在2017年,Sharding-JDBC进入了2.x时代。2.x主要实现的功能是数据库治理,它可以通过注册中心提供对配置的集中化和动态化,以及对数据库和应用进行禁用和熔断。在此基础上,还增加了面向OpenTracing协议的链路追踪能力,并且达成了与国内优秀的APM产品Apache SkyWalking(https://github.com/apache/incubator-skywalking)的合作协议,将Sharding-JDBC的追踪数据对接入SkyWalking,并让SkyWalking将采用Sharding-JDBC作为其存储引擎成为可选项。

至此,分库分表、分布式事务和数据库治理都有了简单的雏形。

发展

随着云原生的普及,应用上云和对异构语言的无差别支持渐渐成为当今主流。仅支持Java的Sharding-JDBC已经无法满足云原生的全部需要,在业界一直争论不休的在客户端(JDBC或其他语言客户端)还是服务端(Proxy)进行分片的优劣,也未有定论。

改名、之后再踏征途

2018年春节前夕,随着核心开发人员的加盟,京东数科(当时还叫京东金融)加入了Sharding-JDBC的开发工作中,并将其定位为面向云化的数据库中间件。在客户端进行分库分表的Sharding-JDBC,虽然可以作为轻量级微服务框架灵活应用,但却没有作为云接入端进行统一管控的能力。因此,一个Proxy接入端呼之欲出。

Sharding-JDBC这个名字在过去的两年中获得了大量的积累,已经具备一定的辨识度,开发团队并不希望完全放弃掉这个名字。因此,最初将新的代理端产品命名为Sharding-JDBC-Server,而将原有的Sharding-JDBC改名为Sharding-JDBC-Driver。

经过了反复的权衡,我们发起了社区投票。最终决定保留Sharding这个关键词,将项目的名称正式改为Sharding-Sphere,意为分片生态圈。无论是分布式事务还是多数据库的治理,其本源都是分片;若采用单一的无分片数据库,后续功能都将无需存在。分片生态圈由根据不同的接入端,由3个子项目组成,它们是基于JDBC客户端接入的Sharding-JDBC(即原有项目)、基于代理端接入的Sharding-Proxy(今年的重点更新)、以及基于Sidecar模式接入的Sharding-Sidecar(明年的产品规划)。

3.0.0于此刻正式起航,主要目标是将Sharding-JDBC的能力完全移植入Sharding-Proxy,使其具备支持异构语言的能力。虽然分片的核心逻辑并未变化,但相比于Sharding-JDBC,Sharding-Proxy有两个难点是需要攻破的。

第一个难点是数据库协议的实现。将代理端伪装成为一个数据库,能够将接入的成本降至最低。Sharding-Proxy选择最常用的MySQL协议做为首先支持的数据库协议,并完整的实现了所有的应用程序运行时所需的协议包(如:COM_QUERY、COM_STMT_PREPARE、COM_STMT_EXECUTE)。目前对于管理端使用的一些协议包还未全部实现。

第二个难点是通信框架。JDBC层的通信是由各个数据库驱动提供商通过BIO的方式实现的,虽然吞吐量欠佳,但却容易实现。代理端为了更高的吞吐量,需要采用NIO的方式。Sharding-Proxy采用Netty作为通信框架,在接入层前端实现了完全无锁的异步通信。目前接入端连接后端数据库时,仍然采用JDBC的方式,未来会将其完全改为Netty异步通信的方式,进一步提升吞吐量,达成前后端完全无锁通信的目标。以下是Sharding-Proxy的架构图:


 
在2018年5月,基本可用的Sharding-Proxy随着Sharding-Sphere 3.0.0.M1发布。

同时,由于多家公司共同参与开发,Sharding-Sphere决定成立社区,将著作权完全归属至Sharding-Sphere社区,并成立了项目管理委员会(PMC),并且也完善了贡献者和提交者的晋升制度。

随着新的里程碑版本,Sharding-Sphere申请了全新的域名,并重新制作官网,重装发布。

扩大范围、加强合作

Sharding-Sphere的更名,不仅仅是接入端的增强。作为分片生态圈,更完善的分布式事务和数据库治理,也纳入了项目范围。

Sharding-Sphere将原有的分库分表功能更名为数据分片,内容包扩核心流程、读写分离和分布式主键。Sharding-Sphere的核心流程模块的几个重点部分可以通过一张图帮助用户理解,下面分别是路由引擎、改写引擎、执行引擎和归并引擎的剖析图:

Sharding-Sphere对分布式事务进行了重新的设计和定位。废弃掉原有的最大努力送达型柔性事务,取而代之的是采取刚柔并济的实现方案:同时支持XA的强一致事务,以及基于Saga的最终一致性事务,基于消息的最终一致性事务也在规划中。

分布式事务模块将定位从自研转向整合,即整合现有的成熟事务方案,为本地事务、XA事务和柔性事务提供统一的分布式事务接口,并尽量弥补各个方案对数据库层面的缺失。分布式事务模块提供一套SPI事务处理接口,能够无缝对接分布式事务的各个实现方案。分布式事务模块的架构图如下:

Sharding-Sphere经过比较分析,选择采用Apache ServiceComb的分布式事务解决方案来实现柔性事务, 通过在ServiceComb Saga执行引擎基础上扩展sql执行模块,实现了基于分布式Saga的事务执行和回滚功能。

分布式事务模块将于3.1.0的版本发布,目前仍处于紧张的开发阶段。

在数据库治理方面,Sharding-Sphere全数保留了之前的功能,并提供了全新的APM链路追踪数据,可以通过SkyWalking更直观的观测Sharding-Sphere。但目前仍未包括数据库弹性扩缩功能,该部分功能将于明年规划。

在高速发展的同时,Sharding-Sphere迎来了新的合作伙伴——翼支付。翼支付成立了创新中心部门,并投入开发资源加入到了Sharding-Sphere的开发团队。这使得Sharding-Sphere的开源社区更加多元化和健康成长。Sharding-Sphere属于社区而非公司,因此欢迎有兴趣参与开发的公司一起打造更加多元化的社区和更加完善的项目。

上线、然后发布

在Sharding-Sphere的旗下产品Sharding-Proxy逐渐成熟的同时,京东数科当仁不让的成为了第一个吃螃蟹的人。京东数科将部分核心业务系统通过小流量 -> 大流量 –> 全流量的流程切换到Sharding-Proxy,目前Sharding-Proxy在生产环境中已经管理并运行着万级别数据节点。

在经受考验之后,随之而来的Sharding-Sphere 3.0.0.M2、3.0.0.M3和3.0.0.M4相继发布。在经历了大量的性能调优和功能完善之后,终于在10月24日的程序员节发布3.0.0稳定版。在经历了京东数科严酷的生产环境验证后,相信Sharding-Sphere可以成为架构师们进行技术选型时的其中一个参考。

面向未来

Sharding-Sphere 3.0.0的发布并非终点,而是新的起点。3.1.0已经在同步开发,也将于不久的将来面世,提供更加优化的分布式事务解决方案。计划于明年开启的4.0.0对Sidecar模式的接入端以及自动化的弹性伸缩功能也完成了初步规划。Sharding-Sphere的线路规划如下图:

大事记

回顾心路历程,Sharding-Sphere立足于当下,着眼于未来:

2018.2

  • Sharding-Sphere团队升级组建,并开始着手Sharding-Proxy开发。

2018.5

  • Sharding-JDBC正式更名为Sharding-Sphere, 同时上线新官网。这预示着它新时代的到来。
  • Sharding-Sphere著作版权完全归属社区shardingsphere.io,并继续使用Apache 2.0协议。
  • Sharding-Sphere 3.0.0.M1发布,Sharding-Proxy正式上线。

2018.6

  • Sharding-Sphere与Apache ServiceComb建立合作伙伴关系,并开始分布式事务的全面规划。
  • Sharding-Sphere与中国电信旗下翼支付建立合作伙伴关系,共同打造Sharding-Sphere新未来。

2018.8

  • Sharding-Proxy上线京东数科生产环境,并经受住了线上大规模生产数据的考验。
  • Sharding-Sphere 3.0.0.M2发布,数据库治理模块升级改造,提供更稳定功能。

2018.9

  • Sharding-Sphere 3.0.0.M3发布,提供对XA分布式事务的支持。
  • Sharding-Sphere 3.0.0.M4发布, 改造自动化执行引擎,支持多逻辑数据库切换,增强链路追踪。

2018.10

  • Sharding-Sphere 3.0.0正式版发布。

如何获取

Sharding-JDBC

<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>3.0.0</version>

Sharding-Proxy

docker pull shardingsphere/sharding-proxy

源码

https://github.com/sharding-sphere/sharding-sphere

https://gitee.com/sharding-sphere/sharding-sphere

官网

http://shardingsphere.io

 

Comments are closed.