ShardingSphere 5.2.0:分片审计功能拦截多分片场景下的不合理请求

Apache ShardingSphere 5.2.0 引入了分片审计功能,旨在解决多分片场景下全路由SQL导致的性能问题。通过提供审计接口、审计算法和配置选项,用户可以拦截或统计不合理的操作,如无分片条件的查询,以优化Proxy性能。分片审计支持自定义算法,具备热插拔特性,并可通过DistSQL进行管理。此外,用户可以通过特定HINT临时跳过审计拦截。

一、背景

Apache ShardingSphere 基于用户的实际使用场景,为用户打造了多种实用功能,包括数据分片、读写分离等。在数据分片功能中,我们发现有些用户涉及到的分片较多,一个分片逻辑表可能对应后端 1000 个物理表,这给用户带来了一定的困扰。例如用户执行 SELECT * FROM t_order 语句则会导致全路由,显然这并不是 OLTP 的使用场景,这种 SQL 可以放到其他的 Proxy 里,避免阻塞其他的请求。但用户可能对 Proxy 并不了解,或者写了 where 条件,却不清楚条件里面不包含分片条件,这样的话一样是需要全路由。全路由会导致 Proxy 性能受到影响,严重情况下将导致正常的请求无法执行。试想一下如果这 1000 个分片都在一个物理库里面,如果并行的话需要取 1000 个连接,如果串行可能请求直接超时。对此用户提出了一个需求,能不能直接拦截这种不合理的请求。

对于这个问题,我们进行了更深层次的思考。如果只是简单拦截这种全路由的操作,只要在代码里面判断一下,并且在配置文件添加一个开关即可满足。那如果用户后面需要设置某个表只读或者要求更新操作必须携带 limit,那是不是又要改代码加配置?这显然与 Proxy 可插拔的逻辑相违背。

基于以上痛点,在刚刚发布的 5.2.0 版本中,Apache ShardingSphere 为用户提供了分片审计的功能。审计既可以是拦截操作也可以是统计操作,与分片和唯一键生成算法类似,审计算法同样支持热插拔,用户可以自定义,并且通过配置即可实现审计。下面我们将结合具体的 SQL 实例,为大家详细解读分片审计的实现逻辑。

二、分片审计接口

Apache ShardingSphere 审计的入口在 org.apache.shardingsphere.infra.executor.check.SQLCheckEngine 类,该类会调用 SQLChecker 接口的 check 方法,目前 ShardingSphere 的审计包括权限审计(验证用户名密码)以及分片审计,这里我们要关心的是分片审计 ShardingAuditChecker 里面实现的父类接口。

d05d774c02c3101adb287c898e389a82.png

通过查看 org.apache.shardingsphere.sharding.checker.audit.ShardingAuditCheckercheck 代码,我们可以快速了解它的原理。

public interface ShardingAuditAlgorithm extends ShardingSphereAlgorithm {
    
    /**
     * Sharding audit algorithm SQL check.
     *
     * @param sqlStatementContext SQL statement context
     * @param parameters SQL parameters
     * @param grantee grantee
     * @param database database
     * @return SQL check result
     */
    SQLCheckResult check(SQLStatementContext<?> sqlStatementContext, List<Object> parameters, Grantee grantee, ShardingSphereDatabase database);
}

该方法会去获取涉及到的所有分片表的审计策略,并且遍历调用每个分片表审计策略里面配置的审计算法,如果有一个审计算法没有通过就直接抛出异常给用户。可能有些用户会好奇这里面的 disableAuditNames 有什么用。分片审计还支持了跳过分片审计的功能。对于有一些场景用户可能就是需要执行一些原本应该被审计拦截的 SQL,并且他们很清楚这条 SQL 带来的影响。对此我们提供了 Hint: disableAuditNames 跳过审计拦截,后面会结合实际的例子来介绍该用法。当然并不是用户想跳过就能跳过的,Proxy 管理员可以配置 allowHintDisable 来控制是否允许用户通过 Hint 的形式跳过分片审计,该参数默认是 true,即允许。

三、分片审计算法

分片审计算法接口 org.apache.shardingsphere.sharding.spi.ShardingAuditAlgorithm</

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值