经过 1.5 个月的开发,Apache ShardingSphere 5.3.0 已经发布。 我们的社区合并了来自世界各地贡献者的 687 个 PR。
新版本在特性、性能、测试、文档、示例等方面都得到了改进。
5.3.0 版本带来了以下亮点
- 支持 CipherColumn 的模糊查询。
- 支持数据源级别的异构数据库。
- 支持数据一致性检查的断点续传。
- 在跨多个分片执行 DML 语句时自动启动分布式事务。
此外,5.3.0 版本还带来了以下调整
- 移除 Spring 配置。
- 系统地重构 DistSQL 语法。
- 重构 ShardingSphere-Proxy 的配置格式。
Apache ShardingSphere 发布的 4 个亮点
1. 支持 CipherColumn 的模糊查询
在之前的版本中,ShardingSphere 的加密特性不支持在 SQL 中使用 LIKE
运算符。
一段时间以来,用户强烈要求将 LIKE
运算符添加到加密特性中。通常,加密字段主要为字符串类型,并且字符串执行 LIKE
是一种常见的做法。
为了最大限度地减少访问加密特性的摩擦,我们的社区已经启动了关于加密 LIKE
实现的讨论。
从那时起,我们收到了很多反馈。
一些社区成员甚至在充分研究了传统解决方案后,贡献了他们支持模糊查询的原始加密算法实现。
社区成员贡献的 [单字符摘要算法] 在 ShardingSphere 加密算法 SPI 中实现为 CHAR_DIGEST_LIKE
。
2. 支持数据源级别的异构数据库
ShardingSphere 支持数据库网关,但其异构能力在之前的版本中仅限于逻辑数据库。 这意味着逻辑数据库下的所有数据源必须是相同数据库类型。
这个新版本在内核级别支持数据源级别的异构数据库。 这意味着逻辑数据库下的数据源可以是不同的数据库类型,允许您使用各种数据库来存储数据。
结合 ShardingSphere 的 SQL 方言转换能力,这个新特性显著增强了 ShardingSphere 的异构数据网关能力。
3. 数据迁移:支持数据一致性检查的断点续传
数据一致性检查发生在数据迁移的后期阶段。
之前,数据一致性检查由 DistSQL (分布式 SQL) 触发和停止。 如果迁移了大量数据并且数据一致性检查因任何原因停止,则必须重新启动检查 - 这是次优的,并且会影响用户体验。
ShardingSphere 5.3.0 现在支持检查点存储,这意味着可以从检查点恢复数据一致性检查。
例如,如果在数据迁移期间正在验证数据,并且用户由于某种原因停止了验证,则验证进度 (finished_percentage)
为 5%,那么
mysql> STOP MIGRATION CHECK 'j0101395cd93b2cfc189f29958b8a0342e882';
Query OK, 0 rows affected (0.12 sec)
mysql> SHOW MIGRATION CHECK STATUS 'j0101395cd93b2cfc189f29958b8a0342e882';
+--------+--------+---------------------+-------------------+-------------------------+-------------------------+------------------+---------------+
| tables | result | finished_percentage | remaining_seconds | check_begin_time | check_end_time | duration_seconds | error_message |
+--------+--------+---------------------+-------------------+-------------------------+-------------------------+------------------+---------------+
| sbtest | false | 5 | 324 | 2022-11-10 19:27:15.919 | 2022-11-10 19:27:35.358 | 19 | |
+--------+--------+---------------------+-------------------+-------------------------+-------------------------+------------------+---------------+
1 row in set (0.02 sec)
在这种情况下,用户重新启动数据验证。 但是这项工作不必从头开始。 验证进度 (finished_percentage)
保持在 5%。
mysql> START MIGRATION CHECK 'j0101395cd93b2cfc189f29958b8a0342e882';
Query OK, 0 rows affected (0.35 sec)
mysql> SHOW MIGRATION CHECK STATUS 'j0101395cd93b2cfc189f29958b8a0342e882';
+--------+--------+---------------------+-------------------+-------------------------+----------------+------------------+---------------+
| tables | result | finished_percentage | remaining_seconds | check_begin_time | check_end_time | duration_seconds | error_message |
+--------+--------+---------------------+-------------------+-------------------------+----------------+------------------+---------------+
| sbtest | false | 5 | 20 | 2022-11-10 19:28:49.422 | | 1 | |
+--------+--------+---------------------+-------------------+-------------------------+----------------+------------------+---------------+
1 row in set (0.02 sec)
限制:此新特性不适用于 CRC32_MATCH
算法,因为该算法一次计算所有数据。
4. 在跨多个分片执行 DML 语句时自动启动分布式事务
以前,即使配置了 XA 和其他分布式事务,如果用户没有手动启用事务,ShardingSphere 也无法保证路由到多个分片的 DML 语句的原子性。
以下面的 SQL 为例
insert into account(id, balance, transaction_id) values
(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),
(5, 5, 5),(6, 6, 6),(7, 7, 7),(8, 8, 8);
当根据 id mod 2
对此 SQL 进行分片时,ShardingSphere 内核层会自动将其拆分为以下两个 SQL 并将其路由到不同的分片以执行
insert into account(id, balance, transaction_id) values
(1, 1, 1),(3, 3, 3),(5, 5, 5),(7, 7, 7);
insert into account(id, balance, transaction_id) values
(2, 2, 2),(4, 4, 4),(6, 6, 6),(8, 8, 8);
如果用户没有手动启动事务,并且其中一个分片 SQL 执行失败,则无法保证原子性,因为成功的操作无法回滚。
ShardingSphere 5.3.0 在分布式事务方面进行了优化。 如果在 ShardingSphere 中配置了分布式事务,则在将 DML 语句路由到多个分片时可以自动启动它们。 这样,我们就可以确保执行 DML 语句时的原子性。
Apache ShardingSphere 的 3 项改进
1. 移除 Spring 配置
在较早的版本中,ShardingSphere-JDBC 以 DataSource 的形式提供服务。 如果您想在不修改 Spring/Spring Boot 项目中的代码的情况下引入 ShardingSphere-JDBC,则需要使用 ShardingSphere 提供的 Spring/Spring Boot Starter 等模块。
虽然 ShardingSphere 支持多种配置格式,但它也存在以下问题
- 当 API 更改时,需要调整许多配置文件,这是一项繁重的工作。
- 社区必须维护多个配置文件。
- Spring bean 的生命周期管理容易受到项目其他依赖项的影响,例如 PostProcessor 失败。
- Spring Boot Starter 和 Spring NameSpace 受 Spring 影响,它们的配置样式与 YAML 不同。
- Spring Boot Starter 和 Spring NameSpace 受 Spring 版本的影响。 当用户访问它们时,可能无法识别配置,并且可能会发生依赖冲突。 例如,Spring Boot 1.x 和 2.x 版本具有不同的配置样式。
ShardingSphere 5.1.2 首先支持以 JDBC Driver 的形式引入 ShardingSphere-JDBC。 这意味着应用程序只需要在访问 ShardingSphere-JDBC 之前在 JDBC URL 上配置 ShardingSphere 提供的 Driver。
删除 Spring 配置简化并统一了 ShardingSphere 的配置模式。 此调整不仅简化了使用不同配置模式时 ShardingSphere 的配置,还减少了 ShardingSphere 社区的维护工作。
2. 系统地重构 DistSQL 语法
Apache ShardingSphere 的特性之一是其灵活的规则配置和资源控制能力。
DistSQL 是 ShardingSphere 类似 SQL 的操作语言。 它的使用方式与标准 SQL 相同,旨在提供增量 SQL 操作能力。
ShardingSphere 5.3.0 系统地重构 DistSQL。 社区重新设计了 DistSQL 的语法、语义和操作过程。 新版本更符合 ShardingSphere 的设计理念,并专注于更好的用户体验。
有关详细信息,请参考最新的 ShardingSphere 文档。 DistSQL 路线图即将推出,欢迎您留下反馈。
3. 重构 ShardingSphere-Proxy 的配置格式
在此更新中,ShardingSphere-Proxy 调整了配置格式并减少了启动所需的配置文件。
重构前的 server.yaml
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: ALL_PERMITTED
- !TRANSACTION
defaultType: XA
providerType: Atomikos
- !SQL_PARSER
sqlCommentParseEnabled: true
sqlStatementCache:
initialCapacity: 2000
maximumSize: 65535
parseTreeCache:
initialCapacity: 128
maximumSize: 1024
重构后的 server.yaml
authority:
users:
- user: root@%
password: root
- user: sharding
password: sharding
privilege:
type: ALL_PERMITTED
transaction:
defaultType: XA
providerType: Atomikos
sqlParser:
sqlCommentParseEnabled: true
sqlStatementCache:
initialCapacity: 2000
maximumSize: 65535
parseTreeCache:
initialCapacity: 128
maximumSize: 1024
在 ShardingSphere 5.3.0 中,不再需要 server.yaml
来启动 Proxy。 如果默认情况下未提供任何配置文件,则 Proxy 提供默认帐户 root/root。
ShardingSphere 完全致力于成为云原生。 借助 DistSQL,可以进一步简化 ShardingSphere-Proxy 的配置文件,这对于容器部署更加友好。
发行说明
API 变更
- DistSQL:重构语法 API;请参考用户手册
- Proxy:更改全局规则的配置样式,删除感叹号
- Proxy:允许零配置启动,在没有 Authority 配置时启用默认帐户 root/root
- Proxy:删除默认的
logback.xml
并使用 API 初始化 - JDBC:移除 Spring 配置,改为使用 Driver + YAML 配置
增强
- DistSQL:新语法
REFRESH DATABASE METADATA
,刷新逻辑数据库元数据 - Kernel:支持 DistSQL
REFRESH DATABASE METADATA
从治理中心加载配置并重建MetaDataContext
- 支持 PostgreSQL/openGauss 设置事务隔离级别
- Scaling:增加库存任务进度更新频率
- Scaling:
DATA_MATCH
一致性检查支持断点续传 - Scaling:支持通过 DistSQL 删除一致性检查作业
- Scaling:在作业列表 DistSQL 响应中将列从
sharding_total_count
重命名为job_item_count
- Scaling:在增量任务 SQL 中添加分片列以避免广播路由
- Scaling:生成 SQL 时可以更新分片列
- Scaling:改进
DATA_MATCH
一致性检查的列值读取器 - DistSQL:加密 DistSQL 语法优化,支持 like 查询算法
- DistSQL:
REGISTER STORAGE UNIT
时添加属性值检查 - DistSQL:在
DROP RULE
时同时移除无用的算法 - DistSQL:
EXPORT DATABASE CONFIGURATION
支持广播表 - DistSQL:
REGISTER STORAGE UNIT
支持异构数据源 - Encrypt:支持
Encrypt
LIKE 特性 - 跨多个分片执行 DML 语句时自动启动分布式事务
- 内核:支持 PostgreSQL 和 openGauss 的
client \d
命令 - 内核:支持列包含 null 值时的 select group by, order by 语句
- 内核:支持解析 PostgreSQL/openGauss Insert 语句的
RETURNING
子句 - 内核:SQL
HINT
性能改进 - 内核:支持 mysql case when then 语句解析
- 内核:支持数据源级别异构数据库网关
- (实验性)分片:新增分片缓存插件
- 代理:支持更多 PostgreSQL 日期时间格式
- 代理:支持 MySQL
COM_RESET_CONNECTION
命令 - 伸缩:改进
MySQLBinlogEventType.valueOf
以支持未知事件类型 - 内核:支持 federation 的 case when 语句
Bug 修复
- 伸缩:修复作业删除时创建的 barrier 节点
- 伸缩:修复
DATA_MATCH
一致性检查中部分列的值可能被忽略的问题 - 伸缩:修复一致性检查中 jdbc url 参数未更新的问题
- 伸缩:修复表分片算法类型
INLINE
区分大小写的问题 - 伸缩:修复 MySQL 上的增量任务需要 mysql 系统数据库权限的问题
- 代理:修复执行没有存储节点的 select SQL 时出现 NPE 的问题
- 代理:支持单播场景下的
DATABASE_PERMITTED
权限验证 - 内核:修复 show compute nodes 命令中
worker-id
值错误的问题 - 内核:修复 Weight 算法的可读数据源数量与权重配置不相等时路由错误的问题
- 内核:修复多个读写分离组引用同一个负载均衡器名称,导致负载均衡器失败的问题
- 内核:修复无法禁用和启用计算节点的问题
- JDBC:修复 ShardingSphereDriver 集群模式启动时数据源关闭的问题
- 内核:修复绑定表的逻辑表名部分与实际表名一致,部分不一致时重写结果错误的问题
- 内核:修复在使用 SpringBoot 但未配置规则时启动异常的问题
- 加密:修复加密值为 null 时出现空指针异常的问题
- 内核:修复 oracle 解析不支持 varchar2 指定类型的问题
- 内核:修复事务内串行标志判断错误的问题
- 内核:修复由
wasNull
更改引起的游标获取错误 - 内核:修复刷新元数据时 alter transaction rule 错误
- 加密:修复在
Encrypt
场景中执行 call procedure 语句时发生的EncryptRule
转换为TransparentRule
异常 - 加密:修复简写投影中的
ExpressionProjection
引起的异常 - 代理:修复 PostgreSQL Proxy int2 负值解码不正确的问题
- 代理:PostgreSQL/openGauss 支持 describe insert returning clause
- 代理:修复 gsql 3.0 连接 Proxy 时可能卡住的问题
- 代理:修复在 Proxy 后端检查 SQL 时缺少参数的问题
- 代理:启用 MySQL Proxy 对大型数据包进行编码
- 内核:修复 oracle 解析注释缺少空格的错误
- DistSQL:修复 show create table for encrypt table
重构
- 伸缩:如果 SQL 关键字,则在生成 SQL 时反转表名和列名
- 伸缩:改进增量任务失败处理
- 内核:治理中心节点调整,统一驼峰命名为下划线命名
链接
社区贡献
本次 Apache ShardingSphere 5.3.0 版本的发布是 49 位贡献者提交的 687 个合并 PR 的成果。 感谢大家的努力。
本文最初发表于 ShardingSphere 5.3.0 is released: new features and improvements 并经许可重新发布。
评论已关闭。