咱们怎么解决机械硬盘既慢又容易坏的问题?

图片

咱们使用的计算机的全称叫电子计算机,前面有电子两个字,这说的是整个计算机中的核心元器件基本上都是电子单元组成的。但机械硬盘倒是一个特殊的例外,它更可能是用机械技术作出来的一个产品。当把带有机械技术基因的磁盘搭到计算机,尤为是再应用到服务器领域的时候,暴露出了机械技术的两个严重问题:缓存

  • 第一,速度慢。若是把内存和CPU的速度比做汽车和飞机的话,这个大哥毫秒级别的延迟几乎就是牛车级别的。 安全

  • 第二,容易坏。常常据说谁谁的磁盘坏了,不多有据说过谁的内存条,CPU坏了。笔者就有在读研期间实验室里正在拷贝资料,忽然一个断电直接废了一块硬盘的经历。服务器

要想保证服务器运转的稳定和高速,就必须解决硬盘从娘胎里带出来的这两个缺陷。ide

1多硬盘链接函数

问题简单明了,咱们要解决速度慢、容易坏两个问题。很天然,单兵做战不行,那咱们就想到往上怼一个班,多块硬盘一块儿上。但问题是,假如给你N块硬盘,让你来出一个技术方案,你会怎么设计呢?
工具

第一个方案就是,把一个文件分红N片,每一片都散列在不一样的硬盘上。这样当文件进行读取的时候,就能够N块硬盘一块儿来工做,从而达到读取速度提升到N倍的效果,这就是RAID 0。
性能

图片

图1 Raid 0方案ui

不过这个方案没有解决容易坏的问题,任何一块硬盘坏了都会致使存储系统故障。spa

第二个方案就是,仍然把文件分片,可是全部的分片都存在一块硬盘上,其它的硬盘只存拷贝。这既提升了硬盘的访问速度,也解决了坏的问题。任意一块硬盘坏了,存储系统均可以正常使用,只不过速度会打一点折扣。操作系统

图片图2 Raid 1方案

不过这个方案又带来了新的问题,那就是实现成本有点高了。假如咱们用256G硬盘想实现512G的存储容量的话,最少得须要4块硬盘才能实现。

有没有折中一点的方案呢?有,并且不少。咱们这里只说下最多见的raid5 RAID 5一样要对文件进行分片,可是不对存储的数据进行备份,而是会再单独存一个校验数据片。假如文件分为A1 A2 A3,而后须要再存一个校验片到别的磁盘上。这样无论A1,A2仍是A3那一片丢失了,均可以根据另外两片和校验片合成出来。既保证了数据的安全性,又只用了一块磁盘作冗余存储。

图片

图3 Raid5 方案

假如咱们有8块256GB的硬盘,那么RAID5方案下的磁盘阵列从用户角度来看可用的存储空间是7*256GB,只“浪费”了一块盘的空间,因此目前RAID5应用比较普遍~~

2RAID卡缓存

硬盘延迟是毫秒级别的,即便是多快硬盘并行,也只能提高数倍而已,不可以达到量级的提高。和CPU内存的纳秒级别工做频率比起来,仍是太慢了。在计算机界,没有缓存解决不了的速度问题,若是有,那就再加一层。现代磁盘自己也基本都带了缓存,另外在一些比较新的raid卡里,硬件开发者们又搞出来了一层“内存”,而且还本身附带一块电池,这就是RAID卡缓存。咱们看下几款主流RAID卡的配置:

  • PERC S120 入门软件阵列卡,主板集成无缓存 支持RAID0 1

  • PERC H330 入门硬件RAID卡,无板载缓存, 支持RAID 0 1 5 10 50

  • PERC H730 主流硬件RAID卡带有1G缓存和电池 支持RAID 0 1 5 6 10 50 60

  • PERC H730P 高性能硬件RAID卡带有2G缓存和电池 支持RAID 0 1 5 6 10 50 60

  • PERC H830 同H730P,没有内置接口,使用外置接口链接附加存储磁盘柜用

