软件磁盘阵列 Software RAID.docx
《软件磁盘阵列 Software RAID.docx》由会员分享,可在线阅读,更多相关《软件磁盘阵列 Software RAID.docx(19页珍藏版)》请在冰豆网上搜索。
软件磁盘阵列SoftwareRAID
软件磁盘阵列(SoftwareRAID)
在过去鸟哥还年轻的时代,我们能使用的硬盘容量都不大,几十GB的容量就是大硬盘了!
但是某些情况下,我们需要很大容量的储存空间,例如鸟哥在跑的空气品质模式所输出的数据文件一个案例通常需要好几GB,连续跑个几个案例,磁碟容量就不够用了。
此时我该如何是好?
其实可以透过一种储存机制,称为磁盘阵列(RAID)的就是了。
这种机制的功能是什么?
他有哪些等级?
什么是硬件、软件磁盘阵列?
Linux支持什么样的软件磁盘阵列?
底下就让我们来谈谈!
什么是RAID
磁盘阵列全名是『RedundantArraysofInexpensiveDisks,RAID』,英翻中的意思是:
容错式廉价磁盘阵列。
RAID可以透过一个技术(软件或硬件),将多个较小的磁碟整合成为一个较大的磁碟装置;而这个较大的磁碟功能可不止是储存而已,他还具有数据保护的功能呢。
整个RAID由於选择的等级(level)不同,而使得整合后的磁碟具有不同的功能,基本常见的level有这几种(注1):
∙RAID-0(等量模式,stripe):
效能最佳
这种模式如果使用相同型号与容量的磁碟来组成时,效果较佳。
这种模式的RAID会将磁碟先切出等量的区块(举例来说,4KB),然后当一个文件要写入RAID时,该文件会依据区块的大小切割好,之后再依序放到各个磁碟里面去。
由於每个磁碟会交错的存放数据,因此当你的数据要写入RAID时,数据会被等量的放置在各个磁碟上面。
举例来说,你有两颗磁碟组成RAID-0,当你有100MB的数据要写入时,每个磁碟会各被分配到50MB的储存量。
RAID-0的示意图如下所示:
图2.1.1、RAID-0的磁碟写入示意图
上图的意思是,在组成RAID-0时,每颗磁碟(DiskA与DiskB)都会先被区隔成为小区块(chunk)。
当有数据要写入RAID时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁碟去。
由於数据已经先被切割并且依序放置到不同的磁碟上面,因此每颗磁碟所负责的数据量都降低了!
照这样的情况来看,越多颗磁碟组成的RAID-0效能会越好,因为每颗负责的数据量就更低了!
这表示我的数据可以分散让多颗磁碟来储存,当然效能会变的更好啊!
此外,磁碟总容量也变大了!
因为每颗磁碟的容量最终会加总成为RAID-0的总容量喔!
只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小,然后再依序放置到各个磁碟中。
想一想,如果某一颗磁碟损毁了,那么文件数据将缺一块,此时这个文件就损毁了。
由於每个文件都是这样存放的,因此RAID-0只要有任何一颗磁碟损毁,在RAID上面的所有数据都会遗失而无法读取。
另外,如果使用不同容量的磁碟来组成RAID-0时,由於数据是一直等量的依序放置到不同磁碟中,当小容量磁碟的区块被用完了,那么所有的数据都将被写入到最大的那颗磁碟去。
举例来说,我用200G与500G组成RAID-0,那么最初的400GB数据可同时写入两颗磁碟(各消耗200G的容量),后来再加入的数据就只能写入500G的那颗磁碟中了。
此时的效能就变差了,因为只剩下一颗可以存放数据嘛!
∙RAID-1(映射模式,mirror):
完整备份
这种模式也是需要相同的磁碟容量的,最好是一模一样的磁碟啦!
如果是不同容量的磁碟组成RAID-1时,那么总容量将以最小的那一颗磁碟为主!
这种模式主要是『让同一份数据,完整的保存在两颗磁碟上头』。
举例来说,如果我有一个100MB的文件,且我仅有两颗磁碟组成RAID-1时,那么这两颗磁碟将会同步写入100MB到他们的储存空间去。
因此,整体RAID的容量几乎少了50%。
由於两颗硬盘内容一模一样,好像镜子映照出来一样,所以我们也称他为mirror模式罗~
图2.1.2、RAID-1的磁碟写入示意图
如上图所示,一份数据传送到RAID-1之后会被分为两股,并分别写入到各个磁碟里头去。
由於同一份数据会被分别写入到其他不同磁碟,因此如果要写入100MB时,数据传送到I/O汇流排后会被复制多份到各个磁碟,结果就是数据量感觉变大了!
因此在大量写入RAID-1的情况下,写入的效能可能会变的非常差(因为我们只有一个南桥啊!
)。
好在如果你使用的是硬件RAID(磁盘阵列卡)时,磁盘阵列卡会主动的复制一份而不使用系统的I/O汇流排,效能方面则还可以。
如果使用软件磁盘阵列,可能效能就不好了。
由於两颗磁碟内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的!
所以我们可以说,RAID-1最大的优点大概就在於数据的备份吧!
不过由於磁碟容量有一半用在备份,因此总容量会是全部磁碟容量的一半而已。
虽然RAID-1的写入效能不佳,不过读取的效能则还可以啦!
这是因为数据有两份在不同的磁碟上面,如果多个processes在读取同一笔数据时,RAID会自行取得最佳的读取平衡。
∙RAID0+1,RAID1+0
RAID-0的效能佳但是数据不安全,RAID-1的数据安全但是效能不佳,那么能不能将这两者整合起来配置RAID呢?
可以啊!
那就是RAID0+1或RAID1+0。
所谓的RAID0+1就是:
(1)先让两颗磁碟组成RAID0,并且这样的配置共有两组;
(2)将这两组RAID0再组成一组RAID1。
这就是RAID0+1罗!
反过来说,RAID1+0就是先组成RAID-1再组成RAID-0的意思。
图2.1.3、RAID-0+1的磁碟写入示意图
如上图所示,DiskA+DiskB组成第一组RAID0,DiskC+DiskD组成第二组RAID0,然后这两组再整合成为一组RAID1。
如果我有100MB的数据要写入,则由於RAID1的关系,两组RAID0都会写入100MB,但由於RAID0的关系,因此每颗磁碟仅会写入50MB而已。
如此一来不论哪一组RAID0的磁碟损毁,只要另外一组RAID0还存在,那么就能够透过RAID1的机制来回复数据。
由於具有RAID0的优点,所以效能得以提升,由於具有RAID1的优点,所以数据得以备份。
但是也由於RAID1的缺点,所以总容量会少一半用来做为备份喔!
∙RAID5:
效能与数据备份的均衡考量
RAID-5至少需要三颗以上的磁碟才能够组成这种类型的磁盘阵列。
这种磁盘阵列的数据写入有点类似RAID-0,不过每个循环的写入过程中,在每颗磁碟还加入一个同位检查数据(Parity),这个数据会记录其他磁碟的备份数据,用於当有磁碟损毁时的救援。
RAID-5读写的情况有点像底下这样:
图2.1.4、RAID-5的磁碟写入示意图
如上图所示,每个循环写入时,都会有部分的同位检查码(parity)被记录起来,并且记录的同位检查码每次都记录在不同的磁碟,因此,任何一个磁碟损毁时都能够藉由其他磁碟的检查码来重建原本磁碟内的数据喔!
不过需要注意的是,由於有同位检查码,因此RAID5的总容量会是整体磁碟数量减一颗。
以上图为例,原本的3颗磁碟只会剩下(3-1)=2颗磁碟的容量。
而且当损毁的磁碟数量大於等於两颗时,这整组RAID5的数据就损毁了。
因为RAID5默认仅能支持一颗磁碟的损毁情况。
在读写效能的比较上,读取的效能还不赖!
与RAID-0有的比!
不过写的效能就不见得能够添加很多!
这是因为要写入RAID5的数据还得要经过计算同位检查码(parity)的关系。
由於加上这个计算的动作,所以写入的效能与系统的硬件关系较大!
尤其当使用软件磁盘阵列时,同位检查码是透过CPU去计算而非专职的磁盘阵列卡,因此效能方面还需要评估。
另外,由於RAID5仅能支持一颗磁碟的损毁,因此近来还有发展出另外一种等级,就是RAID6,这个RAID6则使用两颗磁碟的容量作为parity的储存,因此整体的磁碟容量就会少两颗,但是允许出错的磁碟数量就可以达到两颗了!
也就是在RAID6的情况下,同时两颗磁碟损毁时,数据还是可以救回来!
∙SpareDisk:
预备磁碟的功能:
当磁盘阵列的磁碟损毁时,就得要将坏掉的磁碟拔除,然后换一颗新的磁碟。
换成新磁碟并且顺利启动磁盘阵列后,磁盘阵列就会开始主动的重建(rebuild)原本坏掉的那颗磁碟数据到新的磁碟上!
然后你磁盘阵列上面的数据就复原了!
这就是磁盘阵列的优点。
不过,我们还是得要动手拔插硬盘,此时通常得要关机才能这么做。
为了让系统可以即时的在坏掉硬盘时主动的重建,因此就需要预备磁碟(sparedisk)的辅助。
所谓的sparedisk就是一颗或多颗没有包含在原本磁盘阵列等级中的磁碟,这颗磁碟平时并不会被磁盘阵列所使用,当磁盘阵列有任何磁碟损毁时,则这颗sparedisk会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列!
然后立即重建数据系统。
如此你的系统则可以永保安康啊!
若你的磁盘阵列有支持热拔插那就更完美了!
直接将坏掉的那颗磁碟拔除换一颗新的,再将那颗新的配置成为sparedisk,就完成了!
举例来说,鸟哥之前所待的研究室有一个磁盘阵列可允许16颗磁碟的数量,不过我们只安装了10颗磁碟作为RAID5。
每颗磁碟的容量为250GB,我们用了一颗磁碟作为sparedisk,并将其他的9颗配置为一个RAID5,因此这个磁盘阵列的总容量为:
(9-1)*250G=2000G。
运行了一两年后真的有一颗磁碟坏掉了,我们后来看灯号才发现!
不过对系统没有影响呢!
因为sparedisk主动的加入支持,坏掉的那颗拔掉换颗新的,并重新配置成为spare后,系统内的数据还是完整无缺的!
嘿嘿!
真不错!
∙磁盘阵列的优点
说的口沫横飞,重点在哪里呢?
其实你的系统如果需要磁盘阵列的话,其实重点在於:
∙数据安全与可靠性:
指的并非资讯安全,而是当硬件(指磁碟)损毁时,数据是否还能够安全的救援或使用之意;
∙读写效能:
例如RAID0可以加强读写效能,让你的系统I/O部分得以改善;
∙容量:
可以让多颗磁碟组合起来,故单一文件系统可以有相当大的容量。
尤其数据的可靠性与完整性更是使用RAID的考量重点!
毕竟硬件坏掉换掉就好了,软件数据损毁那可不是闹著玩的!
所以企业界为何需要大量的RAID来做为文件系统的硬件基准,现在您有点了解了吧?
software,hardwareRAID
为何磁盘阵列又分为硬件与软件呢?
所谓的硬件磁盘阵列(hardwareRAID)是透过磁盘阵列卡来达成阵列的目的。
磁盘阵列卡上面有一块专门的芯片在处理RAID的任务,因此在效能方面会比较好。
在很多任务(例如RAID5的同位检查码计算)磁盘阵列并不会重复消耗原本系统的I/O汇流排,理论上效能会较佳。
此外目前一般的中高阶磁盘阵列卡都支持热拔插,亦即在不关机的情况下抽换损坏的磁碟,对於系统的复原与数据的可靠性方面非常的好用。
不过一块好的磁盘阵列卡动不动就上万元台币,便宜的在主板上面『附赠』的磁盘阵列功能可能又不支持某些高阶功能,例如低阶主板若有磁盘阵列芯片,通常仅支持到RAID0与RAID1,鸟哥喜欢的RAID5并没有支持。
此外,操作系统也必须要拥有磁盘阵列卡的驱动程序,才能够正确的捉到磁盘阵列所产生的磁碟机!
由於磁盘阵列有很多优秀的功能,然而硬件磁盘阵列卡偏偏又贵的很~因此就有发展出利用软件来模拟磁盘阵列的功能,这就是所谓的软件磁盘阵列(softwareRAID)。
软件磁盘阵列主要是透过软件来模拟阵列的任务,因此会损耗较多的系统资源,比如说CPU的运算与I/O汇流排的资源等。
不过目前我们的个人计算机实在已经非常快速了,因此以前的速度限制现在已经不存在!
所以我们可以来玩一玩软件磁盘阵列!
我们的CentOS提供的软件磁盘阵列为mdadm这套软件,这套软件会以partition或disk为磁碟的单位,也就是说,你不需要两颗以上的磁碟,只要有两个以上的分割槽(partition)就能够设计你的磁盘阵列了。
此外,mdadm支持刚刚我们前面提到的RAID0/RAID1/RAID5/sparedisk等!
而且提供的管理机制还可以达到类似热拔插的功能,可以线上(文件系统正常使用)进行分割槽的抽换!
使用上也非常的方便呢!
另外你必须要知道的是,硬件磁盘阵列在Linux底下看起来就是一颗实际的大磁碟,因此硬件磁盘阵列的装置档名为/dev/sd[a-p],因为使用到SCSI的模块之故。
至於软件磁盘阵列则是系统模拟的,因此使用的装置档名是系统的装置档,档名为/dev/md0,/dev/md1...,两者的装置档名并不相同!
不要搞混了喔!
因为很多朋友常常觉得奇怪,怎么他的RAID档名跟我们这里测试的软件RAID档名不同,所以这里特别强调说明喔!
软件磁盘阵列的配置
软件磁盘阵列的配置很简单呢!
简单到让你很想笑喔!
因为你只要使用一个命令即可!
那就是mdadm这个命令。
这个命令在创建RAID的语法有点像这样:
[root@www~]#mdadm--detail/dev/md0
[root@www~]#mdadm--create--auto=yes/dev/md[0-9]--raid-devices=N\
>--level=[015]--spare-devices=N/dev/sdx/dev/hdx...
选项与参数:
--create:
为创建RAID的选项;
--auto=yes:
决定创建后面接的软件磁盘阵列装置,亦即/dev/md0,/dev/md1...
--raid-devices=N:
使用几个磁碟(partition)作为磁盘阵列的装置
--spare-devices=N:
使用几个磁碟作为备用(spare)装置
--level=[015]:
配置这组磁盘阵列的等级。
支持很多,不过建议只要用0,1,5即可
--detail:
后面所接的那个磁盘阵列装置的详细资讯
上面的语法中,最后面会接许多的装置档名,这些装置档名可以是整颗磁碟,例如/dev/sdb,也可以是分割槽,例如/dev/sdb1之类。
不过,这些装置档名的总数必须要等於--raid-devices与--spare-devices的个数总和才行!
鸟哥利用我的测试机来建置一个RAID5的软件磁盘阵列给您瞧瞧!
首先,将系统里面过去练习过而目前用不到的分割槽通通删除掉:
[root@www~]#fdisk-l
Disk/dev/hda:
41.1GB,41174138880bytes
255heads,63sectors/track,5005cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*11310439183Linux
/dev/hda214128810241437+83Linux
/dev/hda3128919255116702+83Linux
/dev/hda419265005247401005Extended
/dev/hda519262052102009682Linuxswap/Solaris
/dev/hda6205323022008093+83Linux
/dev/hda723032334257008+82Linuxswap/Solaris
/dev/hda82335235315258683Linux
/dev/hda92354236610439183Linux
[root@www~]#df
Filesystem1K-blocksUsedAvailableUse%Mountedon
/dev/hda299206243858800554975642%/
/dev/hda1101086214087445923%/boot
tmpfs37133203713320%/dev/shm
/dev/hda349563161056996364348823%/home
#从上面可以发现,我的/dev/hda6~/dev/hda9没有用到!
将他删除看看!
[root@www~]#fdisk/dev/hda
Command(mforhelp):
d
Partitionnumber(1-9):
9
Command(mforhelp):
d
Partitionnumber(1-8):
8
Command(mforhelp):
d
Partitionnumber(1-7):
7
Command(mforhelp):
d
Partitionnumber(1-6):
6
Command(mforhelp):
p
Disk/dev/hda:
41.1GB,41174138880bytes
255heads,63sectors/track,5005cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*11310439183Linux
/dev/hda214128810241437+83Linux
/dev/hda3128919255116702+83Linux
/dev/hda419265005247401005Extended
/dev/hda519262052102009682Linuxswap/Solaris
Command(mforhelp):
w
[root@www~]#partprobe
#这个动作很重要!
还记得吧!
将核心的partitiontable升级!
底下是鸟哥希望做成的RAID5环境:
∙利用4个partition组成RAID5;
∙每个partition约为1GB大小,需确定每个partition一样大较佳;
∙利用1个partition配置为sparedisk
∙这个sparedisk的大小与其他RAID所需partition一样大!
∙将此RAID5装置挂载到/mnt/raid目录下
最终我需要5个1GB的partition。
由於鸟哥的系统仅有一颗磁碟,这颗磁碟剩余容量约20GB是够用的,分割槽代号仅使用到5号,所以要制作成RAID5应该是不成问题!
接下来就是连续的建置流程罗!
∙建置所需的磁碟装置
如前所述,我需要5个1GB的分割槽,请利用fdisk来建置吧!
[root@www~]#fdisk/dev/hda
Command(mforhelp):
n
Firstcylinder(2053-5005,default2053):
<==直接按下[enter]
Usingdefaultvalue2053
Lastcylinderor+sizeor+sizeMor+sizeK(2053-5005,default5005):
+1000M
#上述的动作请作五次!
Command(mforhelp):
p
Disk/dev/hda:
41.1GB,41174138880bytes
255heads,63sectors/track,5005cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*11310439183Linux
/dev/hda214128810241437+83Linux
/dev/hda3128919255116702+83Linux
/dev/hda419265005247401005Extended
/dev/hda519262052102009682Linuxswap/Solaris
/dev/hda62053217598796683Linux
/dev/hda72176229898796683Linux
/dev/hda82299242198796683Linux
/dev/hda92422254498796683Linux
/dev/hda102545266798796683Linux
#上面的6~10号,就是我们需要的partition罗!
Command(mforhelp):
w
[root@www~]#partprobe
∙以mdadm建置RAID
接下来就简单啦!
透过mdadm来创建磁盘阵列先!
[root@www~]#mdadm--create--auto=yes/dev/md0--level=5\
>--raid-devices=4--spare-devices=1/dev/hda{6,7,8,9,10}
#详细的参数说明请回去前面看看罗!
这里我透过{}将重复的项目简化!
[root@www~]#mdadm--detail/dev/md0
/dev/md0:
<==RAID装置档名
Version:
00.90.03
CreationTime:
TueMar1017:
47:
512009<==RAID被创建的时间
RaidLevel:
raid5<==RAID等级为RAID5
ArraySize:
2963520(2.83GiB3.03GB)<==此RAID的可用磁碟容量
UsedDevSize:
987840(964.85MiB1011.55MB)<==每个装置的可用容量
RaidDevices:
4<==用作RAID的装置数量
TotalDevices:
5<==全部的装置数量
PreferredMinor:
0
Persistence:
Superblockispersistent
UpdateTime:
TueMar1017:
52:
232009
State:
clean