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

news/2024/5/21 2:44:05/文章来源:https://blog.csdn.net/ShardingSphere/article/details/127274549

一、背景

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 继承自 SPI 类 ShardingSphereAlgorithm,继承了父类的 typeprops 两个参数,并且定义了自己的方法 check,如果想自定义自己的审计算法,只要实现该接口并添加到 META-INF.services 即可。

0dceecab5bfa201c2f537a7873c8be51.png

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);
}

Apache ShardingSphere 内部实现了一个比较通用的分片审计算法 org.apache.shardingsphere.sharding.algorithm.audit.DMLShardingConditionsShardingAuditAlgorithm,也就是前文提到的拦截全路由的 SQL 语句。该算法通过判断分片条件是否为空来拦截,当然如果广播表或者非分片表则不应该拦截。

public final class DMLShardingConditionsShardingAuditAlgorithm implements ShardingAuditAlgorithm {@Getterprivate Properties props;@Overridepublic void init(final Properties props) {this.props = props;}@SuppressWarnings({"rawtypes", "unchecked"})@Overridepublic SQLCheckResult check(final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters, final Grantee grantee, final ShardingSphereDatabase database) {if (sqlStatementContext.getSqlStatement() instanceof DMLStatement) {ShardingRule rule = database.getRuleMetaData().getSingleRule(ShardingRule.class);if (rule.isAllBroadcastTables(sqlStatementContext.getTablesContext().getTableNames())|| sqlStatementContext.getTablesContext().getTableNames().stream().noneMatch(rule::isShardingTable)) {return new SQLCheckResult(true, "");}ShardingConditionEngine shardingConditionEngine = ShardingConditionEngineFactory.createShardingConditionEngine(sqlStatementContext, database, rule);if (shardingConditionEngine.createShardingConditions(sqlStatementContext, parameters).isEmpty()) {return new SQLCheckResult(false, "Not allow DML operation without sharding conditions");}}return new SQLCheckResult(true, "");}@Overridepublic String getType() {return "DML_SHARDING_CONDITIONS";}
}

这里再介绍一个分片审计算法 LimitRequiredShardingAuditAlgorithm,该算法会拦截 updatedelete 操作未携带 limit 的 SQL,因为该算法通用性较差,目前并没有集成在 Apache ShardingSphere 内。可以看见要实现一个自定义的算法还是很简单的,这也是为什么要设计分片审计框架的原因,通过热插拔的形式,ShardingSphere 具备了强大的拓展性。

public final class LimitRequiredShardingAuditAlgorithm implements ShardingAuditAlgorithm {@Getterprivate Properties props;@Overridepublic void init(final Properties props) {this.props = props;}@SuppressWarnings({"rawtypes", "unchecked"})@Overridepublic SQLCheckResult check(final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters, final Grantee grantee, final ShardingSphereDatabase database) {if (sqlStatementContext instanceof UpdateStatementContext && !((MySQLUpdateStatement) sqlStatementContext.getSqlStatement()).getLimit().isPresent()) {return new SQLCheckResult(false, "Not allow update without limit");}if (sqlStatementContext instanceof DeleteStatementContext && !((MySQLDeleteStatement) sqlStatementContext.getSqlStatement()).getLimit().isPresent()) {return new SQLCheckResult(false, "Not allow delete without limit");}return new SQLCheckResult(true, "");}@Overridepublic String getType() {return "LIMIT_REQUIRED";}
}

四、分片审计的使用

分片审计需要给逻辑表配置审计策略,为了便于大家快速上手,分片审计的配置和分片算法以及分片键值生成器一样,有一个算法定义以及策略定义,同时还支持默认的审计策略。如果逻辑表里面配置了审计策略则只对逻辑表生效,如果配置了 defaultAuditStrategy 则对该分片规则下的所有逻辑表生效。auditors 类似 shardingAlgorithmsauditStrategy 类似 databaseStrategydatabaseStrategydefaultAuditStrategy 类似 defaultDatabaseStrategydefaultTableStrategy

参考配置如下,这里只添加了分片审计相关的配置,分片算法、数据源等配置请自行添加。

rules:- !SHARDINGtables:t_order:actualDataNodes: ds_${0..1}.t_order_${0..1}auditStrategy:auditorNames:- sharding_key_required_auditorallowHintDisable: truedefaultAuditStrategy:auditorNames:- sharding_key_required_auditorallowHintDisable: trueauditors:sharding_key_required_auditor:type: DML_SHARDING_CONDITIONS

第一步我们执行一个查询操作,由于配置了拦截全库路由的审计策略,直接抛出了错误。

mysql> select * from t_order;
ERROR 13000 (44000): SQL check failed, error message: Not allow DML operation without sharding conditions

第二步我们添加 HINT,HINT 名称是 /* ShardingSphere hint: disableAuditNames */disableAuditNames 后跟随的是上面配置的 auditorsNames,如果是多个的话用空格分隔,例如 /* ShardingSphere hint: disableAuditNames=auditName1 auditName2*/,我们使用该 HINT 后可以看见 SQL 操作执行成功。

mysql> /* ShardingSphere hint: disableAuditNames=sharding_key_required_auditor */ select * from t_order;
+----------+---------+------------+--------+
| order_id | user_id | address_id | status |
+----------+---------+------------+--------+
|       30 |      20 |         10 | 20     |
|       32 |      22 |         10 | 20     |
+----------+---------+------------+--------+
2 rows in set (0.01 sec)

这里再给大家说一些注意事项,如果要使用 HINT 需要修改 Proxy 的 server.yaml 配置。另外如果你是直接使用 MySQL 的终端连接 Proxy,需要添加 -c 参数,否则 HINT 注释将在 MySQL 终端被过滤掉,自然也就无法到后端被 Proxy 解析到了。

rules:- !SQL_PARSERsqlCommentParseEnabled: truesqlStatementCache:initialCapacity: 2000maximumSize: 65535parseTreeCache:initialCapacity: 128maximumSize: 1024
props:proxy-hint-enabled: true
mysql -uroot -proot -h127.0.0.1 -P3307  -c

五、分片审计 DistSQL

目前 Apache ShardingSphere 也已经支持了分片审计的部分 DistSQL,5.2.0 版本支持如下 DistSQL,具体以官方 Release Note 为准:https://github.com/apache/shardingsphere/discussions/20639。

CREATE SHARDING AUDITOR
ALTER SHARDING AUDITOR
SHOW SHARDING AUDIT ALGORITHMS

未来版本将支持以下 DistSQL:

DROP SHARINDG AUDITOR
SHOW UNUSED SHARIDNG AUDIT ALGORITHMS
CREATE SHARDING TABLE RULE # 包含AUDIT_STRATEGY

本文详细介绍了分片审计的基本实现原理以及具体的使用示例,相信通过本文读者朋友们对分片审计都有了一些基本的了解,大家可以根据自己的需求使用分片审计或者自定义算法,如果是通用算法也欢迎大家向社区提交。在使用过程中遇到任何问题或者有任何想法,都欢迎来社区反馈。

GitHub 地址:https://github.com/apache/shardingsphere
中文社区:https://community.sphere-ex.com/

作者

黄挺,腾讯金融科技工程师,ShardingSphere Committer,主要负责与 Proxy 相关的数据分片审计及事务特性等研发工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_22232.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猿创征文 | 国产数据库实战之TiDB 数据库快速入门

猿创征文 | 国产数据库实战之TiDB 数据库快速入门一、系统检查1.检查系统版本2.查看本地IP地址3.TiDB集群介绍二、快速部署本地测试集群1.安装 TiUP工具2.声明全局环境变量3.快速部署TiDB 集群三、连接 TiDB 数据库1.新开一个session 以访问 TiDB 数据库2.通过Mysql客户端连接T…

SpringSecurity整合JWT+Oauth2认证

没写完&#xff0c;推荐下面的博客 推荐博客<查看pom依赖、数据库sql、实体类、数据映射>&#xff1a;SpringSecurity框架 推荐博客<查看SpringSecurity整合JWTOauth2认证>&#xff1a;SpringSecurity整合JWTOauth2认证 一 创建项目 测试浏览器&#xff1a;建议使用…

网课查题系统-公众号轻松调用方法

网课查题系统-公众号轻松调用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&am…

Django ORM F对象和Q对象查询

Django ORM F对象和Q对象查询1.F对象查询2.Q对象查询Django提供了两个非常有用的工具&#xff1a;F对象和Q对象&#xff0c;方便了在一些特殊场景下的查询过程。 1.F对象查询 F对象用于操作数据库中某一列的值&#xff0c;它可以在没有实际访问数据库获取数据值的情况下对字段…

史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人联系方式&#xff0c;点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式&#xff0c;\color{blue}点击本人照片即可显示WX→官方认证}文末正…

基于微信小程序的毕业设计题目(23)php汽车维修保养小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统&#xff0c;前台用户使用小程序&#xff0c;小程序使用微信开发者工具开发&#xff1b;后台管理使用基PPMySql的B/S架构&#xff0c;开发工具使用phpstorm&#xff1b;通过后…

毕业设计 单片机stm32智能路灯智能灯控系统 - LoRa远程通信

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 Lora模块4.2 DHT11温湿度传感器4.3 光照传感器5 部分核心代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩…

springboot使用布隆过滤器——缓存穿透

