MySQL:RAID锂电池充放电导致MySQL数据库性能抖动

什么是RAID存储架构

MySQL数据库本质上是一个软件,它其实就是用编程语言写的一套数据库管理软件而已,底层使用磁盘来存储数据,基于内存来提升数据读写性能,然后设计了复杂的数据模型,帮我们高效的存储和管理数据。

所以MySQL数据库软件都是安装在一台linux服务器上的,然后启动MySQL的进程,就是启动了一个MySQL数据库。

MySQL运行过程中,需要使用CPU、内存、磁盘和网卡这些硬件,但是不能直接使用,都是通过调用操作系统提供的接口,依托于操作系统来使用和运行的,然后linux操作系统负责操作底层的硬件。

其关系如下:

在这里插入图片描述

一般来说,很多数据库服务器部署在机器上时,存储都是搭建RAID存储架构

为什么要引入RAID

说白了,RAID就是一个磁盘冗余阵列,什么意思呢?

假设我们的服务器里的磁盘就一块,那万一一块磁盘的容量不够怎么办?此时可以在弄几块磁盘出来放在服务器里。

但是机器里有很多磁盘就不好管理了,怎么在多块磁盘上存放数据呢?

  • 针对这个问题 ,在存储层面往往会在机器里弄多块磁盘,然后引入RAID这个技术,RAID就是用来管理机器里多块磁盘的一种磁盘阵列技术。
  • 有了RAID之后,当你在往磁盘里写数据的时候,它会告诉你应该在哪块磁盘上读写数据。如下图:

在这里插入图片描述

RAID的作用

有了RAID这种多磁盘阵列技术之后,我们就可以在一台服务器里加多块磁盘,扩大我们的磁盘存储空间了。

当我们往磁盘里写数据的时候,RAID技术可以帮助我们选择一块磁盘写入;在读取数据的时候,我们也知道从哪块磁盘去读取。

除此之外,RADI技术还可以实现数据冗余机制

所谓数据冗余机制,就是如果你现在写入了一批数据在RAID中的一块磁盘上,然后这块磁盘现在坏了,无法读取了,那岂不是丢失了一批数据。
在这里插入图片描述
所以有的RAID磁盘冗余阵列技术里,可以把你写入的同样一份数据,在两块磁盘上都写入,这样可以让两块磁盘上的数据一样,作为冗余备份。然后当一块磁盘坏掉的时候,可以从另一块磁盘读取冗余数据出来。这一切都是RAID技术自动管理的。

在这里插入图片描述

所以RAID技术实际上就是管理多块磁盘的一种磁盘阵列技术,它有软件层面的东西,也有硬件层面的东西,比如有RAID卡这种设备。

具体来说,RAID还可以分成不同的技术方案,比如RAID 0、RAID 1、RAID 0+1、RAID2,等等,一直到RAID 10,很多种不同的多磁盘管理技术方案。

RAID存储架构的电池充放电原理

RAID卡的缓存机制

服务器使用多块磁盘组成的RAID阵列的时候,一般会有一个RAID卡,这个RAID卡是带有一个缓存的,这个缓存不是直接用我们的服务器的主内存的哪种模式,而是一种跟内存类似的SDRAM。

然后我们把RAID的缓存模式设置为writeback,这样的话,所有写入到磁盘阵列的数据,会先缓存在RADI的缓存里,后继慢慢再写入到磁盘阵列里去。这种写缓存机制,可以大幅度提升我们的数据库磁盘写的性能。

在这里插入图片描述

那么问题来了,假设突然断电了,或者服务器自己故障关闭了,那么是不是这个RAID卡的缓存里的数据会突然丢失?那MySQL写入磁盘的数据不就没了吗?

在这里插入图片描述
所以正是因为如此,RAID卡一般都配置有自己独立的锂电池或者电容,如果服务器突然掉电,RAID卡是基于锂电池来供电运行的,它会赶紧把缓存里的数据写入到阵列中的磁盘上去。

在这里插入图片描述

但是锂电池是存在性能衰减问题的,所以一般来说锂电池都是要配置定时充放电的,也就是每隔30天~90天(不同的锂电池厂商是不一样的),然后自动对锂电池充放电一次,这可以延长锂电池的寿命和校准电池容量。

