StarRocks慢查询拦截工具

由于集群较多,在慢查询管理与短查询保障中,不想投入大量的时间管控,因此为了偷懒开发一个服务来协助我控制慢查询,分享一下我目前是怎么处理慢查询的。

背景:【慢查询拦截】

慢查询控制(第一部分.说明)

  • (01). 设计数据落表

①. 数据层面:建立数据表,设计拦截记录落库
②. 程序层面:使用stream load进行数据攒批导入
③. 飞书层面:设置发送模板
④. 监控层面:grafana折线图
⑤. 邮件层面:设置发送模板

  • (02). 设计拦截模式
    简单描述拦截行为

①. 10分钟慢查询提醒 (解析:语句提交超过10分钟,那么提醒)


②. 30分钟慢查询查杀 (解析:语句提交超过30分钟,那么查杀)

③. 全表扫描亿级查杀 (解析:语句提交属于全表扫描类型,并且数据量达到亿级,查杀)

④. 百亿扫描行数查杀 (解析:语句提交扫描行数达到一百亿,查杀)

⑤. TB级扫描字节查杀 (解析:语句提交扫描字节达到TB级别,查杀)

⑥. 异常违规参数查杀 (解析:语句提交违规参数,查杀,比如query_mem_limit=999999999999999999)

⑦. 队列并发告警提醒 (解析:语句提交并发数据/QPS达到100,提醒)

⑧. 白名单弱保护机制 (解析:白名单保障一些核心用户,这个在配置表中表现)
⑨. CATALOG违规查杀 (解析:语句提交从hive catalog使用insert方式写入内表超过1亿数据量,查杀)

⑩. GB级消耗内存查杀 (解析:语句提交到BE执行后,当这语句使用内存超过200GB时,查杀)

  • (03). 设计协调框架
    简单说明数据来源

①. 进程模式(数据采集,从show processlist中拿实时SQL)


