37、案例实战:RAID锂电池充放电导致的MySQL数据库性能抖动的优化
00 分钟
2022-8-26

37、案例实战:RAID锂电池充放电导致的MySQL数据库性能抖动的优化

前面经过一定的生产经验的铺垫,包括MySQL磁盘读写的机制,Linux存储系统的原理,RAID磁盘阵列的介绍,RAID锂电池定时充放电的原理,今天终于可以切入真正的生产案例的讲解了
其实只要大家理解了之前的内容,今天真正讲解案例的时候,你会发现理解起来是非常轻松的,几乎都用画什么图,而且讲解起来也会非常的顺畅。
其实简单来说,就是曾经我们有一个非常核心的业务,他的数据库是部署在高配置服务器上的,磁盘就是用的RAID 10的阵列技术,用了6块磁盘组成了RAID 10磁盘阵列架构,具体RAID 10是什么,我们也简单的介绍一下。
其实RAID 0的意思,就是我们之前一幅图里面的,你有很多磁盘组成了一个阵列,然后你所有的数据是分散写入不同磁盘的,因为有多块磁盘,所以你的磁盘阵列的整体容量就很大,而且同时写入多块磁盘,让你的磁盘读写并发能力很强,如下图:
notion image
然后但是这种模式下,最大的问题就是万一你磁盘坏了一块,那么就会丢失一部分数据了。所以一般你要严格保证磁盘数据不丢失的话,就的用RAID 1,这个RAID 1的意思,就是两块磁盘为镜像关系,你写的所有数据,在两块磁盘上都有,形成了数据冗余,一块磁盘坏了,另外一块磁盘上还有数据。
一块磁盘如果压力很大,可以让读请求路由到另外一块磁盘上去,分担压力,反正他俩的数据都是冗余的,是一样的,如下图:
notion image
然后所谓的RAID 10,就是RAID 0 + RAID 1组合起来,就是说当时生产环境的服务器部署,我们有6块磁盘组成了一个RAID 10的阵列,那么其实每2块磁盘组成一个RAID 1互为镜像的架构,存放是数据是冗余一样的,一共有3组RAID 1,然后对于每一组RAID 1写入数据的时候,使用RAID 0的思路,就是不同组的磁盘的数据是不一样的,但是同一组内的两块磁盘的数据是冗余一致的,如下图:
notion image
所以对于这样的一个使用了RAID 10架构的服务器,他必然内部是有一个锂电池的,然后这个锂电的厂商设定的默认是30天进行一次充放电,每次锂电池充放电就会导致RAID写入时不经过缓存,性能会急剧下降,所以我们发现线上数据库每隔30天就会有一次剧烈性能抖动,数据库性能下降了10倍。
当时为了排查这个问题,我们使用了Linux命令查看了RAID硬件设备的日志,这个具体什么命令不说了,因为你用不同的厂商的RAID设备,这个命令实际上是不一样的,发现RAID就是每隔30天又一次充放电的日志,所以就是由于这个定期的充放电导致了线上数据库的性能定期抖动
那么后续如何解决这个问题呢?对于RAID 锂电池充放电问题导致的存储性能抖动,一般有三种解决方案:
1、给RAID卡把锂电池换成电容,电容是不用频繁充放电的,不会导致充放电的性能抖动,还有就是电容可以支持透明充放电,就是自动检查电量,自动进行充电,不会说在充放电的时候让写IO直接走磁盘,但是更换电容很麻烦,而且电容比较容易老化,这个其实一般不常用
2、手动充放电,这个比较常用,包括一些大家知道的顶尖互联网大厂的数据库服务器的RAID就是用了这个方案避免性能抖动,就是关闭RAID自动充放电,然后写一个脚本,脚本每个一段时间自动在晚上凌晨的业务低峰时期,脚本手动触发充放电,这样可以避免业务高峰期的时候RAID自动充放电引起性能抖动
3、充放电的时候不要关闭write back,就是设置一下,锂电池充放电的时候不要把缓存几倍从write back修改为write through,这个也是可以做到的,可以和第二个策略配合起来使用
通过一些生产经验的学习以及一些底层技术的分析,同时结合一个真实的我们在大厂里的时候发现的一个数据库的性能抖动的案例,让大家能都把之前学到的数据库的理论知识以及底层技术,包括生产优化,都结合起来,希望都加能认真体会。

评论