Apache ShardingSphere 自 6 月底发布 5.1.2 版本以来,历时两个多月,社区持续优化和增强功能,共合并了来自全球的团队和个人累计 1728 个 PR,为大家带来了全面增强的 5.2.0 版本,新版本在功能、性能、测试、文档、示例等方面都进行了大量的优化。此外,shardingsphere-on-cloud 子项目仓库的建立,也标志着 ShardingSphere 云原生的步伐不断加速迈进,欢迎对 Go、Database、Cloud 感兴趣的同学参与 shardingsphere-on-cloud 社区!
本次发布的 5.2.0 版本带来了如下新亮点:
数据分片 SQL 审计功能
数据弹性迁移
SQL 执行进程管理
shardingsphere-on-cloud 子项目上线
新增的数据分片 SQL 审计以及 MySQL SHOW PROCESSLIST & KILL 语句是针对运行 SQL 进行管理的新特性,能够加强用户对 ShardingSphere 的管理能力。SQL 审计功能能够辅助用户进行必要的 SQL 审计管理,避免非法低效的 SQL 对业务系统造成影响。MySQL SHOW PROCESSLIST & KILL 特性则允许用户通过 SHOW PROCESSLIST 语句快速查看当前执行的 SQL,并针对慢 SQL 进行强制取消。
除了增强用户对 ShardingSphere 的管理能力之外,新版本还增加了数据弹性迁移的功能,支持从 Oracle、MySQL、PostgreSQL 迁移数据到 ShardingSphere + MySQL 或 PostgreSQL 组成的分布式数据库生态中,完成从单点数据库向分布式数据库的转换。ShardingSphere 社区会在后续的版本支持更多的异构数据库迁移功能,欢迎大家关注并参与。
本次 5.2.0 版本还将 ShardingSphere 仓库中的 Helm Charts 转移到子项目 shardingsphere-on-cloud 中,旨在为正在寻找分布式数据库上云的用户提供 ShardingSphere + MySQL 或 PostgreSQL 的云上分布式数据库解决方案。5.2.0 版本大量提升了不同数据库的 SQL 解析支持度,完善了 DistSQL 参数使用规范,ShardingSphere 运行模式则移除了 Memory 运行模式,分布式事务支持了跨多个逻辑库的事务功能,本文将给大家介绍 ShardingSphere 5.2.0 版本的更新内容。
新亮点介绍
数据分片 SQL 审计
在大规模的数据分片场景下,如果用户执行了不带分片条件的 SQL 查询,此时 SQL 查询会全路由到底层数据库上执行,将导致大量的数据库连接被占用,出现超时等严重影响业务的问题,如果用户执行的是 UPDATE/DELETE 操作,则可能导致大批量的数据被错误更新和删除。
为了解决这些业务场景中存在的问题,ShardingSphere 5.2.0 版本提供了数据分片 SQL 审计功能,允许用户配置审计策略,策略中可以指定多个审计算法及是否允许禁用审计规则,任意一个审计算法不通过则会禁止 SQL 执行,如下展示了数据分片 SQL 审计的配置。
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_inline
auditStrategy:
auditorNames:
- sharding_key_required_auditor
allowHintDisable: true
defaultAuditStrategy:
auditorNames:
- sharding_key_required_auditor
allowHintDisable: true
auditors:
sharding_key_required_auditor:
type: DML_SHARDING_CONDITIONS
考虑到业务场景的复杂性,数据分片 SQL 审计功能允许用户通过 SQL Hint 的方式,对审计算法进行动态禁用,以支持部分场景下允许操作的业务 SQL 执行。目前,ShardingSphere 5.2.0 内置了 DML 禁止全路由审计 算法,用户也可以自行实现 ShardingAuditAlgorithm 接口,实现更高级的 SQL 审计功能。
/* ShardingSphere hint: disableAuditNames=sharding_key_required_auditor */
SELECT * FROM t_order;
数据弹性迁移
数据迁移一直是 ShardingSphere 社区关注的重点功能,在 5.2.0 版本前,用户执行数据迁移需要先将外部表添加为单分片的分片表,然后通过修改分片规则触发迁移,这种使用方式对于普通用户来说过于复杂且难以理解。为了提升数据迁移功能的易用性,ShardingSphere 5.2.0 版本提供了全新的数据迁移功能,并搭配弹性迁移的 DistSQL,可以让用户通过 SQL-Like 的方式一体化完成从已有的单点数据库迁移到 ShardingSphere + MySQL 或 PostgreSQL 组成的分布式数据库系统中,实现从单点数据库向分布式数据库的转换。
语句 | 说明 | 示例 |
MIGRATE TABLE ds.schema.table INTO table | 从源端迁移到目标端 | MIGRATE TABLE ds_0.public.t_order INTO t_order |
SHOW MIGRATION LIST | 查询运行列表 | SHOW MIGRATION LIST |
SHOW MIGRATION STATUS jobId | 查询作业状态 | SHOW MIGRATION STATUS 1234 |
STOP MIGRATION jobId | 停止作业 | STOP MIGRATION 12345 |
START MIGRATION jobId | 开启停止的作业 | START MIGRATION 1234 |
CHECK MIGRATION jobId | 数据一致性校验 | CHECK MIGRATION 1234 |
SHOW MIGRATION CHECK ALGORITHMS | 展示可用的一致性校验算法 | SHOW MIGRATION CHECK ALGORITHMS |
CHECK MIGRATION jobId (by type(name=algorithmTypeName)? | 数据一致性校验,使用指定的校验算法 | CHECK MIGRATION 1234 by type(name="DATA_MATCH”) |
ROLLBACK MIGRATION jobId | 撤销作业。注意:该语句会清理目标端表,请谨慎操作 | ROLLBACK MIGRATION 1234 |
COMMIT MIGRATION jobId | 完成作业 | COMMIT MIGRATION 1234 |
此外,弹性迁移还支持了将 Oracle 数据迁移至 PostgreSQL 的功能,用户通过 DistSQL 先创建分片规则和分片表,即新的分布式库表,然后执行 MIGRATE TABLE ds.schema.table INTO table 触发数据迁移。在迁移过程中,还可以使用表格中的数据迁移专用 DistSQL 对迁移作业状态、数据一致性进行管理。更多关于数据迁移新功能的使用和说明可以参考官方文档数据迁移(https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/migration/)。
SQL 执行进程管理
原生 MySQL 数据库提供了 SHOW PROCESSLIST 语句,允许用户查看当前运行中的线程,对于那些执行时间过长或者需要临时终止的 SQL,用户可以通过 KILL 语句来杀掉线程。
SHOW PROCESSLIST 和 KILL 语句在日常运维管理中有着广泛地使用,为了增强用户对 ShardingSphere 的管理能力,5.2.0 版本支持了 MySQL SHOW PROCESSLIST 和 KILL 语句。用户通过 ShardingSphere 执行 DDL/DML 语句时,ShardingSphere 会自动生成唯一的 UUID 标识作为 ID,并将 SQL 执行信息存储在各个实例中。
下图展示了 ShardingSphere 中执行 SHOW PROCESSLIST 和 KILL 语句的结果。当用户执行 SHOW PROCESSLIST 语句时,ShardingSphere 会根据当前的运行模式来处理 SQL 执行信息,如果当前运行模式是集群模式,ShardingSphere 会通过治理中心收集并同步各个计算节点的 SQL 执行信息,然后汇总返回给用户。如果当前运行模式是单机模式,ShardingSphere 则只返回当前计算节点中的 SQL 执行信息。用户根据 SHOW PROCESSLIST 返回的结果,判断是否需要执行 KILL 语句,ShardingSphere 会根据 KILL 语句中的 ID 取消正在执行中的 SQL。
shardingsphere-on-cloud 子项目上线
Shardingsphere-on-cloud 是 Apache ShardingSphere 面向云的解决方案项目,目前已发布 v0.1.0 版本,并经过投票正式成为 Apache ShardingSphere 的子项目。
shardingsphere-on-cloud 会不断发布对于 Apache ShardingSphere 在云上的各种配置模板,部署脚本等自动化工具,打磨在高可用、数据迁移、可观测性、影子库、安全审计等方面的最佳工程实践,优化 Helm Charts 交付方式,通过 Kubernetes Operator 持续增强云原生管控能力等。目前项目仓库中已有一些入门 issue,帮助对 Go、Database、Cloud 感兴趣的同学快速参与。
已有能力提升
内核
本次更新,ShardingSphere 社区持续优化了不同数据库的 SQL 解析,大大提升了 ShardingSphere 的 SQL 兼容能力,在更新日志部分可以看到详细的 SQL 解析优化内容。SQL 解析支持度提升是 ShardingSphere 社区的长期重点任务,欢迎感兴趣的同学参与进来,一起提升 SQL 解析支持度。
5.2.0 版本还支持了 MySQL、Oracle、SQL Server 和 H2 数据库列可见特性,用于满足用户系统升级过程中业务 SQL 兼容的需要。读写分离功能支持了笛卡尔积配置方式,通过笛卡尔积配置,可以极大简化用户的配置。
接入端
在 5.2.0 版本中,ShardingSphere-Proxy 支持了监听指定 IP 地址,并默认集成了 openGauss 数据库驱动。ShardingSphere-JDBC 则支持了使用 c3p0 数据源,以及支持 Connection.prepareStatement 指定 columns。
分布式事务
分布式事务在本次更新中,将原有逻辑库级别的事务管理器,调整为全局事务管理器,用于支持跨多个逻辑库的分布式事务。同时,去除了通过 XA 语句控制分布式事务的功能,由 ShardingSphere 自动完成 XA 事务的管理,降低了用户使用分布式事务的复杂度。
更新日志
以下为 ShardingSphere 5.2.0 的全部更新日志,为了提升用户的使用体验,本次更新中调整了部分功能的 API,调整项具体参考本文更新日志的 API 调整部分。
新特性
内核:支持 Sharding 分片功能 SQL 审计
内核:支持 MySQL show processlist 和 kill process list id 功能
弹性伸缩:新增数据迁移专用 DistSQL
弹性伸缩:异构迁移基础版
DistSQL:新语法 `CREATE/ALTER/SHOW MIGRATION PROCESS CONFIGURATION`
DistSQL:新语法 `ALTER MIGRATION PROCESS CONFIGURATION`
DistSQL:新语法 `SHOW MIGRATION PROCESS CONFIGURATION`
DistSQL:新语法 `ADD MIGRATION SOURCE RESOURCE`
DistSQL:新语法 `SHOW SQL_TRANSLATOR RULE`
DistSQL:新语法 `CREATE SHARDING AUDITOR`
DistSQL:新语法 `ALTER SHARDING AUDITOR`
DistSQL:新语法 `SHOW SHARDING AUDIT ALGORITHMS`
优化
内核:支持 MySQL、Oracle、SQL Server 和 H2 数据库列可见特性
内核:支持读写分离笛卡尔积配置配置方式
内核:支持 sql translator spring namespace, spring boot 接入方式
内核:IntervalShardingAlgorithm 支持 JSR-310 年月
内核:广播表支持 update/delete limit 语句
内核:支持加密场景下 create index on table(column) 语句改写
内核:支持 sharding,readwrite-splitting 场景下 openGauss cursor,fetch,move,close 语句
内核:支持加密场景下谓词中 column is null 语句改写
内核:支持加密场景下 show create table 语句结果归并
内核:支持加密场景下 create table 语句包含 index 改写
内核:支持 PostgreSQL create operator 语句解析
内核:支持 PostgreSQL create materialized view 语句解析
内核:支持 PostgreSQL 嵌套注释解析
内核:支持 PostgreSQL alter subscription 语句解析
内核:支持 PostgreSQL create group 语句解析
内核:支持 PostgreSQL alter statictics 语句解析
内核:支持 PostgreSQL create foreign table 语句解析
内核:支持 PostgreSQL alter server table 语句解析
内核:支持 PostgreSQL create foreign data wrapper 语句解析
内核:支持 PostgreSQL create event trigger 语句解析
内核:支持 PostgreSQL security label 语句解析
内核:支持 PostgreSQL reindex statement 语句解析
内核:支持 PostgreSQL reassign owned 和 refresh materialized view 语句解析
内核:支持 PostgreSQL prepare transaction 语句解析
内核:支持 PostgreSQL create collation 语句解析
内核:支持 PostgreSQL lock 语句解析
内核:支持 PostgreSQL alter rule 语句解析
内核:支持 PostgreSQL notify 语句解析
内核:支持 PostgreSQL unlisten 语句解析
内核:支持 Oracle alter function and alter hierarchy 语句解析
内核:支持 Oracle alter pluggable database 语句解析
内核:支持 Oracle alter materialized view log 语句解析
内核:支持 Oracle alter diskgroup 语句解析
内核:支持 Oracle alter operator 语句解析
内核:支持 Oracle alter cluster 语句解析
内核:支持 Oracle alter audit policy 语句解析
内核:支持 Oracle alter index type 语句解析
内核:支持 Oracle lock table 语句解析
内核:支持 Oracle alter java 语句解析
内核:支持 Oracle inline constraint 语句解析
内核:支持 openGauss geometric operator 语句解析
内核:优化 MySQL create/alter table 语句中的 visible/invisible 列解析
内核:支持 MySQL SET 语句中以 @@ 为前缀的变量范围解析
内核:支持 MySQL create procedure 包含 create view 语句解析
内核:支持 MySQL,Oracle,SQL Server create index on table 语句 column 解析
内核:支持 sharding,readwrite-splitting 场景下 openGauss cursor,fetch,move,close 语句
内核:支持加密场景下谓词中 column is null 语句改写
内核:支持加密场景下 show create table 语句结果归并
内核:支持加密场景下 create table 语句包含 index 改写
内核:支持 Oracle ALTER LOCKDOWN PROFILE 语句解析
内核:支持 Oracle ALTER MATERIALIZED VIEW 语句解析
内核:支持 Oracle ALTER MATERIALIZED ZONEMAP 语句解析
内核:支持 Oracle ALTER LIBRARY 语句解析
内核:支持 Oracle ALTER INMEMORY JOIN GROUP 语句解析
内核:支持 Oracle DROP OPERATOR 语句解析
内核:支持 Oracle DROP RESTORE POINT 语句解析
内核:支持 Oracle CREATE RESTORE POINT 语句解析
内核:支持 Oracle DROP INMEMORY JOIN GROUP 语句解析
内核:支持 MySQL create_bit_xor_table 语句解析
内核:支持 MySQL DO 语句解析
内核:支持 openGauss DropServer 语句解析
内核:支持 openGauss CREATE AGGREGATE 语句解析
内核:支持 openGauss ALTER ROUTINE 语句解析
内核:支持 PostgreSQL Create Cast 语句解析
内核:支持 PostgreSQL Create Aggregate 语句解析
内核:支持 PostgreSQL fetch/move/close cursor 语句解析
内核:支持 PostgreSQL ALTER PUBLICATION 语句解析
内核:支持 PostgreSQL Create Access Method 语句解析
内核:支持 PostgreSQL ALTER POLICY 语句解析
内核:支持 PostgreSQL ALTER OPERATOR 语句解析
内核:支持 PostgreSQL Copy 语句解析
内核:支持 PostgreSQL Comment 语句解析
内核:支持 PostgreSQL listen 语句解析
内核:支持 PostgreSQL DECLARE cursor 语句解析
接入端:为 helm 添加 server config 的默认值
接入端:使用 openGauss 数据源无需手动添加驱动
接入端:ShardingSphere-Proxy 支持监听指定 IP 地址
接入端:MySQL Proxy 支持 COM_STMT_SEND_LONG_DATA
接入端:MySQL Proxy 执行 SELECT VERSION() 支持指定别名
接入端:修复 openGauss 客户端无法连接没有数据源的 ShardingSphere-Proxy
接入端:ShardingSphere-Proxy 启动脚本支持使用 JAVA_HOME 变量定义的 JRE
接入端:ShardingSphere-Proxy 发生 OOM 后能够返回错误信息以避免客户端阻塞
接入端:ShardingSphere-JDBC 支持使用 c3p0 数据源
接入端:MySQL Proxy 执行 SET NAMES 支持被双引号包裹的字符集名称
接入端:ShardingSphere-JDBC Connection.prepareStatement 支持指定 columns
弹性伸缩:改进 MySQL connect 和 reconnect 的逻辑
弹性伸缩:修复 mysql json 字段在迁移中可能会出现内存泄漏的问题
弹性伸缩:增加 PostgreSQL 数据源的权限检查
弹性伸缩:增量迁移支持 MySQL MGR 环境
弹性伸缩:优化 job 进度持久化
弹性伸缩:start job 改为同步返回
弹性伸缩:全量迁移兼容同时存在主键和唯一键的表
弹性伸缩:关闭 job 的时候关闭底层 ejob
弹性伸缩:优化 PG/OG 逻辑复制槽名称生成
弹性伸缩:scaling 查询 DistSQL 不用预先选择 DB
DistSQL:SHOW INSTANCE LIST & SHOW INSTANCE INFO 的结果中增加 worker_id
DistSQL:优化 `EXPORT DATABASE CONFIG` 的输出结果
DistSQL:`FORMAT SQL` 支持更多方言类型
DistSQL:优化 `CREATE TRAFFIC RULE` 执行逻辑
DistSQL:读写分离 RDL 中增加可选参数 `writeDataSourceQueryEnabled`
DistSQL:加密规则中支持配置 `assistEncryptor`
DistSQL:`CREATE SHARDING TABLE RULE` 增加算法类型校验
分布式治理:支持数据库发现同一逻辑库下配置多组高可用
分布式治理:支持 ShardingSphere-Proxy 空逻辑库下启动
分布式治理:支持根据实例隔离 EventBus 事件
分布式治理:支持数据库发现主节点发生变化重启探测心跳任务
分布式治理:支持 集群模式下 ShardingSphere-Proxy 重新注册时生成新的 worker-id
影子库:执行 insert 时在阴影列中插入表达式值时抛出异常
分布式事务:支持跨多个逻辑库的分布式事务
分布式事务:支持在 XA 事务中执行 PostgreSQL truncate 语句
分布式事务:DistSQL 支持修改本地事务 Rule
分布式事务:支持全局事务管理器
分布式事务:移除通过 XA 语句控制分布式事务的功能
问题修复
内核:修复过滤 DataSourceContainedRule 导致的单表元数据刷新错误
内核:修复 MySQL blob 类型为空导致的解析异常
内核:修复 PostgreSQL/openGauss reset 语句解析异常
内核:修复 Sharding 和 Encrypt 混合使用时参数改写异常
内核:修复 IntervalShardingAlgorithm 月份相关类的转换异常
内核:修复执行 select union 包含子查询时的空指针异常
内核:修复元数据 column 顺序错误导致的 encrypt 改写异常
内核:修复 MySQL trim 函数解析异常
内核:修复 MySQL insert 语句包含 _binary 解析异常
接入端:修复客户端无法接收到 MySQL 响应的语法错误的问题
接入端:修复 EventLoop 线程会被 JDBC 释放资源操作阻塞的问题
接入端:修复 MySQL Proxy 相应的 server status 中事务状态不正确的问题
接入端:修复 Proxy 客户端在事务中断开连接可能导致连接泄漏的问题
接入端:修复 Proxy 客户端断开连接时正在执行的语句可能存在的一致性问题
接入端:修复 Proxy 执行 SET 语句会污染连接池中的连接的问题
接入端:修复 MySQL Proxy 执行 SHOW TABLES FROM 返回结果不正确的问题
接入端:修复使用 Extended Query 对 PostgreSQL Proxy 执行 DDL 不生效的问题
接入端:修复 PostgreSQL Proxy 没有数据源时执行 SHOW VARIABLES 会报错的问题
接入端:修复 ShardingSphere-JDBC Driver 打包为 fatjar 后无法读取配置文件的问题
弹性伸缩:修复全量迁移时表中同时含有 pk 和 unique 索引报错的问题
弹性伸缩:修复增量迁移任务运行时,支持最新 position 在批量事件中间
弹性伸缩:修复 openGauss 增量迁移中字段值为 null 导致的报错
DistSQL:修复 `SHOW SHARDING TABLE RULES` 结果中的策略名称错误
DistSQL:修复 `ALTER SHARDING TABLE RULE` 执行时提前修改元数据的问题
DistSQL:修复 `ALTER RESOURCE` 可能导致的连接泄漏
DistSQL:修复负载均衡算法为空时 `CREATE TRAFFIC RULE` 失败的问题
分布式治理:修复删除数据库发现逻辑库时未停止监测心跳任务
分布式治理:修复集群模式 ShardingSphere-JDBC 加载所有逻辑库
分布式治理:修复集群模式 SnowflakeKeyGenerateAlgorithm 生成的 worker-id 可能超过最大值的问题
影子库:修复在没有影子数据源情况下 DistSQL 添加影子算法的异常
分布式事务:修复多个逻辑库下数据源名称相同导致的数据源获取错误问题
分布式事务:修复在事务中不支持 RUL DistSQL 语句问题
分布式事务:修复 PostgreSQL 和 openGauss 中 begin 问题
Agent:修复收集 contextManager 指标时的空值异常问题
重构
内核:ShardingSphere 元数据重构,拆分真实元数据和逻辑元数据
内核:使用 ConnectionContext,QueryContext 去除 FetchOrderByValueQueuesHolder,TrafficContextHolder,SQLStatementDatabaseHolder 和 TransactionHolder 中的 ThreadLocal
接入端:修改 helm chart 中 ShardingSphere-Proxy 版本的默认值
接入端:Docker 容器中的 ShardingSphere-Proxy 启动失败时将退出容器
接入端:ShardingSphere 仓库中的 Helm Charts 转移到子项目 shardingsphere-on-cloud
弹性伸缩:scaling 代码可复用性重构
DistSQL:增加 RUL 类型
分布式治理:重构 schedule 模块,拆分为集群调度和单机调度
分布式治理:移除内存模式,保留单机模式和集群模式
分布式治理:重构元数据表加载逻辑和持久化逻辑
分布式治理:重构分布式锁保留最简洁的接口设计
测试:重构:统一 IT 中使用的 Proxy Container 入口为 ENV 模块
测试:重构:统一 IT 中使用的 testcontainer 配置
API 调整
内核:删除 SQL 透传数据源功能
内核:增加 assistedQueryEncryptorName 并删除 QueryAssistedEncryptAlgorithm 接口
内核:重构读写分离 API 以提升用户使用体验
内核:删除 check-duplicate-table-enabled 配置
内核:删除 show-process-list-enabled 配置
弹性伸缩:数据迁移 DistSQL 关键字调整
弹性伸缩:数据迁移部分 DistSQL 语句重新设计
DistSQL:统一参数类型规范
DistSQL:拆分 `SHOW INSTANCE MODE` 为 `SHOW MODE INFO` 和 `SHOW INSTANCE INFO`
DistSQL:`DROP SCALING jobId` 变更为 `CLEAN MIGRATION jobId`
DistSQL:移除 `COUNT INSTANCE RULES`
分布式治理:新增数据库发现高可用支持从库全部下线,主库承担读流量配置
分布式治理:单机模式 SnowflakeKeyGenerateAlgorithm 支持配置 worker-id
影子库:Shadow API 配置将 `sourceDataSourceName` 替换为 `productionDataSourceName`
权限:删除已弃用的 Native 权限提供者
相关链接
🔗 下载链接:
https://shardingsphere.apache.org/document/current/cn/downloads/
🔗 更新日志:
https://github.com/apache/shardingsphere/blob/master/RELEASE-NOTES.md
🔗 项目地址:
https://shardingsphere.apache.org/
🔗 Cloud 子项目地址:
https://github.com/apache/shardingsphere-on-cloud
社区建设
此次 Apache ShardingSphere 5.2.0 版本的发布,共有 64 位 Contributor 提交了 1728 个 PR,感谢社区伙伴们的大力支持。
作者
端正强,SphereEx 高级中间件开发工程师,Apache ShardingSphere PMC。2018 年开始接触 Apache ShardingSphere,曾主导公司内部海量数据的分库分表,有着丰富的实践经验。热爱开源,乐于分享,目前专注于 Apache ShardingSphere 内核模块开发。