动手点关注 干货不迷路 👆
慢 SQL 即执行时间超过 long_query_time 设定阈值的 SQL 语句,可通过 select @@long_query_time 查看数据库具体的慢查询阈值。另外慢 SQL 不仅仅包括 select 语句,也包括 delete,insert 等 DML 语句。
慢查询 SQL 的危害包括:
以字节 RDS 平台数据库的慢 SQL 数据为依据,量化管理客增每日/每周/每月的慢 SQL 数量&运行次数。按照度量看板数据推动大家及时改进存量的慢 SQL,降低数据库质量风险。例如周维度的运行次数 & 慢 SQL 条数趋势图如下所示:
字节关系型数据库平台-RDS 提供慢 SQL 阈值配置的功能:
慢 SQL 阈值配置自动化管理是解决业务关联的数据库全部配置了慢 SQL 阈值信息。该部分通过线上定时巡检来实现,流程如下:
在客增质量工作台搭建 Mars-客增慢 SQL 治理 Web 页面,展示相关业务的慢 SQL 现状以及排期跟进修复情况,目的是让业务同学更清晰快速了解当前业务相关,提供问题修复效率,方案如下:
慢 SQL 跟进页面:
当业务线存在较多慢 SQL 时,如何精准且合理的分析出哪些慢 SQL 风险最高?
我们基于关系型数据库的 Quert_time,Lock_time,Rows_sent,Rows_affected,Bytes_sent 等维度建立客增的慢 SQL 风险评估模型,给每条慢 SQL & 每个数据库打分,按照慢 SQL 分来排序,分数最高的慢 SQL 风险最高。
慢 SQL 模型如下:
基于 ByteCycle(ByteCycle 字节统一能效中台)开发慢 SQL 原子节点,提供慢 SQL 相关的卡点能力。bytecycle 基于 psm 维度来构建持续集成流水线,通过提供慢 SQL 原子节点,可以方便用户插拔式使用。CI 卡点能够提供大家对慢 SQL 的重视程度以及提高慢 SQL 的改进效率。
目前提供慢 SQL 月报,每日慢 SQL 相关问题修复提醒,sqll kill lark 告警卡片等维度的信息展示和触发。相关样式如下:
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 '规则中的端口',
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配置表';
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记录';
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数据统计';
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"))/1000
warn = $value>50
runEvery=1
慢 SQL 治理优化基本可分为如下 3 类:
相关细则如下所示:
https://dbaplus.cn/news-11-4069-1.html
虽然慢 SQL 专项取得了一定的进展,但后续的持续优化仍然有很长的路要走,如果你也对慢 SQL 优化、数据库质量感兴趣,欢迎加入我们!除了慢 SQL 专项,SRE、EP 等方向的建设同样欢迎大家加入。可以邮件联系 fangchang.fc@bytedance.om 咨询相关信息或者直接发送简历内推。欢迎来聊,hc 多多,等待你的加入!