目录 1.布隆过滤器原理 2.具体使用场景 3.springboot集成布隆过滤器 4.总结 1.布隆过滤器原理 布隆过滤器&#xff08;Bloom Filter&#xff09;是非常经典的以空间换时间的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否…

虹科分享 | 什么是深度数据包检测(DPI)

深度数据包检测 (DPI) 是一种分析通过网络发送的流量的高级方法。DPI 使用数据处理来检查数据包的特定细节&#xff0c;作为数据包过滤的一种形式。 虽然 DPI 用于查看 OSI 模型的第 2-7 层&#xff0c;但仅当设备可以查看并根据第 3 层或更高层采取行动时&#xff0c;它才被视…

rsync+inotify实时同步

查看主页俩篇 inotify、rsync 编写脚本实现inotify与rsync相结合 客户端 #!/bin/bash Path/root/rsync_data backup_Server192.168.80.132 /usr/bin/inotifywait -mrq --format %w%f -e create,close_write,delete $Path | while read line do if [ -f $line ];then rsync -…

7个最佳WordPress设计师和摄影师作品插件

您是一名设计师或摄影师&#xff0c;正在寻找在 WordPress 中构建作品网站的最简单方法吗&#xff1f; 微信扫描二维码用手机阅读或收藏 有很多WordPress作品插件&#xff0c;可让您轻松构建漂亮的作品网站。 但是&#xff0c;对于初学者来说&#xff0c;找到完美的作品插件插…

从深圳寄东西到加拿大,用什么快递比较好?

哪家快递好这个是没有定论的&#xff0c;合适自己的渠道才是好渠道&#xff0c;通常情况下&#xff0c;四大快递和EMS这些基本都是没什么大问题的。下面方联国际物流就来带大家了解一下从深圳寄东西到加拿大的几种主要方式。目前有4种方式运输到加拿大&#xff1a;专线、快递、…

MaxCompute 笛卡尔积逻辑的参数优化复杂JOIN逻辑优化

1. 优化概述 最近协助一个项目做下优化任务的工作。因为主要数据都是报表&#xff0c;对数对的昏天暗地的不敢随便调整SQL逻辑&#xff0c;所以本身只想做点参数调整&#xff0c;但是逼不得已后来还是改了一下SQL。 这篇文章主要讲一个SQL优化反映的两个优化点。分别是&#…

AC 自动机算法介绍

一 点睛 AC 自动机是 KMP 算法和 Trie 树的结合&#xff0c;是经典的多模匹配算法。首先将多个模式串构建一棵字典树&#xff0c;然后在字典树上添加失配指针&#xff0c;失配指针相当于 KMP 算法中的 next 函数&#xff08;匹配失败时的回退位置&#xff09;&#xff0c;最后…

用python实现猜数字游戏

实现思路电脑随机生成1~100的整数,让用户去猜,用户每猜一次程序都会做出相应的提示。若用户输入所猜的数字小于电脑随机生成的数字,则提示“你猜小了”;若大于,则提示“你猜大了”;若等于,则提示“恭喜你赢了”(一直猜直到猜对游戏结束也可以控制猜的次数)这里需要用到p…

公众号如何搭建查题功能-拥有单独的后台

公众号如何搭建查题功能-拥有单独的后台 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点…

Games104现代游戏引擎入门-lecture19 网络游戏的进阶架构

1 三大架构 unity向这个方向靠 虚幻引擎用的架构&#xff1a; 课程结构&#xff1a; 2 Character movement repication 角色位移的同步 1 插值 内插值和外插值 外插值:本质是预测&#xff0c; 1 内插值 把server来的状态搞到buffer中去&#xff0c; 内插的问题:两个…

10.NIO-IO模型

1.5、NIO BIO 1.5.1、Stream Channelstream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层) stream 仅支持阻塞 API,channel 同时支持阻塞、非阻塞 API,网络 channel 可配合 selector 实现多路复用 二者均为全双工,即读写可以同时进行1.5.2…

研究型论文_基于 stacking 和多特征融合的加密恶意流量检测研究(中文论文)

文章目录基于 stacking 和多特征融合的加密恶意流量检测研究摘要解决的问题1. 特征提取2. 模型框架DMMFC3. 整体流程4. 结论总结论文优点论文缺点用到的工具和数据集基于 stacking 和多特征融合的加密恶意流量检测研究 摘要 加密技术保护网络通信安全的同时&#xff0c;大量恶…

LinkedHashMap源码分析

LinkedHashMap源码分析 文章目录LinkedHashMap源码分析继承体系存储结构属性内部类构造方法成员方法三个后置处理方法afterNodeInsertion(boolean evict)方法afterNodeAccess(Node<K,V> e)方法afterNodeRemoval(Node<K,V> e)方法增添方法移除方法查询方法LinkedHas…