记一次数据库MySQL内存只增不减问题
火山引擎云数据库说明
什么是云数据库 MySQL 版?
云数据库 MySQL 版是火山引擎基于开源数据库 MySQL 打造的弹性、可靠的在线关系型数据库服务。 MySQL 实例使用云原生方式部署,结合本地 SSD 存储类型,提供高性能读写能力;完全兼容 MySQL 引擎,并提供实例管理、备份恢复、日志管理、监控告警、数据迁移等全套解决方案,帮助企业简化繁杂的数据库管理和运维任务,使企业有更多的时间与资源聚焦于自己的核心业务。
高可用架构
MySQL 提供一主一备高可用架构的双节点实例类型,在主节点出现故障后,会自动检测并完成秒级主备切换,业务无感知,保障业务稳定性。 MySQL 提供备份能力,支持数据备份及日志备份,支持按备份集恢复及按时间点恢复,保障数据可靠性。
读写分离架构
MySQL 提供一主多读的读写分离架构类型,最多可支持挂载 10 个只读节点,可根据业务需求轻松实现数据读取能力的弹性扩展;支持读写分离,自动将读请求转发至只读节点,分摊主节点数据读取压力,有效应对读多写少的业务场景。
核心组件
- 主节点:主节点( Primary Node )是 MySQL 实例对外提供服务的基础节点,其他组件依赖主节点而发挥作用。在高可用架构下,主节点接收业务的全部读写请求;在读写分离架构下,主节点接收业务的全部写请求和部分读请求。主节点记录数据修改日志,并将日志传送至其他节点,实现节点间数据同步。
- 备节点:备节点( Secondary Node )是 MySQL 实例高可用架构的重要节点,保障实例的高可用性。备节点接收主节点传送的日志并进行重放,保证主备节点间数据一致;在主节点故障时,备节点可快速切换为主节点并对外提供服务,保障业务稳定运行。
- 只读节点:只读节点( Read-Only Node )是 MySQL 实例读写分离架构的重要节点,负责处理只读请求。只读节点接收备节点或主节点的日志并进行重放,保证只读节点与主备节点间数据一致;在读多写少的场景下,可接收并处理只读请求,分摊主节点数据读取压力。
起因
火山引擎的云数据库 MySQL 版提供了高效可靠的服务,其一主一备高可用架构和完善的备份功能保障了数据库的稳定性和数据安全性。
不过最近在使用该产品的时候遇到了一个问题,我们发现其中有节点的内存居高不下,内存只增不减,且只有其中一个节点的内存出现只增不减的情况,导致一直出现告警。问题发生在主节点上,内存占用率飙升至 85% 以上,而备用节点的内存占用率仅为 35%
分析
刚开始的时候闹了点小乌龙,把内存看成 CPU,结果一直去找慢 SQL,后面发现加上索引后还是没解决问题,不过好在也顺手修复了一个潜在的慢 SQL
运维人员发现问题并未解决后,立即将备用节点切换为主节点,但主节点的内存占用率依然持续升高,并未得到释放。
我们联系火山引擎运维人员协助定位问题。对方通过查看日志发现,MySQL 的性能模式 (Performance Schema - PSM) 功能占用了部分内存。
火山引擎运维人员建议我们将控制台中的 performance_schema 和 loose_rds_performance_schema 参数设置为 OFF。
在将这两个参数设置为 OFF 后,主节点的内存占用率开始下降,最终恢复正常。
结论
这次事件让我们了解到 PSM 功能虽然能够提供强大的性能分析功能,但也可能占用大量内存, 尤其是在长时间运行的情况下。