由于集群较多,在慢查询管理与短查询保障中,不想投入大量的时间管控,因此为了偷懒开发一个服务来协助我控制慢查询,分享一下我目前是怎么处理慢查询的。
背景:【慢查询拦截】
慢查询控制(第一部分.说明)
- (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挂钩。