相信大家在网上抢购时遇到过网页无法正常访问的情况,一部分原因可能是数据库无法很好地应对不断增加的并发访问。如何有效地解决数据库现有的这些缺陷呢?数据分片是一个可选的方案。本篇文章将为大家解读由重庆大学和 SphereEx 实验室合作的、发表在 CCF A 类数据库顶级会议 ICDE 2022 上的论文《Apache ShardingSphere:A Holistic and Pluggable Platform for Data Sharding》。
01
问题背景
随着数据量的不断增加以及人们对数据需求的不断增长,需要数据库不仅能够管理大量数据,还能够支持高度并发的访问。设计一种能够应对这两种要求的数据库能够提高用户体验,减少类似网购时网页无法访问的情况出现。
目前来看,关系型数据库仍然是在线事务处理的主力,因为它们支持完整的事务。但是关系型数据库设计初期是针对单台机器的,数据量过大时往往可扩展性欠佳,而且不能很好地解决高并发的问题。尽管现在像 HBase 这种 NoSQL 数据库可以支持高并发请求,但是他们不太适合在线事务的处理,还可能会出现数据不一致的问题。所以很多人开始关注 NewSQL,New 就意味着是从零开始开发的数据库。虽然适合现在的应用场景,但它们还没有很好地接受社会的检验,而且 NewSQL 的使用和维护人员还需要额外地学习相关新技术。
那么在已有的数据库和应用程序之间插入一个数据分片中间件,来连接和管理众多已有的数据库,是不是可行呢?答案自然是肯定的。如下图 1 所示,数据分片中间件将用户查询分配到不同机器内的多个数据库中,分别执行查询后再将多个结果合并,最后返回到应用程序中,这有效地解决了单台机器的限制。对于开发人员来说,数据分片中间件是透明的,使用更为方便。这么看数据分片中间件十分友好且非常高效。
(图 1:数据分片示例)
设计一个好的数据分片中间件存在很大挑战。第一,在不同的场景下采用的底层数据库不同,这些数据库采用不同的数据库协议和 SQL 语句,在一个统一的框架下支持多种数据库并不简单。此外,有许多 SQL 语句类型(从简单的查询到聚合再到多表 join 等),对不同 SQL 语句的路由方法以及合并策略也不相同。第二,多个数据库之间协调事务比较困难,有时候单个事务类型可能不支持所有的场景。第三,数据分片中间件可能会遇到效率问题,因为转发请求、合并结果影响需要消耗一些时间。第四,数据管理员需要逐个配置分片规则,这对他们不是很友好。
Apache ShardingSphere 作为 Apache 第一个顶级开源的数据库分片项目,能够解决了上面提到的所有挑战。ShardingSphere 的主要目标就是要减少数据分片的影响,让开发人员像使用单个数据库一样使用分片数据库。它拥有以下几个显著的特点:
(1)功能完备。ShardingSphere 支持多种主流的关系型数据库(实际上,任何满足 SQL-92 标准的数据库都支持)。它设计并实现了一个完整的 SQL 引擎,因此任何类型的 SQL 都能够准确的被路由。此外,其提供了三种类型的分布式事务和其他丰富的功能。据作者所知,ShardingSphere 是第一个将数据分片、强一致性事务和柔性事务结合在一起的系统。
(2)高效。除了代理模式,ShardingSphere 还提供了 JDBC 的接入方式,这在大部分场景下能够大幅提升效率。此外,ShardingSphere 提出了两种执行模式,并提出了一种智能的策略来选择合适的执行模式和结果合并策略,这能够很好地平衡资源和效率。
(3)可插拔和可扩展。ShardingSphere 基于 SPI(Service Provider Interface, 一种 Java 语言中的服务发现机制)和多种设计模式设计的。因此,更多类型的数据库、功能、分片算法都能够非常方便地加入。此外,所有现有的功能都能够移除或者自由组合。
(4)用户友好。ShardingSphere 支持几乎所有的 SQL 语句,同时隐藏了分布式事务的细节。因此,应用开发人员能够在 ShardingSphere 的帮助下像使用单机版数据库一样使用分布式事务和分片后的数据库集群。ShardingSphere 还提出了一种新的 DistSQL 和 AutoTable 策略,能够帮助数据库管理员更方便地配置分片策略。
当前(截止到论文撰写时期)有 170 多个公司宣布在使用 ShardingSphere。本文基于 2021 年 11 月 10 日发布的 ShardingSphere 5.0.0 版本。
02
系统框架和数据流
如图 2 所示,ShardingSphere 一共分为五个模块,1&#