MySQL 性能监控实战:从零搭建 Prometheus + Grafana 监控告警体系(附排查 SOP)
今日关键词性能监控、PMM、Prometheus、Grafana、慢查询、告警、指标体系大家好我是数据库小学妹前面我们学习了锁机制、MVCC、慢查询诊断这些事后分析的技术。但你知道“数据库目前处于什么状态QPS 多少Buffer Pool 命中率是什么水平吗”听到QPS、命中率这些词是不是很懵所以SQL写得好是一回事知道数据库在跑什么状态是另一回事。今天把我从零学监控的经历整理出来新手也能从零搭建。一、为什么需要监控先讲一个案例某平台电商大促系统突然变慢。开发找运维运维找 DBADBA 说等我连上去看看。这一套流程走了 15 分钟用户已经跑到竞品下单了。如果有一套监控慢查询超过阈值就自动告警早在用户察觉之前就能介入。监控能帮你做什么目的具体场景实时感知QPS 突然掉底、连接数打满立刻知道故障预警Buffer Pool 命中率下降提前扩容排障加速出问题时不用我觉得慢了直接看指标容量规划过去三个月 QPS 趋势决定什么时候扩容数据这东西不会说谎。嘴上说不慢没用监控图表才说了算。二、监控的五维指标体系搞监控第一件事不是选工具而是搞清楚该看什么。我把 MySQL 的核心指标分成五个维度 维度 1资源使用指标含义告警阈值参考CPU 使用率MySQL 进程 CPU 占用 80% 持续 5 分钟内存使用InnoDB Buffer Pool 占用实际使用 可用内存 90%磁盘 IO每秒读写次数 IOPS写 IO 延迟 20ms磁盘空间数据目录可用空间 20%网络吞吐每秒收发流量接近带宽上限这些指标别在 MySQL 里查用系统命令更快# CPUtop-p$(pgrep mysqld)-n1# 内存free-h# 磁盘 IOiostat-x13# 磁盘空间df-h/var/lib/mysql 维度 2连接与线程-- 当前连接数 vs 最大连接数SHOWVARIABLESLIKEmax_connections;SHOWSTATUSLIKEThreads_connected;-- 查看连接来源和状态SELECTuser,host,db,command,time,stateFROMinformation_schema.processlistWHEREcommand!SleepORDERBYtimeDESC;连接池满了最常见的问题——用户报无法连接数据库大概率是连接数被打满。 维度 3查询性能-- QPS 近似计算两次查询间隔内的差值SHOWSTATUSLIKEQuestions;SHOWSTATUSLIKEUptime;-- 慢查询数量SHOWSTATUSLIKESlow_queries;-- 全表扫描次数SHOWSTATUSLIKESelect_scan;关注三个关键指标QPS 突降→ 可能有锁等待Slow_queries 飙升→ SQL 性能退化或缺少索引Select_scan 增长→ 全表扫描增多 维度 4InnoDB 引擎-- Buffer Pool 命中率核心指标SHOWSTATUSLIKEInnodb_buffer_pool_read%;-- 公式1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) × 100%-- 目标 99%-- 行锁等待SHOWSTATUSLIKEInnodb_row_lock_waits;SHOWSTATUSLIKEInnodb_row_lock_time;-- 脏页比例SHOWSTATUSLIKEInnodb_buffer_pool_pages%;Buffer Pool 命中率是我最关注的指标之一。低于 98% 说明内存不够用了该扩了。 维度 5主从同步SHOWSLAVESTATUS\G-- 关注两个字段-- Seconds_Behind_Master延迟-- Slave_IO_Running / Slave_SQL_Running必须都是 Yes三、三层工具选型 新手级PMMPercona Monitoring and ManagementPMM 是 Percona 开源的监控平台基于 Prometheus Grafana开箱即用。安装docker 一把梭# 拉取 PMM Serverdockerrun-d-p80:80-p443:443\--namepmm-server\percona/pmm-server:2# 在 MySQL 机器上安装 PMM Clientyuminstallpmm2-client# 或apt-getinstallpmm2-client# 注册客户端到服务端pmm-admin config --server-insecure-tls --server-urlhttps://admin:adminpmm-server-ip然后刷浏览器打开 PMM 面板你会看到一个详细的仪表盘——QPS、连接数、Buffer Pool 命中率、慢查询趋势全在里面。 进阶级搭建你自己的 Grafana 面板PMM 好用但如果你已经有 Prometheus 体系自己搭一套更灵活。架构MySQL → mysqld_exporter → Prometheus → Grafana步骤 1安装 mysqld_exporter# 创建监控用户CREATEUSERexporter%IDENTIFIED BYpassword;GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TOexporter%;# 安装运行wgethttps://github.com/prometheus/mysqld_exporter/releases/latest ./mysqld_exporter--mysqld.usernameexporter--mysqld.passwordpassword步骤 2Prometheus 配置# prometheus.yml-job_name:mysqlstatic_configs:-targets:[your-mysql-host:9104]步骤 3Grafana 仪表盘Grafana 有现成的 MySQL 仪表盘模板Dashboard ID: 7362MySQL OverviewDashboard ID: 9623MySQL InnoDB Metrics导入就能用不用从零画图。 兜底级纯 SQL 脚本不是所有环境都能装监控工具。开发环境、内网测试库有时候只能自己跑 SQL 看-- 一键快照脚本适合做定时任务SELECTNOW()ASsnapshot_time;SELECT--- QPS ---ASindicator;SELECTROUND(QUESTIONS/UPTIME,2)CURRENT_QPS,ROUND(QUESTIONS/UPTIME,2)AVG_QPSFROM(SELECTVARIABLE_VALUEASQUESTIONSFROMperformance_schema.global_statusWHEREVARIABLE_NAMEQuestions)q,(SELECTVARIABLE_VALUEASUPTIMEFROMperformance_schema.global_statusWHEREVARIABLE_NAMEUptime)u;SELECT--- Buffer Pool 命中率 ---ASindicator;SELECTCONCAT(ROUND((1-reads/requests)*100,2),%)ASbuffer_hit_rateFROM(SELECT(SELECTVARIABLE_VALUEFROMperformance_schema.global_statusWHEREVARIABLE_NAMEInnodb_buffer_pool_reads)ASreads,(SELECTVARIABLE_VALUEFROMperformance_schema.global_statusWHEREVARIABLE_NAMEInnodb_buffer_pool_read_requests)ASrequests)t;SELECT--- 连接数 ---ASindicator;SELECT(SELECTVARIABLE_VALUEFROMperformance_schema.global_statusWHEREVARIABLE_NAMEThreads_connected)AScurrent,(SELECTVARIABLE_VALUEFROMperformance_schema.global_variablesWHEREVARIABLE_NAMEmax_connections)ASmax;放到 crontab 里每 5 分钟跑一次输出到文件自己整理看趋势。四、告警规则怎么设有监控没告警等于闭着眼睛开车。生产环境最必要的几条告警告警项条件级别连接数过多当前连接 最大连接 × 0.8P1紧急慢查询骤增5 分钟内慢查询 50P2重要Buffer Pool 命中率下降 95% 持续 10 分钟P2重要磁盘空间不足 10% 可用P1紧急主从延迟 10 秒持续 5 分钟P2重要QPS 突降下降 50% 持续 3 分钟P1紧急告警通知渠道P1→ 短信 电话 IM 群通知P2→ IM 群通知 邮件别把所有告警都设成 P1不然会被狼来了效应淹没。五、监控实战 checklist这是我学监控的计划按这个顺序来对新手友好Phase 1先看第 1 周# 每天跑一遍感受数据库的脉搏SHOW STATUS;SHOW ENGINE INNODB STATUS\G SHOW PROCESSLIST;不用监控工具每天手动跑几次这些命令感受一下 QPS、连接数、慢查询的变化。先建立手感。Phase 2再看第 2-3 周安装 PMM导入默认仪表盘学会看 QPS 趋势图、慢查询列表每天看一眼 Buffer Pool 命中率Phase 3会报警第 4 周配置连接数告警P1配置慢查询告警P2确认告警通道畅通Phase 4能排障持续梳理常见性能问题的监控排查路径把排查经验写成 SOP六、我的排查 SOP三步定位法当告警响起按这三步来第一步全局扫一眼QPS ↓ 50% → 继续 ↓ 连接数 ↑ 300% → 连接池打满 → 可能是慢查询导致连接堆积 慢查询 ↑ 10x → 确认有慢查询 → 进入第二步第二步定位慢查询元凶-- 查当前正在跑的慢 SQLSELECTtrx_mysql_thread_idASthread_id,trx_queryAScurrent_sql,TIMESTAMPDIFF(SECOND,trx_started,NOW())ASrunning_secondsFROMinformation_schema.innodb_trxWHEREtrx_stateRUNNINGORDERBYrunning_secondsDESC;-- 或者从慢查询日志查历史-- 先确认慢查询日志是否开启SHOWVARIABLESLIKEslow_query_log;-- 分析最近 50 条慢查询mysqldumpslow-t50/var/lib/mysql/slow.log第三步分析慢查询用 EXPLAIN 看执行计划这个我们之前的文章详细讲过定位是全表扫描还是索引没走对。这套流程在大促值班时用过一次凌晨 2 点 QPS 掉底告警顺着三步走3 分钟定位到一个缓存过期导致的 full join扩容后恢复正常。七、今日学习心得监控不是装完工具就完事指标体系设计比工具重要五个维度资源/连接/查询/引擎/主从覆盖 90% 的性能问题PMM 适合新手快速上手Prometheus Grafana 适合有基础的自己定制告警要分级别把 P2 的事设成 P1先建立手感再上工具——顺序很重要 我是数据库小学妹一个用设计师思维学数据库的转行人。我们一起用监控让数据库问题早发现、早解决本文示例基于 MySQL 8.0 InnoDB。不同环境配置可能有差异请结合实际调整。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2635107.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!