MySQL与Linux交互与RAID充放电

 
MySQL磁盘随机读写:
执行CURD时,会从表空间中磁盘文件里读取数据,可能在随机的位置读取一个数据页到缓存,这就是磁盘随机读,性能比较差。
磁盘随机读关注IOPS和响应延迟:
  • IOPS代表底层存储系统每秒可以执行多少次磁盘读写操作,IOPS越高,数据库并发能力越强。
  • 磁盘读写操作的响应延迟对数据库性能影响很大,比如一个sql语句,磁盘要执行随机读操作加载多个数据页,此时每个磁盘随机读响应时间是50ms,那么可能导致sql执行要几百ms。如果是10ms,sql执行就只要100ms。
核心业务数据库推荐用SSD固态,随机读写并发能力和响应延迟比机械硬盘好得多,可以大幅度提升数据库的QPS和性能。
MySQL磁盘顺序读写:写redo log是磁盘顺序写,在磁盘日志文件中,一直在末尾追加日志。磁盘顺序写性能与内存随机读写性能差不多,更新语句时,必然会写入redo log,所以每秒可以读写磁盘的数据量的吞吐量指标,就是每秒可以写入多少redo log日志。
MySQL数据库与Linux存储系统交互:
  MySQL实际是一套数据库管理软件,底层由磁盘存储数据,基于内存提升读写性能,在运行过程中,需要使用CPU、内存、磁盘和网卡等硬件,通过调用操作系统提供的接口,依托于操作系统来使用和运行,Linux操作系统负责底层硬件的操作。

Linux存储系统分为VFS层,文件系统层,Page Cache缓存层,通用Block层,IO调度层,Block设备驱动层,Block设备层。Linux利用这套系统管理机器上的机械硬盘,SSD固态等存储设备,执行读写数据。Linux存储系统的底层原理如下:

RAID存储架构:
  • 数据库部署在机器上,都是搭建的RAID存储架构,即磁盘冗余阵列。服务器如果就一块磁盘,容量不够的话就需要多弄几块,当多个磁盘存在时,如何存放数据,RAID就是用来管理机器里多块磁盘的一种磁盘阵列技术。读写数据时,告知需要在哪块磁盘读写数据。
  • 当一批数据在RAID的一块磁盘中,此时磁盘坏了,无法读取,为了防止数据丢失,RAID通过数据冗余机制,将数据进行备份。
  • 服务器使用多块磁盘组成RAID阵列时,会有一个RAID卡,这个卡带有缓存,类似基于内存存储。一般RAID的缓存模式为write back,所有写入磁盘阵列的数据,会先缓存再RAID卡的缓存中,后续慢慢写入到磁盘阵列,写缓冲机制,可以大幅度提升数据库磁盘写性能。
RAID的电池充电放电:
  • 当断电造成服务器关闭了,RAID卡的缓存数据会突然丢失,为此RAID卡一般配置有独立的锂电池,当服务断电无法接通电源了,RAID卡会基于自带的电池供电,然后将缓存数据写入磁盘中。
  • 但是锂电池存在性能衰减问题,一般锂电池都需要配置定时充放电,大概每隔30-90天,会自动充放电,来延迟使用寿命和校准电池容量。在电池充放电过程中,RAID缓存级别会从write back变成write through,通过RAID写数据时,IO直接就写磁盘了,如果写内存性能大概是0.1ms级别,但是直接写磁盘,性能会退化到毫秒级。
  • 所以使用了RAID多磁盘阵列技术的公司,通常都开启了缓存机制,当RAID锂电池充放电时,往往会造成数据库服务器的RAID存储定期的性能出现几十倍的抖动,间接导致数据库每隔一段时间出现性能几十倍的抖动。
解决方案:
  1. 将RAID卡的锂电池换成电容的,电容不用频繁充放电,不会导致充放电性能抖动。电容支持透明充放电,自动检查电量进行充电,不会在充放电时让写IO直接走磁盘。但是电容更换麻烦,老化快,不常用
  2. 手动充放电,关闭RAID自动充放电,写脚本来处理,隔一段时间在业务低峰期,脚本手动触发充放电,避免业务高峰期的性能抖动
  3. 充放电时不关闭write back,避免IO直接走磁盘
posted @ 2025-04-16 17:28  难得  阅读(22)  评论(0)    收藏  举报