MySQL:35 RAID锂电池充放电导致的MySQL数据库性能抖动的优化
Posted 鮀城小帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:35 RAID锂电池充放电导致的MySQL数据库性能抖动的优化相关的知识,希望对你有一定的参考价值。
1.回顾前面的内容
前面几章学完了mysql磁盘读写的机制,Linux存储系统的原理,RAID磁盘阵列的介绍,RAID锂电池定时充放电的原理。
2.案例讲解RAID锂电池充放电对性能抖动的优化
假设有一个核心的业务,他的数据库是部署在高配置服务器上的,磁盘用的是RAID 10 的阵列技术,用了6块磁盘组成了RAID 10磁盘阵列架构。
RAID 0的意思是,多个磁盘组成了一个阵列,然后所有的数据是分散写入不同磁盘的,因为有多块磁盘,所以磁盘阵列的整体容量就很大,而且同时写入多快磁盘,会让磁盘的读写并发能力很强。
如上图所示,在这种模式下,一旦磁盘坏了一块,就会丢失一部分数据。所以想要严格保证磁盘数据不丢失的话,就得用RAID 1,这个RAID 1的意思,就是两块磁盘为镜像关系,你写的所有数据,在两块磁盘上都有,形成了数据冗余,一块磁盘坏了,另外一块磁盘上还有数据。
而且,一块磁盘如果压力很大,可以让读请求路由到另外一块磁盘上去,分担压力,因为这两块磁盘的数据是一样的。
所谓的RAID 10,就是RAID 0 + RAID 1组合起来,也就是说生产环境的服务器部署中,有6块磁盘组成了一个RAID 10的阵列,那么就是每2块磁盘组成一个RAID 1互为镜像的架构,存放的数据是冗余一样的,一共有3组RAID 1,然后对于每一组RAID 1 写入数据的时候,使用RAID 0的思路,就是不同组的磁盘的数据是不一样的,但是同一组内的两块磁盘的数据是冗余一致的。
在这样一个使用了RAID 10架构的服务器内,有一个锂电池,默认是30天进行充放电,每次锂电池充放电就会导致RAID 写入时不经过缓存,性能会急剧下降,所以会发现线程数据每隔30天就会有一次剧烈性能抖动,数据库性能下降了10倍。
问题的排查,使用linux命令查看RAID硬件设备的日志,这由于不同的厂商的RAID设备有差异。最终发现RAID是每隔30天有一次充放电的日志,所以就是由于这个定期的充放电导致了线上数据库的性能定期抖动。
对于RAID锂电池充放电问题导致的存储性能抖动,一般有三种解决方案:
- 第一种方案:是把RAID卡的锂电池换成电容,电容是不用频繁充放电的,不会导致充放电的性能抖动,并且电容可以支持透明充放电,就是自动检查电量,自动进行充电,不会说在充放电的时候让写IO直接走磁盘。但是更换电容很麻烦,且容易老化。
- 第二种方案:为了避免性能抖动,关闭掉RAID自动充放电,然后写一个脚本,脚本每隔一段时间自动在晚上凌晨的业务低峰时期,脚本手动触发充放电,这样就可以避免业务高峰期的时候RAID充放电导致性能抖动;
- 充放电的时候不要关闭write back,就是设置一下,让锂电池充放电的时候不要把缓存级别从write back修改为write through,这个策略可以和第二个策略配合起来使用。
以上是关于MySQL:35 RAID锂电池充放电导致的MySQL数据库性能抖动的优化的主要内容,如果未能解决你的问题,请参考以下文章