2

硬盘是如何影响数据库性能的?

 2 years ago
source link: http://www.javaboy.org/2021/0701/mysql-ssd.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前面松哥和大家聊了 CPU 和内存对于数据库性能的影响,但是大家想想,无论如何,数据最终都是要存入硬盘中的,所以硬盘肯定也会影响到数据库的性能,那么硬盘到底是如何影响数据库性能的,今天我们就来简单聊聊。

硬盘的使用,有四个不同的方向:

  1. 传统的机械硬盘。
  2. 使用 RAID 增强机械硬盘性能。
  3. 使用固态存储 SSD。
  4. 使用网络存储 NAS 和 SAN。

接下来我们就针对这四个方向逐一进行分析。

1.机械硬盘

这是最为常见的一种硬盘。松哥刚上大学那会,买笔记本电脑,基本上都是这种机械硬盘。不过现在小伙伴们买电脑,应该很多都是固态硬盘了。机械硬盘的特点就是便宜、单盘存储空间较大,不过问题也很明显,那就是读写较慢,相比于内存每秒 10GB 以上的数据传输,机械硬盘的数据真的慢的可怜。我刚毕业的时候,有一段时间特别想买 Mac,特别纠结。后来把我的 Windows 笔记本的机械硬盘换成了固态硬盘,开机可以秒开了,才把买 Mac 的想法掐灭了(一灭就是三年,三年后还是入手了 Mac)。

现在主流的机械硬盘基本上都是 7200 转的 SATA 硬盘,在全速运转并且是顺序读写的情况下,性能也就是 150MB~160MB/s 左右;如果涉及到数据库读写等随机性较强的 IO 操作,这个性能还要再下降。

传统的机械硬盘在读写数据的时候,有三个步骤:

  1. 寻道:磁头定位到数据所在的磁道上,这是一个非常耗时的操作。目前 SATA 硬盘的平均寻道时间一般为 8~10 ms。
  2. 旋转延迟:到了特定的磁道之后,硬盘盘片需要旋转,以便要读写的扇区能够和磁头吻合。7200 转的硬盘,旋转一周的时间为 1000/120=8.33 毫秒,平均旋转延时则为 4.17 毫秒左右。
  3. 数据传输:磁头定位到需要读取的扇区之后,开始传输数据。假设硬盘顺序读取的平均速度为 150MB/s,则读取 4KB 的数据需要 4KB*1000/(150*1024KB)=0.026 毫秒,此值几乎可以忽略不计。读取 1MB 的数据需要 1MB*1000/(150MB)=6.67 毫秒,可见读取大块数据时,其真正用来读取数据的时间一般也小于寻道时间和旋转延时的和。

上面三个步骤所耗费的时间,也就是数据读取的时间。

那么该如何选择磁盘呢?我们应该从如下几个方面来考虑:

  1. 单盘容量尽量大。
  2. 数据传输速度尽量快,这个取决于磁盘主轴转动速度,以及数据存储在磁盘表面的密度,一般来说,这个并不会成为我们的瓶颈。
  3. 访问时间尽量够快。
  4. 主轴转速尽量快,根据上面的介绍,磁盘的转速会影响到数据的访问时间和读取时间。
  5. 还有一个就是磁盘的物理尺寸。这个也好理解,磁盘越小,数据读取速度肯定越快。不过一般来说,磁盘越小,意味着存储空间可能也会变小,这就和第一点相悖了,在实际选择中需要权衡。

2.RAID

独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),以前也叫廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。RAID 利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或实现数据冗余,或是两者同时提升。

在具体运行中,RAID 层级不同,资料也会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID0、RAID1、RAID5、RAID6、RAID7、RAID01、RAID10、RAID50、RAID60,每种层级都有其理论上的优缺点,不同的层级在数据冗余和性能提升两个目标间获取平衡。

简单来说,RAID 把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID 常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合,由于硬盘价格的不断下降同时 RAID 功能更加有效地与主板集成,这使得 RAID 成为普通用户的一个选择,特别是需要大容量存储空间的工作使用 RAID 就特别合适,如:视频与音频制作。

我们来看看几个常见的 RAID 层级:

RAID0

RAID0 亦称为数据条带,它将两个以上的磁盘并联起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID0 的速度是最快的(想当于可以同时读取两个磁盘)。但是 RAID0 既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,RAID0 也是实现成本最低的 RAID 模式。在一些不担心数据丢失的场景下(例如数据备份),可以使用 RAID0。

RAID1

两组以上的 N 个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与 RAID 0 相同,另外写入速度有微小的降低(因为要写到两个磁盘上去)。RAID1 只要一个磁盘正常即可维持运作,可靠性最高。

其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据,当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以 RAID 1 的数据安全性在所有的 RAID 级别上来说是最好的。但无论用多少磁盘做 RAID 1,仅算一个磁盘的容量,所以它又是所有 RAID 中磁盘利用率最低的一个级别。RAID 1 可以在不影响性能的前提下,最大限度保证系统的可靠性和可修复性。

如果用两个不同大小的磁盘建 RAID 1,可用空间为较小的那个磁盘,较大的磁盘多出来的空间也可以分割成一个区来使用,不会造成浪费。

RAID5

RAID5 也称之为分布式奇偶校验磁盘阵列,这种方式通过分布式奇偶校验块把数据分散到多个磁盘上,这样如果任何一个盘数据丢失,都可以从奇偶数据校验块中重建。但是如果是两个盘的数据丢失,则整个数据卷就无法恢复了。

RAID10

RAID 10 是先分割数据再镜像。首先将所有硬盘分为两组,先对磁盘做 RAID1,然后再对两组 RAID1 的磁盘做 RAID 0,所以它的读写性能都比较好。

RAID 01 则是跟 RAID 10 的程序相反,先对磁盘做 RAID0,再做 RAID 1。

当 RAID 10 有一个硬盘受损,其余硬盘会继续运作,而 RAID 01 只要有一个硬盘受损,同组 RAID 0 的所有硬盘都会停止运作,只剩下其他组的硬盘运作,可靠性较低。因此,RAID 10 比 RAID 01 常用,零售主板绝大部分支持 RAID 0/1/5/10,但不支持 RAID 01。

那么选哪种呢?下面这张表比较了不同 RAID 层级各自的特点:

3.固态硬盘

固态硬盘不需要多说,相比于传统的机械硬盘有如下三个优势:

  1. 没有机械结构,不怕震动(震动有可能让磁头撞到碟片上划花碟片导致损坏)。
  2. 没有寻道过程,因此读写文件的延迟更低。
  3. 连续读写文件的速度一般比机械硬盘快。

目前SSD的主流接口分为,SATA 3.0、M.2、PCI-E 三种,U.2 和 mSATA 目前并不多见。

SATA 和 M.2 或 PCI-E 的主要区别在于二者采用不同的通道:PCI-E 通道的汽车就像是在高速上行驶,而 SATA 通道的汽车就像是在崎岖山路上行驶,你说哪个速度快?

下面这张表格描述了不同接口的传输速率:

相比于机械硬盘,固态硬盘具有更好的随机读写功能,顺序读写其实机械硬盘也不差,但是随机读写就会差很多,而数据库操作中,随机读写又很重要,所以固态硬盘的优势明显。

4.网络存储

网络存储其实不太适合存储数据库文件,光是网络延迟就够令人崩溃了。不过如果想存放数据库备份文件,倒是可以用网络存储。另外就是需要注意数据库服务器的带宽要够用,别上面的东西整了一大堆,最后服务器带宽 128KB。。。

参考资料:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK