经过 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_PERMITTEDtransaction:
  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:支持 EncryptLIKE 特性
- 跨多个分片执行 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 并经许可重新发布。
 
 
 
 
 
 

评论已关闭。