我们使用的计算机的全称叫电子计算机,上面有电子两个字,这说的是整个计算机中的核心元元件基本上都是电子单元组成的。但机械硬碟却是一个特殊的例外,它更多是用机械技术做下来的一个产品。当把带有机械技术基因的c盘搭到计算机,尤其是再应用到服务器领域的时侯,曝露出了机械技术的两个严重问题:
要想保证服务器运转的稳定和高速,就必须解决硬碟从娘胎里带下来的这两个缺陷。
多硬碟联接
问题简单明了,我们要解决速率慢、容易坏两个问题。很自然,单兵作战不行,那我们就想到往上怼一个班,多块硬碟一起上。但问题是,如果给你N块硬碟,让你来出一个技术方案,你会如何设计呢?
第一个方案就是,把一个文件分成N片,每一片都散列在不同的硬碟上。这样当文件进行读取的时侯,就可以N块硬碟一上去工作,进而达到读取速率提升到N倍的疗效,这就是RAID0。
图1Raid0方案
不过这个方案没有解决容易坏的问题,任何一块硬碟坏了就会造成储存故障。
第二个方案就是,一直把文件分片,并且所有的分片都存在一块硬碟上,其它的硬碟只存拷贝。这既增强了硬碟的访问速率,也解决了坏的问题。任意一块硬碟坏了,储存系统都可以正常使用,只不过速率会打一点折扣。
图2Raid1方案
不过这个方案又带来了新的问题,那就是实现成本有点高了。如果我们用256G硬碟想实现512G的储存容量的话,最少得须要4块硬碟就能实现。
有没有折中一点的方案呢?有,但是好多。我们这儿只说下最常见的raid5RAID5同样要对文件进行分片,并且不对储存的数据进行备份,而是会再单独存一个校准数据片。如果文件分为A1A2A3,之后须要再存一个校准片到别的c盘上。这样不管A1,A2还是A3那一片遗失了,都可以按照另外两片和校准片合成下来。既保证了数据的安全性,又只用了一块c盘做冗余储存。
图3Raid5方案
如果我们有8块256GB的硬碟linux服务器系统,这么RAID5方案下的c盘阵列从用户角度来看可用的储存空间是7*256GB,只“浪费”了一块盘的空间,所以目前RAID5应用比较广泛~~
Raid卡缓存
硬碟延后是微秒级别的,虽然是多快硬碟并行,也只能提高数倍而已,不能否达到量级的提高。和CPU显存的脉宽级别工作频度比上去,还是太慢了。在计算机界,没有缓存解决不了的速率问题查看linux raid卡缓存,假若有,那就再加一层。现代c盘本身也基本都带了缓存,另外在一些比较新的raid卡内,硬件开发者们又搞下来了一层“内存”,但是还自己附送一块电板,这就是RAID卡缓存。我们看下几款主流RAID卡的配置:
拿目前服务器端出镜率比较高的H730和H730P来看,她们分别带了1G和2G的缓存卡,但是自带电瓶。电瓶的作用就是当发觉主机意外断电的时侯,才能快速把缓存中的数据写回到c盘中去。对于写入,通常操作系统讲到这个RAID卡内就完事了,所以速率快。对于读取也是linux vps,只要缓存里有,就不会透传到c盘的机械轴上。
另外想再补充说一点的就是文件相关函数里设置DIRECTI/O仅仅只能绕过操作系统本身的PageCache,而RAID卡内的缓存,对于Linux来说,可以说算是一个黑盒。换句话说,就是操作系统并不清楚RAID卡是从缓存里吐的数据,还是真正从硬碟里读的。
动手查看你的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卡使用的是PERCH730,这块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
RAIDLevel列标注的就是当前RAID组的RAIN级别。对照下边
可以看见,本机RAIDLevel是RAID5。
另外StripSize称作条带大小,我机器上的配置是128KB。如果有一个512KB的文件,它还会被分成4个条带,每位128KB。这种条带可能会分散在不同的c盘上,假如一次性读取的话,多个硬碟就可以一起转动机械轴,读取速率都会增强到原先的数倍。不过要说明的是,假如文件大于这个条带大小,大于128K,这么RAID下的多块硬碟对于该文件的读取历时也不会有帮助。
继续查看组成RAID的所有的c盘的状况
#/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]
见到属于DiskGroup1的总共有7块硬碟,每块的大小都是278GB左右。6块盘的总容量大小就是1.6T左右查看linux raid卡缓存,确实是只“浪费”了一块硬碟的容量来保障数据的安全性!
另外InquiryData也显示了硬碟的制造商,早已机型。这种c盘都是西数的300G的机械硬碟,经Google查询其怠速为1万转每分钟。
本文小节
机械技术和电子技术比较上去,稳定性要差好多。所以机械背景出身的硬碟既慢又容易坏。为了解决这个问题,RAID技术应运而生。通过一定的冗余原始储存或则校准数据提供安全性的保障,通过降低带电子基因的缓存,合理调度多快c盘的机械轴,提升了c盘IO的读写速率。在Linux下可以通过MegaCli工具来查看你的RAID组情况,强烈你建议实际动手查看一下!
本文原创地址://q13zd.cn/jrgnnkyprnlc.html编辑:刘遄,审核员:暂无