字节客增慢 SQL 治理体系
时间:2025-11-03 18:09:52 出处:热点阅读(143)
作者 | 房厂
项目概览
背景
慢 SQL 即执行时间超过 long_query_time 设定阈值的字节治理 SQL 语句,可通过 select @@long_query_time 查看数据库具体的客增慢查询阈值。另外慢 SQL 不仅仅包括 select 语句,体系也包括 delete,字节治理insert 等 DML 语句。
慢查询 SQL 的客增危害包括:
性能: 慢 SQL 的执行时间过长,则会导致用户的体系等待时间过长,直接影响用户体验;稳定性: 当 db 出现慢查询,字节治理一旦有其他的客增 DDL 操作,可能会造成整个数据库的体系等待;另一方面,慢 SQL 会拖垮数据库,字节治理导致正常执行的客增 SQL 也会变成慢 SQL。在字节的体系线上事故管理平台搜索慢 SQL 关键字可以看到很多由于慢 SQL 导致的事故,危害性较大。字节治理成果
发布慢 SQL 月报,客增整理最佳实践,体系头部泳道推动改进等取得了慢 SQL 数下降了近 50%,慢 SQL 周运行次数下降了一个数量级的成效;
慢 SQL 配置&告警订阅持续配置率从 18% 提升到 70% 左右,持续优化中。

名词解释
RDS:Relational Database Service,即字节关系型数据库服务。提供的关系数据库服务,使用的数据库产品主要以开源 MySQL 数据库为主。香港云服务器字节云关系型数据库服务(RDS)专注于为业务提供稳定可靠,弹性伸缩的在线数据库服务。Mars:客增性能平台名称。风神 Aeolus:字节自研敏捷 BI 平台,提供灵活易用的数据查询,高效美观的报表制作,与丰富多元的数据内容。设计方案
1. 架构图
2.1 全面的慢 SQL 度量看板
以字节 RDS 平台数据库的慢 SQL 数据为依据,量化管理客增每日/每周/每月的慢 SQL 数量&运行次数。按照度量看板数据推动大家及时改进存量的慢 SQL,降低数据库质量风险。例如周维度的运行次数 & 慢 SQL 条数趋势图如下所示:


2.2 慢 SQL 治理体系
2.2.1 rds 慢 SQL 阈值配置自动化管理
字节关系型数据库平台-RDS 提供慢 SQL 阈值配置的功能:
当 SQL 执行时间超过该阈值后,会被自动 kill 终止运行,相当于慢 SQL 的容灾配置(如果一条 SQL 执行了 3 个月还在运行,结果不敢想象)慢 SQL 阈值配置自动化管理是解决业务关联的数据库全部配置了慢 SQL 阈值信息。该部分通过线上定时巡检来实现,流程如下:

2.2.2 Mars-慢 SQL 治理平台
在客增质量工作台搭建 Mars-客增慢 SQL 治理 Web 页面,展示相关业务的慢 SQL 现状以及排期跟进修复情况,目的WordPress模板是让业务同学更清晰快速了解当前业务相关,提供问题修复效率,方案如下:

慢 SQL 跟进页面:

2.2.3 慢 SQL 风险评估模型-慢 SQL 分
当业务线存在较多慢 SQL 时,如何精准且合理的分析出哪些慢 SQL 风险最高?
我们基于关系型数据库的 Quert_time,Lock_time,Rows_sent,Rows_affected,Bytes_sent 等维度建立客增的慢 SQL 风险评估模型,给每条慢 SQL & 每个数据库打分,按照慢 SQL 分来排序,分数最高的慢 SQL 风险最高。
慢 SQL 模型如下:

2.3 慢 SQL-CI 流水线准入/准出卡口建设
基于 ByteCycle(ByteCycle 字节统一能效中台)开发慢 SQL 原子节点,提供慢 SQL 相关的卡点能力。bytecycle 基于 psm 维度来构建持续集成流水线,通过提供慢 SQL 原子节点,可以方便用户插拔式使用。CI 卡点能够提供大家对慢 SQL 的重视程度以及提高慢 SQL 的改进效率。


2.4 慢 SQL 监控&告警订阅
目前提供慢 SQL 月报,每日慢 SQL 相关问题修复提醒,sqll kill lark 告警卡片等维度的信息展示和触发。相关样式如下:
慢 SQL 月报

每日慢 SQL 问题修复提醒

配置 db 慢查询阈值后,如果超过该阈值则该语句会被 db 自动 kill,订阅后会自动将获取到的 kill 信息发送到对应群中

RDS 元信息获取实现方案

数据表设计
复制create table cg_rds_external(
id int unsigned auto_increment primary key comment id,
db_name varchar(100) default null comment db名字,
owners varchar(100) default not null comment db owners,
region varchar(100) default not null comment db部署的region,
proxy_port_master varchar(100) default not null comment master节点的port,
proxy_port_slave varchar(100) default not null comment slave节点的port,
sync_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 数据同步时间) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 comment rds db额外信息;
create table cg_rds_slow_query_config(
id int unsigned auto_increment primary key comment id,
config_id int null comment 慢查询配置id,
db_name varchar(255) default null comment db名字,
region varchar(100) default not null comment db部署的region,
port varchar(100) default not null comment 规则中的IT技术网端口,
db_role varchar(100) default not null comment master or slave,
max_query_time int null comment 超时阈值,单位是秒,
creator varchar(100) default null comment 规则创建人,
create_time varchar(100) default null comment 规则创建时间,
sync_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 数据同步时间) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 comment rds慢查询规则配置信息;
create table cg_rds_db_alarm_config(
id int unsigned auto_increment primary key comment id,
region varchar(100) default not null comment db部署的region,
alarm_id int null comment alarm 规则id,
db_name varchar(255) default null comment db名字,
type varchar(100) default not null comment alarm type,例如lark,
group_id varchar(100) default not null comment lark id,
create_time varchar(100) default not null comment 规则创建/更新时间,
owner varchar(100) default not null comment alarm创建人,
sync_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 数据同步时间)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 comment rds alarm配置表;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.慢 SQL 查询详情落库

数据表
复制create table cg_slow_query_detail_info(
id int unsigned auto_increment primary key comment id,
db_name varchar(255) default null comment db 名,
db_region varchar(255) default null comment db的region,
fingerprint_md5 varchar(255) default null comment 慢sql标识,
begin_time datetime DEFAULT CURRENT_TIMESTAMP null comment 慢sql的开始执行时间,
max_run_time varchar(255) default null comment sql执行的最大耗时,
run_count int default 0 null comment sql执行次数,
psm_name varchar(255) default null comment 发起sql的psm,
avg_query_time varchar(255) default null comment 平均耗时,
rds_address varchar(255) default null comment 执行sql的rds主机ip:port,
psm_host varchar(255) default null comment 发起查询请求的主机ip,
sync_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 数据同步时间) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 comment 客增慢sql记录;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.慢 SQL 被 kill 的详情信息获取方案
数据表
复制create table cg_kill_sql_detail_info(
id int unsigned auto_increment primary key comment id,
db_name varchar(255) default null comment db 名,
db_region varchar(255) default null comment db的region,
db_role varchar(255) default null comment db节点: master slave,
begin_time datetime DEFAULT CURRENT_TIMESTAMP null comment 被kill的sql 执行开始时间,
psm_name varchar(255) default null comment 发起sql的psm,
sql_detail varchar(2000) default null comment sql详情,
db_table_name varchar(255) default null comment 该sql的表名,如果多个表,只取第一个,
sync_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 数据同步时间) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 comment rds被kill的慢sql数据统计;1.2.3.4.5.6.7.8.9.10.11.12.13.Metrics 监控规则
rds 报警订阅的监控只能发现 rds 上执行的 SQL 数据,不能实时发现慢接口。故推荐使用 dbatman 的 metrics 打点来完成慢 SQL 的监控告警工作。
复制$key = "max:toutiao.ttds.dbatman.latency.max{db=sales_manage,port=*,host=*,dc=*}"$value = max(q($key, "3m", "1m"))/1000warn = $value>50runEvery=11.2.3.4. 4. 慢 SQL 治理最佳实践与标准制定慢 SQL 治理优化基本可分为如下 3 类:
优化 shcema优化索引,尽可能构建三星索引优化查询,合理的设计查询相关细则如下所示:
