本篇聚焦于如何基于 MySQL 构建一个真正面向生产环境的数据库平台,集成高可用、可观测与性能调优三大核心能力,助力稳定、可扩展的系统运行。
在实际生产环境中,数据库系统需要应对以下挑战:
业务高速增长带来的数据压力;
故障发生时的高可用切换机制;
性能瓶颈与 SQL 优化的持续性需求;
运维人员需要快速掌握系统运行状况。
目标:构建一套具备如下能力的 MySQL 平台:
能力 | 描述 |
---|---|
高可用(HA) | 实现主从热备、自动故障切换 |
可观测(Observability) | 实时监控指标、日志、审计、慢查询、告警等数据的收集与分析 |
性能优化(Tuning) | 覆盖索引优化、缓存层设计、SQL 调优策略等 |
┌──────────────┐ │ 应用服务层 │ └─────┬────────┘ │ ┌───────▼────────┐ │ MySQL 读写分离代理 │ └───────┬────────┘ ┌──────────▼──────────┐ │ 主库(MySQL Master)│ <──────────────┐ └──────────┬──────────┘ │ │ 故障自动切换(MHA / Orchestrator) ┌───────────▼────────────┐ │ │ 从库1(MySQL Slave) │◄──── Binlog │ │ 从库2(MySQL Slave) │ │ └───────────┬────────────┘ │ │ │ ┌───────────▼────────────┐ │ │ 监控平台(Grafana+Prom)│◄──── Exporter │ └────────────────────────┘ │
# 主库配置 [mysqld] server-id=1 log-bin=mysql-bin # 从库配置 [mysqld] server-id=2 relay-log=relay-log read_only=1
CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='rep_user', MASTER_PASSWORD='rep_pwd', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120; START SLAVE;
推荐工具:
MHA(Master High Availability)
Orchestrator(更现代的拓扑管理工具)
使用 MySQL Proxy / ProxySQL / LVS + keepalived;
应用侧按业务角色路由 SQL 请求。
使用 mysqld_exporter
结合 Prometheus
+ Grafana
:
指标类别 | 关键指标示例 |
---|---|
性能指标 | QPS、TPS、慢查询数、连接数、Innodb Buffer 命中率 |
硬件资源 | CPU、IO、磁盘空间、InnoDB 磁盘写入速率 |
复制状态 | Seconds_Behind_Master、Slave IO Running |
日志监控 | error.log、slow.log、binlog |
审计:使用 MySQL Enterprise Audit 或自定义触发器记录关键操作;
告警:Prometheus Alertmanager 设置阈值通知(钉钉、邮件、微信);
日志集中:使用 ELK(Elasticsearch、Logstash、Kibana)或 Loki。
使用 pt-query-digest
分析慢查询日志;
引入自动 SQL 审核平台(如 Yearning、SQLAdvisor);
使用 EXPLAIN
与 SHOW PROFILE
分析语句执行路径。
建立查询频率高字段的联合索引;
避免冗余/重复索引;
合理使用覆盖索引(select 的字段都在索引中);
热点数据前置至 Redis;
对复杂报表查询结果缓存至中间层;
使用 Query Cache(8.0 后移除)或应用级缓存。
sysbench:模拟并发连接读写压力;
tpcc-mysql:模拟真实业务模型;
go-mysql-benchmark:测试主从同步与高可用场景下延迟波动。
数据结构变更用 Flyway;
数据迁移使用 mydumper + myloader;
全量备份 + binlog 确保灾备恢复路径可行。
类别 | 建议 |
---|---|
高可用 | 建议使用 Orchestrator,结合 GTID 保证切换一致性 |
可观测性 | 重点围绕“连接数、慢查询、IO写入、复制状态”设置告警 |
性能优化 | 定期进行 SQL Review,指标驱动调优策略 |
数据安全 | binlog+全备,异地备份,敏感表设审计,备库设访问权限限制 |