②. 队列模式(数据采集,从http://FE:8030/system?path=//current_queries中拿实时SQL)

  • (04). 底层功能开发
    简单描述一些分析功能

①. 分析执行计划


②. 解析获取表名

③. 定义扫描类型

④. 精准重叠系数

⑤. 识别进程队列

⑥. 展示副本分布

⑦. 分析排序分桶

⑧. 生成原因分析

⑨. 生成参考资料

⑩. 告警对接个人(通过飞书应用机器人,发送告警给对应的AD用户)

  • (05). 扩展功能开发
    由于我们账号有native、AD,所以两种账号的owner不一致,从不同的源分析拿到账号的责任人,当告警时,给责任人发送邮件,要求整改语句。

①. 根据本地账号获取相关ID、英文名称、下属
②. 根据LDAP账号获取相关ID、英文名称

  • (06). 告警推送模块
    当已经分析出告警后,就需要推送到不同的场景(飞书+企业邮件)

①. 根据集群发送到不同群组
②. 根据账号发送到不同群组
③. 根据账号发送到个人飞书(通过飞书应用机器人)
④. 根据账号发送到个人邮件
⑤. 根据账号发送到个人邮件以及抄送到他的属下

  • (07). 调试运行阶段
    修复一些bug(不重要)

①. 修复数组越界
②. 新增空分区识别
③. 新增队列信息从API获取
④. 进入调试优化阶段
⑤. 修复分发告警异常

慢查询控制(第二部分.配置)

  • 数据表说明(三个配置表)

1.程序标准配置表,主要是程序启动时,需要读取的配置信息,比如监控类型,拦截模式等

CREATE TABLE `sr_slow_query_config` (
  `slow_query_time` int NOT NULL DEFAULT '600' COMMENT '慢查询语句的超时告警时间,单位秒。',
  `slow_query_ktime` int NOT NULL DEFAULT '1500' COMMENT '慢查询语句的查杀时间,单位秒',
  `slow_query_concurrencylimit` int NOT NULL DEFAULT '80' COMMENT '慢查询的并发度(比如并发语句超过该值则告警),单位整数',
  `slow_query_version` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '程序版本号',
  `slow_query_focususer` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '慢查询保护白名单用户,使用英文逗号,隔开',
  `slow_query_proxy_feishu` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '访问飞书代理地址(使用飞书发送信息时,企业需要代理)',
  `slow_query_email_host` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮箱,服务器,host:port',
  `slow_query_email_from` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮箱,用于发送邮件的邮箱',
  `slow_query_email_to` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮箱,用于接收邮件的邮箱, 逗号分隔',
  `slow_query_email_cc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮箱,由于抄送邮件给cc的邮箱,逗号分隔',
  `slow_query_email_bc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮箱,由于密送邮件给bc的邮箱,逗号分隔',
  `slow_query_email_suffix` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业邮件的后缀名,@xxxxx.com',
  `slow_query_email_reference_material` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮件中呈现的参考资料了解,支持html,逗号分隔',
  `slow_query_frontend_avgs` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT 'parallel_fragment_exec_instance_num=15,query_mem_limit=274877906944,load_mem_limit=274877906944,exec_mem_limit=274877906944' COMMENT '慢查询需要拦截的参数指标比如,key=value,.... 可填多个',
  `slow_query_frontend_fullscan_num` int DEFAULT '200000000' COMMENT '慢查询拦截全表扫描的最大行数,默认值2亿',
  `slow_query_frontend_insert_catalog_scanrow` int DEFAULT '100000000' COMMENT '慢查询拦截catalog扫描数据量超过亿级 + INSERT TABLE FROM CATALOG',
  `slow_query_frontend_memoryusage` int DEFAULT '200' COMMENT '慢查询拦截单个BE 200GB+级别查询消耗内存',
  `slow_query_frontend_scanrows` bigint DEFAULT '10000000000' COMMENT '慢查询拦截百亿+级别扫描行数',
  `slow_query_frontend_scanbytes` int DEFAULT '5' COMMENT '慢查询拦截TB+级别扫描字节消耗',
  `slow_query_data_registration_username` varchar(100) DEFAULT NULL COMMENT '慢查询记录落表,用户名',
  `slow_query_data_registration_password` varchar(500) DEFAULT NULL COMMENT '慢查询记录落表,密码',
  `slow_query_data_registration_table` varchar(500) DEFAULT NULL COMMENT '慢查询记录落表,表名',
  `slow_query_data_registration_host` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '慢查询记录落表,主机名(FE IP)',
  `slow_query_data_registration_port` int DEFAULT '8030' COMMENT '慢查询记录落表,端口(因为这个走的是stream load,所以端口默认8030)',
  `slow_query_resource_group_cpu_core_limit` int DEFAULT '10' COMMENT '慢查询拦截资源隔离,CPU',
  `slow_query_resource_group_mem_limit` int DEFAULT '50' COMMENT '慢查询拦截资源隔离,内存',
  `slow_query_resource_group_concurrency_limit` int DEFAULT '3' COMMENT '慢查询拦截资源隔离,并发度',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `slow_query_grafana` varchar(200) DEFAULT NULL COMMENT 'prometheus地址,支持向prometheus中推送记录'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  • 2.飞书机器人配置表
    机器人配置表,主要是为了填写一些机器人key的配置信息与集群标记关联
CREATE TABLE `sr_slow_query_robot` (
  `type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '机器人类型,global,cluster,user',
  `key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '机器人集群通知标记',
  `robot` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '飞书机器人KEY',
  `status` int NOT NULL DEFAULT '0' COMMENT '开关',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='慢查询告警推送机器人';
  • 3.集群连接信息表
    集群连接信息,就是账号密码主机端口manager地址
CREATE TABLE `sr_slow_query_manager` (
  `app` varchar(100) NOT NULL COMMENT '集群名称(英文)',
  `feip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '集群连接地址(必填)F5,VIP,CLB,FE',
  `user` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '集群登录账号(必填) 建议是管理员角色的账号',
  `password` varchar(500) NOT NULL COMMENT '集群登录密码(必填)',
  `feport` int NOT NULL DEFAULT '9030' COMMENT '集群登录端口,默认9030',
  `address` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'MANAGER地址,如果填了MANAGER地址,那么将触发定时检查LICENSE是否过期(企业级)',
  `expire` int DEFAULT '30' COMMENT 'LICENSE是否过期(企业级)过期提醒倒计时,单位day',
  `status` int NOT NULL DEFAULT '0' COMMENT 'LICENSE是否过期(企业级)开关,0 off, 1 on',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='StarRocks登录配置,manager地址,(定期检查license过期日期)';

慢查询控制(第三部分.配置文件)
程序需要配置文件(golang编写), starrocks.yaml

configdb:
  Host: 127.0.0.1                                         配置表MYSQL地址
  Port: 3306                                              配置表MYSQL端口
  User: root                                              配置表MYSQL账号
  Pass: xxxxxxxxxx                                        配置表MYSQL密码
  Schema:                                                 
    App: chengken.sr_slow_query_config                    程序标准配置表
    Connect: chengken.sr_slow_query_manager               集群连接信息表
    Robot: chengken.sr_slow_query_robot                   飞书机器人配置表

logger:
  LogPath: /u/xxxx                                        日志路径
  LogLevel: "info"
  MaxSize: 0
  MaxBackups: 0
  MaxAge: 0
  Compress: false
  JsonFormat: false
  ShowLine: true
  LogInConsole: true

慢查询控制(第四部分.初始化)
当程序第一次启动时,会识别连接数据库是否成功,配置表是否已经创建,如配置表没有预先创建,则进入交互模式,引导我进行创建。

慢查询控制(第五部分.常驻)
程序初始化成功后,将进入常驻模式,默认每2分钟扫描一次提交的SQL,当已经发送过告警的语句,将会中被扔进cache中,只有当cache过期后,才会触发二次提醒,cache的过期时间与标准表中的slow_query_time挂钩。

6赞

https://github.com/chengkenli/StarRocksQueris

大佬,请问现在可以共享使用吗?

好货,sr目前就差这种工具

在上面的地址哈

厉害,再配合一个AI分析慢查询Profile,自动 优化就更好了

已经Fork了,我来贡献点功能代码

2赞

大佬们,会有使用 hue查询SR 的场景吗?公用同一session 的问题解决了吗