SQL防御
SQL防御用于在SQL提交到引擎执行前及执行过程中进行风险识别、告警和拦截,防止低质量SQL对集群稳定性和计算性能造成冲击。通过配置防御规则,可以对笛卡尔积、扫描文件数超限、返回结果行数超限、运行时长超限等常见风险SQL进行管控,支持告警提示或直接拦截。
功能概述
在日常大数据分析场景中,用户提交的SQL质量参差不齐,可能出现查询死锁、无用嵌套查询、大SQL消耗资源过多等情况。低质量SQL会对数据分析平台带来不可预料的冲击,影响系统性能和平台稳定性。SQL防御功能通过在SQL提交和执行的不同阶段进行检测,识别风险SQL并执行相应动作,从而让引擎提供更稳定、更集中的计算能力。
SQL防御目前支持Hive、Spark、StarRocks、ClickHouse四种引擎。用户在集群管控页面的SQL防御模块中新增防御规则,针对不同引擎选择系统内置的规则、设置阈值、用户以及命中后的动作(告警、拦截和熔断),即可对该集群上运行的SQL进行防护。
前提条件
- 已创建BMR集群,且集群状态为运行中。
- 集群已安装并启用需要防御的引擎服务(Hive、Spark、StarRocks或ClickHouse中的至少一个)。
开启SQL防御
- 选择MapReduce>集群列表进入集群列表页面。
- 点击目标集群名称,进入集群详情页面。
- 在左侧导航中选择SQL防御>防御规则,进入防御规则页面。
- 点击新增规则,打开新增规则弹框。
- 在弹框中配置规则名称、规则ID、生效用户及服务与动作,点击确定完成规则创建。
表三 新增规则配置项说明
| 配置项 | 配置项说明 |
|---|---|
| 规则名称 | 必填。自定义的规则名称,用于标识该条防御规则。 |
| 规则ID | 必填。下拉选择系统内置的规则ID(如static_0001、dynamic_0001等),每个规则ID对应一种检测逻辑。可点击页面上方的查看系统SQL防御规则了解全部规则含义。 |
| 用户 | 选择规则生效的用户范围,可选择所有用户或指定具体用户。 |
| 服务与动作 | 必填。选择规则适用的引擎服务(如Hive、Spark、StarRocks、ClickHouse),勾选命中后的动作(告警/拦截)并填写阈值。点击+添加可为多个服务分别配置。 |
注意:需结合业务场景,评估规则是否启用及阈值合理性。拦截或阻断SQL请求可能影响上层业务,建议先以告警方式观察规则效果,确认阈值合理后再启用拦截。
查看系统SQL防御规则
在防御规则页面点击查看系统SQL防御规则,可查看平台内置的全部规则ID、规则描述、适用引擎及建议阈值,作为新增规则时选择规则ID和配置阈值的参考。
管理防御规则
创建完成的防御规则以列表形式展示在防御规则页面,可对规则进行查看、编辑和删除。
- 搜索规则:在页面右上角输入规则名称关键词,可按名称筛选规则。
- 编辑规则:单击操作列中的编辑按钮,可修改规则的用户范围、服务与动作及阈值。
- 删除规则:单击操作列中的删除按钮,删除该条防御规则,删除后该规则不再生效。
规则分类
防御规则按检测时机分为三类:
表一 规则分类说明
| 类别 | 检测时机 | 说明 |
|---|---|---|
| 静态规则 | SQL提交时 | 基于SQL文本结构进行检测,提交即判断,不依赖运行状态。例如COUNT(DISTINCT)次数、JOIN次数、子查询嵌套层数、笛卡尔积等。 |
| 动态规则 | SQL执行计划阶段 | 基于SQL的执行计划进行检测,例如计划扫描的文件数、涉及的分区数等。 |
| 运行时规则 | SQL运行过程中 | 基于SQL运行过程中的实际指标进行检测,例如返回结果行数、内存占用峰值、运行时长、扫描数据量等。 |
规则在适用范围上还可分为通用规则和引擎独享规则:
- 通用规则:对所有支持的引擎均生效的防御规则,如SQL运行时长、JOIN次数、内存占用等。
- 引擎独享规则:某个引擎特有的规则,如ClickHouse的集群级别(on cluster)DDL操作管控、StarRocks的SQL运行CPU时间管控等。
命中动作
SQL命中防御规则后,支持以下两种动作,可同时配置:
表二 命中动作说明
| 动作 | 说明 |
|---|---|
| 告警 | 命中规则后仅记录并提示,不阻断SQL执行。适用于观察规则效果、评估阈值合理性。 |
| 拦截 | 命中规则后阻断SQL执行,阻止风险SQL对集群造成冲击。 |
| 熔断 | 记录违规行为,并在后续再次执行相同SQL时自动阻断,避免持续触发相同风险。 |
说明:不同引擎支持的规则集合有所差异,各引擎具体支持的规则及推荐SQL写法请参见对应引擎的SQL防御文档:Hive SQL防御、Spark SQL防御、StarRocks SQL防御、ClickHouse SQL防御)。
防御白名单
对于确认安全、无需防御的队列或作业,可通过防御白名单将其排除在防御规则之外。在左侧导航选择SQL防御>防御白名单,可新增队列白名单和作业白名单。加入白名单的队列或作业将不受防御规则约束。
注意:删除队列或作业白名单后,将会一并删除防御规则中已配置的该白名单队列或作业,请谨慎操作。
注意事项
- 拦截动作会阻断SQL执行,可能影响上层业务,建议先以告警方式验证阈值合理性后再启用拦截。
- 动态规则和运行时规则的阈值需结合集群规模和业务数据量合理设置,阈值过低可能误伤正常业务SQL。
- 不同引擎支持的规则集合不同,配置前请参见对应引擎的SQL防御文档确认规则适用性。
- 部分规则为引擎独享规则(如ClickHouse的on cluster类DDL规则、StarRocks的CPU时间规则),仅对对应引擎生效。
评价此篇文章