拿目前服务器端出镜率比较高的H730和H730P来看,他们分别带了1G和2G的缓存卡,而且自带电池。电池的做用就是当发现主机意外断电的时候,可以快速把缓存中的数据写回到磁盘中去。对于写入,通常操做系统写到这个RAID卡里就完事了,因此速度快。对于读取也是,只要缓存里有,就不会透传到磁盘的机械轴上。

另外想再补充说一点的就是文件相关函数里设置DIRECT I/O仅仅只能绕开操做系统自己的Page Cache,而RAID卡里的缓存,对于Linux来讲,能够说算是一个黑盒。换句话说,就是操做系统并不清楚RAID卡是从缓存里吐的数据,仍是真正从硬盘里读的。

3动手查看RAID

了解了raid基本原理之后,咱们能够实际动手查看一下机器上的raid状况。这里拿我手头的一台服务器举例。经过cat /proc/scsi/scsi,咱们能够查看到raid卡的型号

Host: scsi10 Channel: 02 Id: 01 Lun: 00
 Vendor: DELL     Model: PERC H730 Mini   Rev: 4.27
 Type:   Direct-Access  ANSI  SCSI revision: 05

能够看到个人这台服务器raid卡使用的是PERC H730, 这块RAID卡带有1G缓存和电池。再看咱们的硬盘阵列

# /opt/MegaRAID/MegaCli/MegaCli64  -LDInfo -Lall -aALL

Virtual Drive: 1 (Target Id: 1)
Name              :
RAID Level          : Primary-5, Secondary-0, RAID Level Qualifier-3
Size              : 1.633 TB
Sector Size          : 512
Is VD emulated        : No
Parity Size          : 278.875 GB
State              : Optimal
Strip Size          : 128 KB
Number Of Drives       : 7
Span Depth          : 1

RAID Level列标明的就是当前RAID组的RAIN级别。对照下面,能够看到,本机RAID Level是RAID5。

  • RAID 1: Primary-1, Secondary-0, RAID Level Qualifier-0

  • RAID 0: Primary-0, Secondary-0, RAID Level Qualifier-0

  • RAID 5: Primary-5, Secondary-0, RAID Level Qualifier-3

  • RAID 10: Primary-1, Secondary-3, RAID Level Qualifier-0

另外Strip Size叫作条带大小,我机器上的配置是128KB。假若有一个512KB的文件,它就会被分红4个条带,每一个128KB。这些条带可能会分散在不一样的磁盘上,若是一次性读取的话,多个硬盘就能够一块儿转动机械轴,读取速度就会提升到原来的数倍。不过要说明的是,若是文件小于这个条带大小,小于128K,那么RAID下的多块硬盘对于该文件的读取耗时也不会有帮助。继续查看组成RAID的全部的磁盘的情况:

#/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL
......
Drive's position: DiskGroup: 1, Span: 0, Arm: 0
Device Id: 1
.....
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]
Sector Size:  512
Logical Sector Size:  512
Physical Sector Size:  512
Inquiry Data: SEAGATE ST300MM0008     TT31S42310JR
...
Drive's position: DiskGroup: 1, Span: 0, Arm: 6
Device Id: 7
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]

看到属于DiskGroup 1的总共有7块硬盘,每块的大小都是278GB左右。6块盘的总容量大小就是1.6T左右,确实是只“浪费”了一块硬盘的容量来保障数据的安全性!

另外Inquiry Data也显示了硬盘的制造商,已经型号。这些磁盘都是希捷的300G的机械硬盘,经Google查询其转速为1万转每分钟。

4本文小结

机械技术和电子技术比较起来,稳定性要差不少。因此机械背景出身的硬盘既慢又容易坏。为了解决这个问题,RAID技术应运而生。经过必定的冗余原始存储或者校验数据提供安全性的保障,经过增长带电子基因的缓存,合理调度多块磁盘的机械轴,提升了磁盘IO的读写速度。在Linux下能够经过MegaCli工具来查看你的RAID组状况,强烈你建议实际动手查看一下!

相关文章
相关标签/搜索