1.什么是Raid;
RAID(RedundantArrayofInexpensiveDisks)称为廉价磁盘冗余阵列。RAID的基本想法是把多个便宜的小磁盘组合到一起,成为一个磁盘组,使性能达到或超过一个容量巨大、价格昂贵的磁盘。
目前RAID技术大致分为两种:基于硬件的RAID技术和基于软件的RAID技术。其中在Linux下通过自带的软件就能实现RAID功能,这样便可省去购买昂贵的硬件RAID控制器和附件就能极大地增强磁盘的IO性能和可靠性。由于是用软件去实现的RAID功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。当然基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上稍胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。
2.RAID级别介绍;
一般常用的RAID阶层,分别是RAID0、RAID1、RAID3、RAID4以及RAID5,再加上二合一型RAID0+1﹝或称RAID10﹞。我们先把这些RAID级别的优、缺点做个比较:
RAID级别相对优点相对缺点
RAID0存取速度最快没有容错
RAID1完全容错成本高
RAID3写入性能最好没有多任务功能
RAID4具备多任务及容错功能Parity磁盘驱动器造成性能瓶颈
RAID5具备多任务及容错功能写入时有overhead
RAID0+1/RAID10速度快、完全容错成本高
2.1RAID0的特点与应用;
也称为条带模式(striped),即把连续的数据分散到多个磁盘上存取,如图所示。当系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。因为读取和写入是在设备上并行完成的,读取和写入性能将会增加,这通常是运行RAID0的主要原因。但RAID0没有数据冗余,如果驱动器出现故障,那么将无法恢复任何数据。
2.2RAID1的特点与应用;
RAID1又称为镜像(Mirroring),一个具有全冗余的模式,如图所示。RAID1可以用于两个或2xN个磁盘,并使用0块或更多的备用磁盘,每次写数据时会同时写入镜像盘。这种阵列可靠性很高,但其有效容量减小到总容量的一半,同时这些磁盘的大小应该相等,否则总容量只具有最小磁盘的大小。
2.3RAID3特点与应用;
RAID3是将数据先做XOR运算,产生ParityData后,在将数据和ParityData以并行存取模式写入成员磁盘驱动器中,因此具备并行存取模式的优点和缺点。进一步来说,RAID3每一笔数据传输,都更新整个Stripe﹝即每一个成员磁盘驱动器相对位置的数据都一起更新﹞,因此不会发生需要把部分磁盘驱动器现有的数据读出来,与新数据作XOR运算,再写入的情况发生﹝这个情况在RAID4和RAID5会发生,一般称之为Read、Modify、WriteProcess,我们姑且译为为读、改、写过程﹞。因此,在所有RAID级别中,RAID3的写入性能是最好的。
RAID3的ParityData一般都是存放在一个专属的ParityDisk,但是由于每笔数据都更新整个Stripe,因此,RAID3的ParityDisk并不会如RAID4的ParityDisk,会造成存取的瓶颈。
RAID3的并行存取模式,需要RAID控制器特别功能的支持,才能达到磁盘驱动器同步控制,而且上述写入性能的优点,以目前的Caching技术,都可以将之取代,因此一般认为RAID3的应用,将逐渐淡出市场。
RAID3以其优越的写入性能,特别适合用在大型、连续性档案写入为主的应用,例如绘图、影像、视讯编辑、多媒体、数据仓储、高速数据撷取等等。
2.4RAID4特点与应用;
创建RAID4需要三块或更多的磁盘,它在一个驱动器上保存校验信息,并以RAID0方式将数据写入其它磁盘,如图所示。因为一块磁盘是为校验信息保留的,所以阵列的大小是(N-l)*S,其中S是阵列中最小驱动器的大小。就像在RAID1中那样,磁盘的大小应该相等。
如果一个驱动器出现故障,那么可以使用校验信息来重建所有数据。如果两个驱动器出现故障,那么所有数据都将丢失。不经常使用这个级别的原因是校验信息存储在一个驱动器上。每次写入其它磁盘时,都必须更新这些信息。因此,在大量写入数据时很容易造成校验磁盘的瓶颈,所以目前这个级别的RAID很少使用了。
RAID4是采取独立存取模式,同时以单一专属的ParityDisk来存放ParityData。RAID4的每一笔传输﹝Strip﹞资料较长,而且可以执行OverlappedI/O,因此其读取的性能很好。
但是由于使用单一专属的ParityDisk来存放ParityData,因此在写入时,就会造成很大的瓶颈。因此,RAID4并没有被广泛地应用。
2.5RAID5特点与应用;
在希望结合大量物理磁盘并且仍然保留一些冗余时,RAID5可能是最有用的RAID模式。RAID5可以用在三块或更多的磁盘上,并使用0块或更多的备用磁盘。就像RAID4一样,得到的RAID5设备的大小是(N-1)*S。
RAID5与RAID4之间最大的区别就是校验信息均匀分布在各个驱动器上,如图4所示,这样就避免了RAID4中出现的瓶颈问题。如果其中一块磁盘出现故障,那么由于有校验信息,所以所有数据仍然可以保持不变。如果可以使用备用磁盘,那么在设备出现故障之后,将立即开始同步数据。如果两块磁盘同时出现故障,那么所有数据都会丢失。RAID5可以经受一块磁盘故障,但不能经受两块或多块磁盘故障。
RAID5也是采取独立存取模式,但是其ParityData则是分散写入到各个成员磁盘驱动器,因此,除了具备OverlappedI/O多任务性能之外,同时也脱离如RAID4单一专属ParityDisk的写入瓶颈。但是,RAI?D5在座资料写入时,仍然稍微受到"读、改、写过程"的拖累。
由于RAID5可以执行OverlappedI/O多任务,因此当RAID5的成员磁盘驱动器数目越多,其性能也就越高,因为一个磁盘驱动器再一个时间只能执行一个Thread,所以磁盘驱动器越多,可以Overlapped的Thread就越多,当然性能就越高。但是反过来说,磁盘驱动器越多,数组中可能有磁盘驱动器故障的机率就越高,整个数组的可靠度,或MTDL(MeanTimetoDataLoss)就会降低。
由于RAID5将ParityData分散存在各个磁盘驱动器,因此很符合XOR技术的特性。例如,当同时有好几个写入要求发生时,这些要写入的数据以及ParityData可能都分散在不同的成员磁盘驱动器,因此RAID控制器可以充分利用OverlappedI/O,同时让好几个磁盘驱动器分别作存取工作,如此,数组的整体性能就会提高很多。
基本上来说,多人多任务的环境,存取频繁,数据量不是很大的应用,都适合选用RAID5架构,例如企业档案服务器、WEB服务器、在线交易系统、电子商务等应用,都是数据量小,存取频繁的应用。
2.6RAID0+1﹝RAID10﹞的特点与应用;
RAID0+1/RAID10,综合了RAID0和RAID1的优点,适合用在速度需求高,又要完全容错,当然经费也很多的应用。RAID0和RAID1的原理很简单,合起来之后还是很简单,我们不打算详细介绍,倒是要谈谈,RAID0+1到底应该是RAID0overRAID1,还是RAID1overRAID0,也就是说,是把多个RAID1做成RAID0,还是把多个RAID0做成RAID1?
RAID0overRAID1
假设我们有四台磁盘驱动器,每两台磁盘驱动器先做成RAID1,再把两个RAID1做成RAID0,这就是RAID0overRAID1:
(RAID1)A=DriveA1+DriveA2(Mirrored)
(RAID1)B=DriveB1+DriveB2(Mirrored)
RAID0=(RAID1)A+(RAID1)B(Striped)
RAID1overRAID0
假设我们有四台磁盘驱动器,每两台磁盘驱动器先做成RAID0,再把两个RAID0做成RAID1,这就是RAID1overRAID0:
(RAID0)A=DriveA1+DriveA2(Striped)
(RAID0)B=DriveB1+DriveB2(Striped)
RAID1=(RAID1)A+(RAID1)B(Mirrored)
在这种架构之下,如果(RAID0)A有一台磁盘驱动器故障,(RAID0)A就算毁了,当然RAID1仍然可以正常工作;如果这时(RAID0)B也有一台磁盘驱动器故障,(RAID0)B也就算毁了,此时RAID1的两磁盘驱动器都算故障,整个RAID1资料就毁了。
因此,RAID0OVERRAID1应该比RAID1OVERRAID0具备比较高的可靠度。所以我们建议,当采用RAID0+1/RAID10架构时,要先作RAID1,再把数个RAID1做成RAID0。
3.怎样选择Raid级别;
RAID012345到底哪一种适合你,不只是成本问题,容错功能和传输性能的考虑以及未来之可扩充性都应该符合应用的需求。
RAID在市场上的的应用,已经不是新鲜的事儿了,很多人都大略了解RAID的基本观念,以及各个不同RAIDLEVEL的区分。但是在实际应用面,我们发现,有很多使用者对于选择一个合适的RAIDLEVEL,仍然无法很确切的掌握,尤其是对于RAID0+1(10),RAID3,RAID5之间的选择取舍,更是举棋不定。
3.1RAID条切striped的存取模式;
在使用数据条切﹝DataStripping﹞的RAID系统之中,对成员磁盘驱动器的存取方式,可分为两种:
并行存取﹝ParalleledAccess﹞
独立存取﹝IndependentAccess﹞
RAID2和RAID3是采取并行存取模式。
RAID0、RAID4、RAID5及RAID6则是采用独立存取模式。
3.2平行存取模式;
并行存取模式支持里,是把所有磁盘驱动器的主轴马达作精密的控制,使每个磁盘的位置都彼此同步,然后对每一个磁盘驱动器作一个很短的I/O数据传送,如此一来,从主机来的每一个I/O指令,都平均分布到每一个磁盘驱动器。
为了达到并行存取的功能,RAID中的每一个磁盘驱动器,都必须具备几乎完全相同的规格:转速必须一样;磁头搜寻速度﹝AccessTime﹞必须相同;Buffer或Cache的容量和存取速度要一致;CPU处理指令的速度要相同;I/OChannel的速度也要一样。总而言之,要利用并行存取模式,RAID中所有的成员磁盘驱动器,应该使用同一厂牌,相同型号的磁盘驱动器。
3.2.1并行存取的基本工作原理;
假设RAID****有四部相同规格的磁盘驱动器,分别为磁盘驱动器A、B、C和D,我们在把时间轴略分为T0、T1、T2、T3和T4:
T0:RAID控制器将第一笔数据传送到A的Buffer,磁盘驱动器B、C和D的Buffer都是空的,在等待中
T1:RAID控制器将第二笔数据传送到B的Buffer,A开始把Buffer中的数据写入扇区,磁盘驱动器C和D的Buffer都是空的,在等待中
T2:RAID控制器将第三笔数据传送到C的Buffer,B开始把Buffer中的数据写入扇区,A已经完成写入动作,磁盘驱动器D和A的Buffer都是空的,在等待中
T3:RAID控制器将第四笔数据传送到D的Buffer,C开始把Buffer中的数据写入扇区,B已经完成写入动作,磁盘驱动器A和B的Buffer都是空的,在等待中
T4:RAID控制器将第五笔数据传送到A的Buffer,D开始把Buffer中的数据写入扇区,C已经完成写入动作,磁盘驱动器B和C的Buffer都是空的,在等待中
如此一直循环,一直到把从主机来的这个I/O指令处理完毕,RAID控制器才会受处理下一个I/O指令。重点是在任何一个磁盘驱动器准备好把数据写入扇区时,该目的扇区必须刚刚好转到磁头下。同时RAID控制器每依次传给一个磁盘驱动器的数据长度,也必须刚刚好,配合磁盘驱动器的转速,否则一旦发生miss,RAID性能就大打折扣。
3.2.2并行存取RAID的最佳应用;
并行存取RAID之架构,以其精细的马达控制和分布之数据传输,将数组中每一个磁盘驱动器的性能发挥到最大,同时充分利用StorageBus的频宽,因此特别适合应用在大型、数据连续的档案存取应用,例如:
影像、视讯档案服务器
数据仓储系统
多媒体数据库
电子图书馆
印前或底片输出档案服务器
其它大型且连续性档案服务器
由于并行存取RAID架构之特性,RAID控制器一次只能处理一个I/O要求,无法执行Overlapping的多任务,因此非常不适合应用在I/O次数频繁、数据随机存取、每笔数据传输量小的环境。同时,因为并行存取无法执行Overlapping的多任务,因此没有办法"隐藏"磁盘驱动器搜寻﹝seek﹞的时间,而且在每一个I/O的第一笔数据传输,都要等待第一个磁盘驱动器旋转延迟﹝rotationallatency﹞,平均为旋转半圈的时间,如果使用一万转的磁盘驱动器,平均就需要等待50usec。所以机械延迟时间,是并行存取架构的最大问题。
3.3独立存取模式;
相对于并行存取模式,独立存取模式并不对成员磁盘驱动器作同步转动控制,其对每个磁盘驱动器的存取,都是独立且没有顺序和时间间格的限制,同时每笔传输的数据量都比较大。因此,独立存取模式可以尽量地利用overlapping多任务、TaggedCommandQueuing等等高阶功能,来"隐藏"上述磁盘驱动器的机械时间延迟﹝Seek和RotationalLatency﹞。
由于独立存取模式可以做overlapping多任务,而且可以同时处理来自多个主机不同的I/ORequests,在多主机环境﹝如Clustering﹞,更可发挥最大的性能。
3.3.1独立存取RAID的最佳应用;
由于独立存取模式可以同时接受多个I/ORequests,因此特别适合应用在数据存取频繁、每笔数据量较小的系统。例如:
在线交易系统或电子商务应用
多使用者数据库
ERM及MRP系统
小文件之文件服务器
4.创建和维护Raid;
4.1mdadm;
在Linux服务器中是通过mdadm工具来创建和维护软RAID的,mdadm在创建和管理软RAID时非常方便,而且很灵活。mdadm常用的参数有如下:
*--create或-C:创建一个新的软RAID,后面接raid设备的名称。例如,/dev/md0,/dev/md1等。
*--assemble或-A:加载一个已存在的阵列,后面跟阵列以及设备的名称。
*--detail或-D:输出指定RAID设备的详细信息。
*--stop或-S:停止指定的RAID设备。
*--level或-l:设置RAID的级别,例如,设置--level=5则表示创建阵列的级别是RAID5。
*--raid-devices或-n:指定阵列中活动磁盘的数目。
*--scan或-s:扫描配置文件或/proc/mdstat文件来搜索软RAID的配置信息,该参数不能单独使用,只能配置其它参数才能使用。
下面将通过一个实例来讲述通过mdadm如何实现软RAID的功能。
4.1.1创建分区;
【实例1】
某台机器上有4块空闲的硬盘,分别是/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde,并用这四块硬盘来创建来创建一个RAID5,具体操作步骤如下:
首先使用fdisk命令在每块硬盘上创建一个分区,操作如下:
root@xiaop-laptop:/#fdisk/dev/sdb
DevicecontainsneitheravalidDOSpartitiontable,norSun,SGIorOSFdisklabel
BuildinganewDOSdisklabel.Changeswillremaininmemoryonly,
untilyoudecidetowritethem.Afterthat,ofcourse,theprevious
contentwon'tberecoverable.
Warning:invalidflag0x0000ofpartitiontable4willbecorrectedbyw(rite)
Command(mforhelp):n#按n创建新分区
Commandaction
eextended
pprimarypartition(1-4)#输入p选择创建主分区
p
Partitionnumber(1-4):1#输入1创建第一个主分区
Firstcylinder(1-102,default1):#直接回车,选择分区开始柱面这里就从1开始
Usingdefaultvalue1
Lastcylinderor+sizeor+sizeMor+sizeK(1-102,default102):
Usingdefaultvalue102
Command(mforhelp):w#然后输入w写盘
Thepartitiontablehasbeen altered!
Callingioctl()tore-readpartitiontable.
Syncingdisks.
针对其余几块硬盘也做相同操作,按照此步骤在另外的两块磁盘上做同样的操作;
全部做完后,运行fdisk-l应该可以看到如下信息:
Disk/dev/sdb:214MB,214748160bytes
64heads,32sectors/track,204cylinders
Units=cylindersof2048*512=1048576bytes
DeviceBootStartEndBlocksIdSystem
/dev/sdb11204208880fdLinuxraidautodetect
Disk/dev/sdc:214MB,214748160bytes
64heads,32sectors/track,204cylinders
Units=cylindersof2048*512=1048576bytes
DeviceBootStartEndBlocksIdSystem
/dev/sdc11204208880fdLinuxraidautodetect
Disk/dev/sdd:214MB,214748160bytes
64heads,32sectors/track,204cylinders
Units=cylindersof2048*512=1048576bytes
DeviceBootStartEndBlocksIdSystem
/dev/sdd11204208880fdLinuxraidautodetect
看到上面三个磁盘上分别建了一个分区,分区大小都一样;
4.1.2创建RAID5;
创建完/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个分区后,下面就可以来创建RAID5了,其中设定/dev/sde1作为备用设备,其余为活动设备,备用设备的作用是一旦某一设备损坏可以立即使用备用设备替换。操作命令如下:
root@xiaop-laptop:/#mdadm--create/dev/md0--level=5--raid-devices=3--spare-devices=1/dev/sd[b-e]1
mdadm:array/dev/md0started.
其中--spare-devices=1表示当前阵列中备用设备只有一块,即作为备用设备的/dev/sde1,若有多块备用设备,则将--spare-devices的值设置为相应的数目。成功创建完成RAID设备后,通过如下命令可以查看到RAID的详细信息:
root@xiaop-laptop:/#mdadm--detail/dev/md0
/dev/md0:
Version:00.90.01
CreationTime:MonJan2210:55:492007
RaidLevel:raid5
ArraySize:208640(203.75MiB213.65MB)
DeviceSize:104320(101.88MiB106.82MB)
RaidDevices:3
TotalDevices:4
PreferredMinor:0
Persistence:Superblockispersistent
UpdateTime:MonJan2210:55:522007
State:clean
ActiveDevices:3
WorkingDevices:4
FailedDevices:0
SpareDevices:1
Layout:left-symmetric
ChunkSize:64K
NumberMajorMinorRaidDeviceState
08170activesync/dev/sdb1
18331activesync/dev/sdc1
28492activesync/dev/sdd1
3865-1spare/dev/sde1
UUID:b372436a:6ba09b3d:2c80612c:efe19d75
Events:0.6
4.1.3创建RAID的配置文件;
RAID的配置文件名为mdadm.conf,默认是不存在的,所以需要手工创建,该配置文件存在的主要作用是系统启动的时候能够自动加载软RAID,同时也方便日后管理。mdadm.conf文件内容包括:由DEVICE选项指定用于软RAID的所有设备,和ARRAY选项所指定阵列的设备名、RAID级别、阵列中活动设备的数目以及设备的UUID号。生成RAID配置文件操做如下:
root@xiaop-laptop:/#mdadm--detail--scan>/etc/mdadm.conf
但是当前生成mdadm.conf文件的内容并不符合所规定的格式,所以也是不生效的,这时需要手工修改该文件内容为如下格式:
root@xiaop-laptop:/#vi/etc/mdadm.conf
DEVICE/dev/sdb1/dev/sdc1/dev/sdd1/dev/sde1
ARRAY/dev/md0level=raid5num-devices=3UUID=b372436a:6ba09b3d:2c80612c:efe19d75
如果没有创建RAID的配置文件,那么在每次系统启动后,需要手工加载软RAID才能使用,手工加载软RAID的命令是:
root@xiaop-laptop:/#mdadm--assemble/dev/md0/dev/sdb1/dev/sdc1/dev/sdd1/dev/sde1
mdadm:/dev/md0hasbeenstartedwith3drivesand1spare.
4.1.4创建文件系统;
接下来就只需要在RAID设备上创建文件系统就可使用了,在RAID设备上创建文件系统和在分区或磁盘上创建文件系统的方法一样。在设备/dev/md0上创建ext3的文件系统命令如下:
root@xiaop-laptop:/#mkfs.ext3/dev/md0
创建完文件系统后,将该设备挂载上就可正常的使用了。如果要创建其它级别的RAID,其步骤和创建RAID5基本都一样,区别在于指定--level值的时候,需要将该值设置为相应的级别。
4.2维护软RAID;
软RAID虽然很大程度上能保证数据的可靠性,但是在日常的工作中,有时可能需要对RAID进行调整以及不排除RAID设备物理介质损坏的可能等相关问题
,当遇到这些情况时,那么同样可以通过mdadm命令来完成这些操作。下面也将通过一个实例来介绍更换RAID故障磁盘的完整过程。
4.2.1模拟故障磁盘;
【实例2】
以前面的【实例1】为基础,假定其中的/dev/sdc1设备出现故障时,更换一个新的磁盘,整个过程的详细说明如下:
在实际中,当软RAID检测到某个磁盘有故障时,会自动标记该磁盘为故障磁盘,并停止对故障磁盘的读写操作,所以这里需要将/dev/sdc1标记为出现故障的磁盘,命令如下:
root@xiaop-laptop:/#mdadm/dev/md0--fail/dev/sdc1
mdadm:set/dev/sdc1faultyin/dev/md0
由于【实例1】中的RAID5设置了一个备用设备,所以当有标记为故障磁盘的时候,备用磁盘会自动顶替故障磁盘工作,阵列也能够在短时间内实现重建。通过/proc/mdstat文件可查看到当前阵列的状态,如下:
root@xiaop-laptop:/#cat/proc/mdstat
Personalities:[raid5]
md0:activeraid5sde1[3]sdb1[0]sdd1[2]sdc1[4](F)
208640blockslevel5,64kchunk,algorithm2[3/2][U_U]
[=====>...............]recovery=26.4%(28416/104320)finish=0.0minspeed=28416K/sec
unuseddevices:<none>
以上信息表明阵列正在重建,当一个设备出现故障或被标记故障时,相应设备的方括号后将被标以(F),如sdc1[4](F),其中[3/2]的第一位数表示阵列所包含的设备数,第二位数表示活动的设备数,因为目前有一个故障设备,所以第二位数为2;这时的阵列以降级模式运行,虽然该阵列仍然可用,但是不具有数据冗余;而[U_U]表示当前阵列可以正常使用的设备是/dev/sdb1和/dev/sdd1,如果是设备/dev/sdb1出现故障时,则将变成[_UU]。
重建完数据后,再次查看阵列状态时,就会发现当前的RAID设备又恢复了正常,如下:
root@xiaop-laptop:/#cat/proc/mdstat
Personalities:[raid5]
md0:activeraid5sde1[1]sdb1[0]sdd1[2]sdc1[3](F)
208640blockslevel5,64kchunk,algorithm2[3/3][UUU]
unuseddevices:<none>
4.2.2移除故障磁盘;
既然/dev/sdc1出现了故障,当然要移除该设备,移除故障磁盘的操作如下:
root@xiaop-laptop:/#mdadm/dev/md0--remove/dev/sdc1
mdadm:hotremoved/dev/sdc1
其中—remove表示移除指定RAID设备中的某个磁盘,也可用-r来代替该参数。
4.2.3添加新硬盘;
在添加新的硬盘前,同样需要对新硬盘进行创建分区的操作,例如,添加新硬盘的设备名为/dev/sdc1,则具体操作如下:
root@xiaop-laptop:/#mdadm/dev/md0--add/dev/sdc1
mdadm:hotadded/dev/sdc1
其中--add与前面的--remove其义刚好相反,用于将某个磁盘添加到指定的设备中,也可用-a代替该参数。
由于【实例1】中的RAID5设置了一个备用设备,所以不需要做任何操作RAID5也能正常运行,但是如果这时某块磁盘再出现故障的话,会导致RAID5没有数据冗余功能,这对于存放重要的数据的设备来说显得太不安全了。那么这时增加到RAID5中的/dev/sdc1则作为备用设备出现在阵列中,如下:
root@xiaop-laptop:/#mdadm--detail/dev/md0
/dev/md0:
NumberMajorMinorRaidDeviceState
08170activesync/dev/sdb1
18651activesync/dev/sde1
28492activesync/dev/sdd1
3833-1spare/dev/sdc1
UUID:b372436a:6ba09b3d:2c80612c:efe19d75
Events:0.133