RDS for MySQL磁盘过载定位及处理建议
场景介绍
磁盘过载主要体现以下两个场景:
- 场景一:磁盘空间满
磁盘空间主要存放数据库表、日志以及相关元数据等信息。可以通过空间概览查看磁盘空间的分布情况。
- 场景二:磁盘IO过载
磁盘IO(输入/输出)是数据库的核心操作之一。当应用程序对数据库的读写请求量超过了磁盘子系统在单位时间内能处理的最大能力时,就会出现IO瓶颈。
- IOPS(每秒输入/输出操作次数):主要衡量的是随机读写能力。例如,大量基于索引的点查询、更新操作,需要快速读取或修改磁盘上不同位置的数据页。
- 带宽(Throughput):主要衡量的是顺序读写能力,单位通常是MB/s。例如,全表扫描、大量数据的排序/分组(使用临时文件)、大字段的读写、备份恢复、日志(Binlog, Redo Log)写入等。
可能原因
| 原因大类 | 原因子类 | 根因分析 |
|---|---|---|
| 数据空间增长 | 表碎片率增加 |
|
| SQL执行产生临时文件 |
| |
| Binlog空间增长 | 写业务增加产生大量Binlog日志 | 当业务高峰期产生Binlog速度超过Binlog日志上传与清理速度时,则会在本地积累的Binlog日志。 |
| 本地Binlog日志无法清理 |
| |
| 临时空间增长 | 执行数据库操作时,创建临时对象导致临时空间增长。 |
|
| 其他空间增长 | 其他空间增长的主要来源是ibdata空间增长。 | ibdata1是InnoDB的系统表空间,主要包括:多版本并行事务控制(MVCC)相关的数据(undolog、Innodb表的元数据如数据字典)、change buffer/double write buffer等。 其中,undolog是ibdata1增大的最主要原因,而undolog过大的主要原因如下:
|
| 原因大类 | 原因子类 | 根因分析 |
|---|---|---|
| 规格不足 | 存储规格不足 |
|
| 计算规格不足 | 内存资源不足导致访问缓冲池无法获取热数据,当需要访问的数据不在缓冲池中时,就需要从磁盘读取,这会导致产生大量磁盘读IO,甚至达到实例规格上限。 | |
| 慢查询 | 慢查询是导致带宽打满的最常见原因,具体为SQL语句对大量数据进行磁盘扫描或者写入临时文件所产生磁盘IO负载。 |
|
| 数据库表与日志写入频繁 | Binlog(二进制日志)和InnoDB的Redo Log(重做日志)写入,主要消耗磁盘带宽。 | |
| 备机不满足备份条件导致主机备份 | 备份期间涉及全量数据的读取,会占用大量磁盘带宽。 |
对业务的影响
- 磁盘空间满会导致实例变为只读状态,应用无法对RDS数据库进行写入操作,影响业务正常运行。
- 磁盘IO过载会导致数据库响应变慢,查询和写入延迟增加,严重时可能导致连接超时、请求堆积,影响业务正常运行。
处理建议
| 阶段 | 处理方向 | 具体措施 |
|---|---|---|
| 过载异常前 | 数据生命周期管理 |
|
| SQL与表结构优化 |
| |
| 关注本地Binlog日志增长情况 |
| |
| 监控告警配置与预防策略 |
| |
| 过载异常中 | 整体空间增长 | |
| 数据空间增长 | 清理历史数据:
| |
| Binlog空间增长 | 检查Binlog保留策略与复制延迟:
| |
| 临时空间增长 | Kill慢会话或重启实例:
|
| 阶段 | 处理方向 | 具体措施 |
|---|---|---|
| 过载异常前 | 监控告警配置与预防策略 |
|
| 定期巡检日志 | 定期进行慢SQL巡检:定期检查慢查询、索引使用情况,防患于未然,详见管理慢日志。 | |
| 性能压测 | 测试环境提前压测:在新功能上线或大促前,在测试环境对数据库进行压力测试,了解其IO瓶颈所在。 | |
| 过载异常中 | 扩容实例 | |
| 慢SQL治理 |
| |
| 检查主备复制 | 检查备份策略与主备延迟
|