否则,锂电池用着用着就会发现容量不够了,可能容纳的电量在服务器调电之后,都没法一次性的把缓存里的数据写回到磁盘上去 ,那就回导致数据丢失了。

所以在锂电池充放电的过程中,RAID的缓存级别会从write back变成write through,我们通过RAID写数据的时候,IO就直接写磁盘了,如果写内存的话,性能也就是0.1ms这个级别,但是直接写磁盘,性能就退化10倍到毫秒级了。

现象

所以,如果在生产环境的数据库部署中使用了RADI多次盘阵列存储技术,建议开启RAID卡的缓存机制,但是此时一定要注意这个RAID的锂电池自动充放电的问题,因为只要你用了RAID缓存机制,那么锂电池就必然会定时进行充放电去延长寿命,保证服务器调电的时候可以把缓存数据写回磁盘,数据不会丢失。

所以这个时候一旦RAID锂电池自动充放电,往往会导致数据库服务器的RAID存储定期的性能出现几十倍的抖动,间接导致数据库每隔一段时间就会出现性能几十倍的抖动

RAID锂电池充放电导致的MySQL数据库性能抖动的优化

现场

数据库部署在高配置服务器上,磁盘用的是RAID 10的阵列技术,用了6块磁盘组成了RAID 10磁盘阵列架构

什么是RAID10

RAID 0:

  • 有很多磁盘组成了一个阵列,然后所有的数据分散写入不同磁盘,因为有多块磁盘,所以磁盘阵列的整体容量很大,而且同时写入多块磁盘,磁盘读写并发能力很强。如下图:

在这里插入图片描述

  • 但是这种模式下,最大的问题是万一你磁盘坏了一块,那么就会丢失一部分数据了。所以要严格保证磁盘数据不丢失的话,就得用RAID 1。

RAID 1:

  • 就是两块磁盘为镜像关系,你写的所有数据,在两块磁盘上都有,形成了数据冗余,一块磁盘坏了,另一块磁盘上还有数据。
  • 一块磁盘如果压力很大,可以让读请求路由到另外一个磁盘上去,分担压力,反正它们的数据是冗余的,一样的。

在这里插入图片描述
RAID10:

  • 就是RAID 0 + RAID 1组合起来。
  • 即有6块磁盘组成了一个RAID 10的阵列,那么其实就是每2块磁盘组成一个RAID 1互为镜像的架构,存放的数据是冗余一样的,一共有3组RAID 1,然后对于每一组RAID 1写入数据的时候,是用RAID 0的思路,就是不同组的磁盘的数据是不一样的,但是同一组内的两块磁盘的数据是冗余一致的,如下图。

在这里插入图片描述
所以对于这样的一个使用了RAID 10架构的服务器,内部必然会有一个锂电池,然后每次锂电池默认30天的充放电就会导致RAID写入是不经过缓存,性能会急剧下降。从而导致线上数据库每隔30天就有一次剧烈性能抖动,数据库性能下降10倍。

解决方案

对于RAID锂电池充放电问题导致的存储性能抖动,一般有三种解决方案:

  • 给RAID卡把锂电池换成电容,电容是不用频繁充放电的,不会导致充放电的性能抖动,还有就是电容可以支持透明充放电,就是自动检查电量,自动进行充电,不会说在充放电的时候让写IO直接走磁盘,但是更换电容很麻烦,而且电容比较容易老化,这个其实一般不常用
  • 手动充放电,这个比较常用,包括一些大家知道的顶尖互联网大厂的数据库服务器的RAID就是用了这个方案避免性能抖动,就是关闭RAID自动充放电,然后写一个脚本,脚本每隔一段时间自动在晚上凌晨的业务低峰时期,脚本手动触发充放电,这样可以避免业务高峰期的时候RAID自动充放电引起性能抖动
  • 充放电的时候不要关闭write back,就是设置一下,锂电池充放电的时候不要把缓存级别从write back修改为write through,这个也是可以做到的,可以和第二个策略配合起来使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值