Apache ShardingSphere 本周迎来了 5.3.0 版本的发布,该版本历时一个半月,共合并了来自全球的团队和个人累计 687 个 PR,新版本在功能、性能、测试、文档、示例等方面都进行了大量的优化。
Apache ShardingSphere 本周迎来了 5.3.0 版本的发布,该版本历时一个半月,共合并了来自全球的团队和个人累计 687 个 PR,新版本在功能、性能、测试、文档、示例等方面都进行了大量的优化。
新亮点介绍
加密列支持模糊查询
在此前的版本,ShardingSphere 的 Encrypt 功能不支持在 SQL 中使用 LIKE 运算符。一直以来,用户对 Encrypt 功能支持加密 LIKE 运算都有很强烈的诉求,通常加密的字段都是字符串类型为主,而字符串类型执行 LIKE 又是一种很常见的业务场景。
为了降低用户接入 Encrypt 功能的改造成本,ShardingSphere 社区发起了关于加密 LIKE 实现的讨论。讨论发起后,除了收到很多社区同学的积极反馈外,还有社区同学在充分调研了行业常规方案后,贡献了其原创的支持模糊搜索的加密算法实现。
相关 issue:
How to support the fuzzy query of encrypted fields · Issue #20435 · apache/shardingsphere · GitHub
算法设计方案,可参考 issue 中的附件:
https://github.com/apache/shardingsphere/files/9684570/default.pdf
社区同学贡献的【单字符摘要算法】
在 ShardingSphere 加密算法 SPI 中对应实现为 CHAR_DIGEST_LIKE
欢迎大家使用。后续也会有文章对该功能进行详细解读,敬请期待!
支持数据源级别的异构数据库
ShardingSphere 具备一定的数据网关能力。不过,在之前的版本中,ShardingSphere 的异构能力级别为逻辑库,即一个逻辑库下的所有数据源必须为相同的数据库类型。
本次更新,ShardingSphere 在内核层面支持了数据源级别的异构数据库,即一个逻辑库下的数据源可以是不同类型的数据库,允许用户混合使用不同的数据库存储数据。结合 ShardingSphere 已有的 SQL 方言转换能力,这一特性让 ShardingSphere 在异构数据网关方面的能力更进一步。
数据迁移:数据一致性校验断点续传
数据一致性校验是数据迁移后期的一个步骤。在过去的版本,数据一致性校验支持通过 DistSQL 触发、停止。当迁移数据量较大时,如果用户因某些原因中止了数据一致性校验,再次启动数据一致性校验则需要从头开始校验,影响用户体验。
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 校验算法会一次性计算所有数据,暂不支持断点续传。
跨多个分片执行 DML 语句,支持隐式开启分布式事务
在过去的版本中,即使在 ShardingSphere 配置了 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);
当这条 SQL 被按照 id mod 2 分片时,ShardingSphere 内核层面会自动将 SQL 拆分为以下两条 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 语句执行的原子性。
5.3.0 重大调整
移除 Spring 配置方式
在较早的 ShardingSphere 版本,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 社区的代码、文档维护成本。
DistSQL 语法系统性重构
灵活的规则配置 和资源管控能力是 Apache ShardingSphere 的特点之一。
DistSQL(Distributed SQL)是 Apache ShardingSphere 特有的操作语言。 它与标准 SQL 的使用方式完全一致,用于提供增量功能的 SQL 级别操作能力。
ShardingSphere 5.3.0 对 DistSQL 进行了系统性的重构,在对 DistSQL 的语法、语义、操作流程等方面进行了详细的斟酌后,设计出了更符合 Apache ShardingSphere 设计哲学、更专注于用户体验的 DistSQL 语法、流程。
详细的 DistSQL 语法可以参考最新的 ShardingSphere 官方文档,后续还将会有更直观的 DistSQL 铁路图,欢迎大家使用、反馈。
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 的配置文件得以进一步简化,对容器化部署等场景更加友好。
更新日志
ShardingSphere 5.3.0 完整更新日志如下:
API 调整
-
DistSQL:语法 API 系统性重构,请参考用户手册
-
Proxy:global rule 配置方式变化,移除叹号
-
Proxy:允许零配置启动,无 Authority 配置时启用默认账户 root/root
-
Proxy:移除默认的 logback.xml 配置,使用 API 初始化
-
JDBC:移除 Spring 配置方式,使用 Driver + YAML 配置代替
优化
-
DistSQL:新增语法 REFRESH DATABASE METADATA,刷新逻辑库元数据
-
支持 DistSQL REFRESH DATABASE METADATA 从治理中心拉取配置并重新构建 MetaDataContext
-
PostgreSQL/openGauss 支持设置隔离级别
-
优化全量迁移进度展示
-
DATA_MATCH 一致性校验支持断点续传
-
一致性校验作业支持 drop
-
优化 job 列表里的 sharding_total_count 列名,避免和 sharding 混淆
-
优化增量迁移:SQL 条件带上分片键避免广播路由
-
允许更新分片键
-
为 DATA_MATCH 校验算法优化列读取器,确保列取值类型一致
-
DistSQL:Encrypt DistSQL 语法优化,支持 like query 算法
-
DistSQL:注册存储节点时增加 properties 值校验
-
DistSQL:DROP RULE 时同步移除无用的算法
-
DistSQL:EXPORT DATABASE CONFIGURATION 支持广播表
-
DistSQL:REGISTER STORAGE UNIT 支持异构数据源
-
支持 Encrypt LIKE 功能
-
跨多个分片执行 DML 语句支持隐式开启分布式事务
-
支持 PostgreSQL 和 openGauss \d 查询
-
支持不同数据库包含 null 值的字段排序和分组功能
-
支持解析 PostgreSQL/openGauss INSERT RETURNING clause
-
SQL HINT 性能优化
-
支持 MySQL CASE WHEN THEN 语句解析
-
支持数据源级别的异构数据库
-
【实验功能】增加数据分片缓存插件
-
PostgreSQL / openGauss 日期时间增加更多格式支持
-
MySQL Proxy 支持 COM_RESET_CONNECTION 命令
-
优化 MySQLBinlogEventType.valueOf:兼容未知类型事件解析
-
增加 federation 引擎对 case when 语句的支持
问题修复
* 修复 barrier 节点在 job 删除之后被创建导致 job 结构被破坏的问题
* 修复 DATA_MATCH 可能忽略部分字段比较的问题
* 修复数据迁移一致性校验源端dataSource没替换jdbcUrl参数问题
* 修复 tables sharding algorithm type INLINE 区分大小写问题
* 修复 MySQL 增量迁移时候,登陆时候需要 MySQL 系统库的权限问题
* Proxy:修复无存储节点时,执行 select SQL 发生 NPE 的问题
* Proxy:支持 Unicast 场景下 DATABASE_PERMITTED 权限校验
* 修复查看计算节点列表为展示正确的 worker-id 问题
* 修复 Weight 算法可读数据源和权重配置数量不相等下出现的路由异常
* 修复分片+读写分离结合使用,两组读写分离引用相同的负载均衡器,负载均衡未起作用问题
* 修复无法熔断和恢复 Proxy 实例问题
* 修复 ShardingSphereDriver 集群模式下启动数据源被关闭问题
* 修复绑定表规则中部分逻辑表和真实表不一致情况下的改写 bug
* 修复 SpringBoot 接入方式不配置 rules 属性启动报错
* 修复 Encrypt value 为 null 时空指针异常
* 修复 parser 解析 Oracle varchar2 类型异常
* 修复 serial 标识事务内判断错误问题
* 修复因 wasNull 改动引起的 cursor fetch 报错
* 修复 transaction rule 刷新元数据异常
* 修复 Encrypt 场景下执行 call procedure 语句出现的 EncryptRule 转换 TransparentRule 异常
* 修复 * 查询中包含 ExpressionProjection 时导致的结果集遍历异常
* 修复 PostgreSQL Proxy int2 负数解码错误的问题
* 修复 PostgreSQL Proxy Describe 协议不正确的问题
* 修复 gsql 3.0 客户度连接 openGauss Proxy 交互式输入密码会卡死的问题
* 修复 Proxy Prepared Statement SQL 审计没有传递实际参数的问题
* 修复 MySQL Proxy 无法编码超长数据的问题
* 修复 Oracle 注释中不含空格的解析异常
* 修复 Encrypt 表的 show create table 语句展示异常问题
* 修复 Encrypt 场景下同时配置加密列、辅助查询列或 like 查询列时 INSERT 语句 Token 生成异常
重构
* 扩展各个数据库类型实现,配置数据库专用保留字,仅转义保留字
* 重构 PipelineTask.start;优化增量任务线程失败处理
* 治理中心节点调整,将驼峰统一为下划线分割
致谢
此次 Apache ShardingSphere 5.3.0 版本的发布,共有 49 位 Contributor 提交了 687 个 PR,感谢社区伙伴们的大力支持!
相关链接
下载链接
https://shardingsphere.apache.org/document/current/cn/downloads
更新日志
shardingsphere/RELEASE-NOTES.md at master · apache/shardingsphere · GitHub
项目地址
https://shardingsphere.apache.org/
Cloud 子项目地址