欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
生产案例:每一个月左右MySQL就会出现性能抖动
今天说一个生产环境的案例,MySQL 的性能抖动问题
具体现象也就是每隔一个月左右的时间,MySQL 就会出现性能急剧下降的情况,通过 linux 命令对问题进行排查之后,发现了每隔 30 天有一次 RAID 充放电的日志,那么推测性能急剧下降就是由于 RAID 充放电所导致的
生产环境中将数据库部署在了 64G 高配服务器上,并使用了 6 块硬盘组成了 RAID10 磁盘阵列
那么接下来说一下为什么 RAID 需要充放电,以及 RAID 充放电为什么会导致 MySQL 性能急剧下降:
RAID 是独立冗余磁盘阵列(将 RAID 的技术介绍放在了后边),作用是提供管理机器中的多块磁盘以及磁盘之间的数据冗余的功能
而使用多块磁盘组成 RAID 阵列时,一般会有一个 RAID 卡,这个卡中是有一块缓存区域的,当把 RAID 的缓存模式设置为 write back
时,所有写入到磁盘阵列中的数据,会先写入到 RAID 卡中的缓存区域,大幅度提升磁盘写的性能(和操作系统中的 os cache 类似)
这块缓存区域就相当于是内存,那么就带来了一个问题:如果机器突然断电,在 RAID 卡里缓存区域中的数据就会丢失,因此 RAID 卡一般都会有自己独立的 锂电池 或者 电容,如果机器突然断电,RAID 卡是基于锂电池运行的,因此不会导致数据丢失的问题
那么锂电池是会出现性能损耗的,一般来讲每隔 30-90 天都会自动对锂电池进行充放电一次,来延迟锂电池的寿命以及校准电池容量
在锂电池充放电的过程中,RAID 的缓存模式会由 write back
变为 write through
,也就是通过 RAID 写数据的话,会直接写入磁盘,而不是先写入 RAID 卡的缓存区域中,因此在充放电过程中,RAID 的写性能会急剧下降!
那么问题原因找到了,如何解决呢?
其实就是将充放电的时间给控制一下就可以了,也就是手动充放电,通过脚本在凌晨业务低峰期的时候进行充放电,并且设置在充放电的时候禁止 RAID 缓存模式由 write back 变为 write through
这样子可以避免在业务高峰期期间,RAID 中的锂电池自动充放电,导致 MySQL 性能急剧下降,影响正常业务请求!
目前顶尖的互联网大厂的数据库服务器的 RAID 就是通过这个方案来避免性能抖动问题!
这里补充一下 RAID 相关的内容,RAID 分为了不同的技术方案,常见的有:
-
RAID0:最简单的一种形式,没有提供冗余或错误修复能力,但是实现成本最低,只需要2块以上的硬盘即可提高整个磁盘的性能和吞吐量。
-
RAID1:又称磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,在不影响性能的情况下最大程度保证系统的可靠性和可修复性。
常用的RAID组别—RAID5(随机写比较慢,因为需要计算奇偶校验位的数值,随机读和顺序读很快,RAID5比较适合读业务,最好使用在从(Slave)数据库服务器上)
-
RAID5:又称分布式奇偶校验磁盘阵列,通过分布式奇偶校验块把数据分散到多个磁盘上,这样如果任何一个盘数据失效,都可以从奇偶校验块中重建。但是如果两块磁盘失效,则整个卷的数据都无法恢复。
-
RAID10:又称分片的镜像,它是对磁盘先做RAID1之后,对两组RAID1的磁盘再做RAID0,所以对读写都有良好的性能,相对于RAID5重建起来更简单,也更快。