配置Doris SQL防御
操作场景
用户可以在Manager界面配置Doris的SQL防御规则,根据业务调整对应SQL防御规则的参数。
该功能仅MRS 3.5.0及之后版本支持。
前提条件
- 待连接Doris数据库的节点与MRS集群网络互通。
- FE和BE实例状态正常。
- 已安装MySQL客户端。
使用约束
- 防御规则默认动态生效时间为5分钟。
- 拦截和熔断规则会中断SQL查询,请根据实际业务配置合理的值。
配置Doris SQL防御规则
- 创建具有Doris管理员权限的用户用于连接Doris服务。
- 使用具有“Manager_administrator”和“Manager_viewer”权限的用户登录FusionInsight Manager,选择“集群 > SQL防御”,打开SQL防御页面。
- 参考添加MRS SQL防御规则添加针对Doris的SQL防御规则。
Doris SQL引擎支持的各类型SQL防御规则可参考MRS SQL防御规则。
例如添加一条规则ID为“static_0001”,SQL语句中count distinct出现次数超过1就进行“提示”,超过6就进行“拦截”的规则。
图2 添加Doris SQL防御规则
- 登录安装了MySQL的节点,执行以下命令,连接Doris数据库。
若集群已启用Kerberos认证(安全模式),需先执行以下命令再连接Doris数据库:
export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1
- 直接连接FE节点访问Doris数据库:
mysql -u数据库登录用户 -p -PFE查询连接端口 -hDoris FE实例IP地址
执行命令后输入数据库登录用户密码。
- 连接DBalancer服务,DBalancer根据配置策略连接FE节点访问Doris数据库:
mysql -u数据库登录用户 -p -PDBalancer TCP访问端口 -hDoris DBalancer实例IP地址
执行命令后输入数据库登录用户密码。
- 数据库登录用户为1创建的具有Doris管理员权限的用户。
- Doris FE的查询连接端口,可以通过登录Manager,单击“集群 > 服务 > Doris > 配置”,查询Doris服务的“query_port”参数获取。
- Doris DBalancer的TCP访问端口,可以通过登录Manager,单击“集群 > 服务 > Doris > 配置”,查询Doris服务的“balancer_tcp_port”参数获取。
- Doris FE或DBalancer实例IP地址可通过登录MRS集群的Manager界面,单击“集群 > 服务 > Doris > 实例”,查看任一FE或DBalancer实例的业务IP地址。
- 用户也可以使用MySQL连接软件或者在Doris WebUI界面连接数据库。
执行命令后输入dorisuser用户密码。
- 直接连接FE节点访问Doris数据库:
- 可执行以下命令查看已配置的SQL防御规则:
use __internal_schema;
select * from sqldefend_rule;
+-------------+----------+--------------------+--------+-----------------+------+------+------+ | rule_name | is_group | group_or_user_name | action | threshold_value | p_1 | p_2 | p_3 | +-------------+----------+--------------------+--------+-----------------+------+------+------+ | static_0001 | 1 | A | 1 | 3 | NULL | NULL | NULL | | static_0001 | 1 | A | 2 | 2 | NULL | NULL | NULL | +-------------+----------+--------------------+--------+-----------------+------+------+------+
- 执行以下命令创建数据库,并切换至该数据库:
create database test;
use test;
- 执行以下命令创建t1、t2和t3表:
create table if not exists t1(id int) engine=olap distributed by hash(id);
create table if not exists t2(id int) engine=olap distributed by hash(id);
create table if not exists t3(id int) engine=olap distributed by hash(id);
- 执行以下SQL语句命令,检查当前SQL防御规则是否生效:
select count(distinct id) from t1 except select count(distinct id) from t2 intersect select count(distinct id) from t3 union all select count(distinct id) from t1 except select count(distinct id) from t2 intersect select count(distinct id) from t3;
当前语句中count distinct出现次数超出3中配置规则的阈值:
- 系统提示信息如下:
... join count = 0, countDistinct = 6 ,not in query = false ,union count = 1, nested subquery = 0 ,cartesian join = false
- “拦截”信息如下:
ERROR ... detailMessage = static_0001 number of count(distinct) in the query 6 more than the allowed limit 3
- 若SQL防御规则中设置的动作是“熔断”,系统回显信息可能如下:
ERROR ... detailMessage = running_0001 Num of result rows num reaches the fuse threshold(1000), so cancel the output
- 用户也可通过日志查询SQL防御详情,Doris SQL防御日志路径地址为“/var/log/Bigdata/doris/fe/fe.log”和“/var/log/Bigdata/audit/doris/fe/fe.audit.log”。
- 系统提示信息如下: