Apache ShardingSphere 5.3.0 的新特性?

最新版本的 Apache ShardingSphere 包括对特性、性能、测试、文档、示例等的改进。
2 位读者喜欢这篇文章。
Working from home at a laptop

Opensource.com

经过 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 支持多种配置格式,但它也存在以下问题

  1. 当 API 更改时,需要调整许多配置文件,这是一项繁重的工作。
  2. 社区必须维护多个配置文件。
  3. Spring bean 的生命周期管理容易受到项目其他依赖项的影响,例如 PostProcessor 失败。
  4. Spring Boot Starter 和 Spring NameSpace 受 Spring 影响,它们的配置样式与 YAML 不同。
  5. 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 变更

  1. DistSQL:重构语法 API;请参考用户手册
  2. Proxy:更改全局规则的配置样式,删除感叹号
  3. Proxy:允许零配置启动,在没有 Authority 配置时启用默认帐户 root/root
  4. Proxy:删除默认的 logback.xml 并使用 API 初始化
  5. JDBC:移除 Spring 配置,改为使用 Driver + YAML 配置

增强

  1. DistSQL:新语法 REFRESH DATABASE METADATA,刷新逻辑数据库元数据
  2. Kernel:支持 DistSQL REFRESH DATABASE METADATA 从治理中心加载配置并重建 MetaDataContext
  3. 支持 PostgreSQL/openGauss 设置事务隔离级别
  4. Scaling:增加库存任务进度更新频率
  5. Scaling:DATA_MATCH 一致性检查支持断点续传
  6. Scaling:支持通过 DistSQL 删除一致性检查作业
  7. Scaling:在作业列表 DistSQL 响应中将列从 sharding_total_count 重命名为 job_item_count
  8. Scaling:在增量任务 SQL 中添加分片列以避免广播路由
  9. Scaling:生成 SQL 时可以更新分片列
  10. Scaling:改进 DATA_MATCH 一致性检查的列值读取器
  11. DistSQL:加密 DistSQL 语法优化,支持 like 查询算法
  12. DistSQL:REGISTER STORAGE UNIT 时添加属性值检查
  13. DistSQL:在 DROP RULE 时同时移除无用的算法
  14. DistSQL:EXPORT DATABASE CONFIGURATION 支持广播表
  15. DistSQL:REGISTER STORAGE UNIT 支持异构数据源
  16. Encrypt:支持 Encrypt LIKE 特性
  17. 跨多个分片执行 DML 语句时自动启动分布式事务
  18. 内核:支持 PostgreSQL 和 openGauss 的 client \d 命令
  19. 内核:支持列包含 null 值时的 select group by, order by 语句
  20. 内核:支持解析 PostgreSQL/openGauss Insert 语句的 RETURNING 子句
  21. 内核:SQL HINT 性能改进
  22. 内核:支持 mysql case when then 语句解析
  23. 内核:支持数据源级别异构数据库网关
  24. (实验性)分片:新增分片缓存插件
  25. 代理:支持更多 PostgreSQL 日期时间格式
  26. 代理:支持 MySQL COM_RESET_CONNECTION 命令
  27. 伸缩:改进 MySQLBinlogEventType.valueOf 以支持未知事件类型
  28. 内核:支持 federation 的 case when 语句

Bug 修复

  1. 伸缩:修复作业删除时创建的 barrier 节点
  2. 伸缩:修复 DATA_MATCH 一致性检查中部分列的值可能被忽略的问题
  3. 伸缩:修复一致性检查中 jdbc url 参数未更新的问题
  4. 伸缩:修复表分片算法类型 INLINE 区分大小写的问题
  5. 伸缩:修复 MySQL 上的增量任务需要 mysql 系统数据库权限的问题
  6. 代理:修复执行没有存储节点的 select SQL 时出现 NPE 的问题
  7. 代理:支持单播场景下的 DATABASE_PERMITTED 权限验证
  8. 内核:修复 show compute nodes 命令中 worker-id 值错误的问题
  9. 内核:修复 Weight 算法的可读数据源数量与权重配置不相等时路由错误的问题
  10. 内核:修复多个读写分离组引用同一个负载均衡器名称,导致负载均衡器失败的问题
  11. 内核:修复无法禁用和启用计算节点的问题
  12. JDBC:修复 ShardingSphereDriver 集群模式启动时数据源关闭的问题
  13. 内核:修复绑定表的逻辑表名部分与实际表名一致,部分不一致时重写结果错误的问题
  14. 内核:修复在使用 SpringBoot 但未配置规则时启动异常的问题
  15. 加密:修复加密值为 null 时出现空指针异常的问题
  16. 内核:修复 oracle 解析不支持 varchar2 指定类型的问题
  17. 内核:修复事务内串行标志判断错误的问题
  18. 内核:修复由 wasNull 更改引起的游标获取错误
  19. 内核:修复刷新元数据时 alter transaction rule 错误
  20. 加密:修复在 Encrypt 场景中执行 call procedure 语句时发生的 EncryptRule 转换为 TransparentRule 异常
  21. 加密:修复简写投影中的 ExpressionProjection 引起的异常
  22. 代理:修复 PostgreSQL Proxy int2 负值解码不正确的问题
  23. 代理:PostgreSQL/openGauss 支持 describe insert returning clause
  24. 代理:修复 gsql 3.0 连接 Proxy 时可能卡住的问题
  25. 代理:修复在 Proxy 后端检查 SQL 时缺少参数的问题
  26. 代理:启用 MySQL Proxy 对大型数据包进行编码
  27. 内核:修复 oracle 解析注释缺少空格的错误
  28. DistSQL:修复 show create table for encrypt table

重构

  1. 伸缩:如果 SQL 关键字,则在生成 SQL 时反转表名和列名
  2. 伸缩:改进增量任务失败处理
  3. 内核:治理中心节点调整,统一驼峰命名为下划线命名

链接

社区贡献

本次 Apache ShardingSphere 5.3.0 版本的发布是 49 位贡献者提交的 687 个合并 PR 的成果。 感谢大家的努力。


本文最初发表于 ShardingSphere 5.3.0 is released: new features and improvements 并经许可重新发布。

接下来阅读
标签
Yacine Si Tayeb
我对技术和创新充满热情。 我搬到北京攻读管理学博士学位,并对当地的创业和科技景象感到敬畏。 到目前为止,我的职业道路是由技术和商业交叉点的机会塑造的。

评论已关闭。

Creative Commons LicenseThis work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.
© . All rights reserved.