前面松哥和大家聊了 CPU 和内存对于数据库性能的影响,但是大家想想,无论如何,数据最终都是要存入硬盘中的,所以硬盘肯定也会影响到数据库的性能,那么硬盘到底是如何影响数据库性能的,今天我们就来简单聊聊。
硬盘的使用,有四个不同的方向:
- 传统的机械硬盘。
- 使用 RAID 增强机械硬盘性能。
- 使用固态存储 SSD。
- 使用网络存储 NAS 和 SAN。
接下来我们就针对这四个方向逐一进行分析。
1.机械硬盘
这是最为常见的一种硬盘。松哥刚上大学那会,买笔记本电脑,基本上都是这种机械硬盘。不过现在小伙伴们买电脑,应该很多都是固态硬盘了。机械硬盘的特点就是便宜、单盘存储空间较大,不过问题也很明显,那就是读写较慢,相比于内存每秒 10GB 以上的数据传输,机械硬盘的数据真的慢的可怜。我刚毕业的时候,有一段时间特别想买 Mac,特别纠结。后来把我的 Windows 笔记本的机械硬盘换成了固态硬盘,开机可以秒开了,才把买 Mac 的想法掐灭了(一灭就是三年,三年后还是入手了 Mac)。
现在主流的机械硬盘基本上都是 7200 转的 SATA 硬盘,在全速运转并且是顺序读写的情况下,性能也就是 150MB~160MB/s 左右;如果涉及到数据库读写等随机性较强的 IO 操作,这个性能还要再下降。
传统的机械硬盘在读写数据的时候,有三个步骤:
- 寻道:磁头定位到数据所在的磁道上,这是一个非常耗时的操作。目前 SATA 硬盘的平均寻道时间一般为 8~10 ms。
- 旋转延迟:到了特定的磁道之后,硬盘盘片需要旋转,以便要读写的扇区能够和磁头吻合。7200 转的硬盘,旋转一周的时间为 1000/120=8.33 毫秒,平均旋转延时则为 4.17 毫秒左右。
- 数据传输:磁头定位到需要读取的扇区之后,开始传输数据。假设硬盘顺序读取的平均速度为 150MB/s,则读取 4KB 的数据需要
4KB*1000/(150*1024KB)=0.026
毫秒,此值几乎可以忽略不计。读取 1MB 的数据需要1MB*1000/(150MB)=6.67
毫秒,可见读取大块数据时,其真正用来读取数据的时间一般也小于寻道时间和旋转延时的和。
上面三个步骤所耗费的时间,也就是数据读取的时间。
那么该如何选择磁盘呢?我们应该从如下几个方面来考虑:
- 单盘容量尽量大。
- 数据传输速度尽量快,这个取决于磁盘主轴转动速度,以及数据存储在磁盘表面的密度,一般来说,这个并不会成为我们的瓶颈。
- 访问时间尽量够快。
- 主轴转速尽量快,根据上面的介绍,磁盘的转速会影响到数据的访问时间和读取时间。
- 还有一个就是磁盘的物理尺寸。这个也好理解,磁盘越小,数据读取速度肯定越快。不过一般来说,磁盘越小,意味着存储空间可能也会变小,这就和第一点相悖了,在实际选择中需要权衡。
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.固态硬盘
固态硬盘不需要多说,相比于传统的机械硬盘有如下三个优势:
- 没有机械结构,不怕震动(震动有可能让磁头撞到碟片上划花碟片导致损坏)。
- 没有寻道过程,因此读写文件的延迟更低。
- 连续读写文件的速度一般比机械硬盘快。
目前SSD的主流接口分为,SATA 3.0、M.2、PCI-E 三种,U.2 和 mSATA 目前并不多见。
SATA 和 M.2 或 PCI-E 的主要区别在于二者采用不同的通道:PCI-E 通道的汽车就像是在高速上行驶,而 SATA 通道的汽车就像是在崎岖山路上行驶,你说哪个速度快?
下面这张表格描述了不同接口的传输速率:
相比于机械硬盘,固态硬盘具有更好的随机读写功能,顺序读写其实机械硬盘也不差,但是随机读写就会差很多,而数据库操作中,随机读写又很重要,所以固态硬盘的优势明显。
4.网络存储
网络存储其实不太适合存储数据库文件,光是网络延迟就够令人崩溃了。不过如果想存放数据库备份文件,倒是可以用网络存储。另外就是需要注意数据库服务器的带宽要够用,别上面的东西整了一大堆,最后服务器带宽 128KB。。。
参考资料: