Linux software RAID
RAID 0: (Disk Striping)
通过使用RAID 0,RAID Controller可以试图将数据平均的分布到RAID set中去进行存储。比喻来说,可以将Disk比作是装食物的盘子,而将数据比喻成蛋糕,比方说现在你用四种口味的蛋糕,分别为巧克力,香草,樱桃和草莓 。RAID 0的初始化过程就像是将蛋糕切片,并且把切片分别发到不同的盘子当中去。而RAID 0的driver使得operating System感觉起来像是这个蛋糕完整无缺地,没有被分割地放在一个大的盘子当中去。 比如说,有四块9GB的硬盘被配置到RAID 0的RAID set中去,这时,操作系统就仅会感觉它只拥有一块36GB的硬盘。
RAID 0的目标是在多个存储设备上容纳一个大的文件系统,同时提供data redundancy. RAID 0的优点是数据访问速度。一个文件被平均存储在4个disk上,则最快读取该文件的速度可以提高四倍(多块硬盘同时读取4个block并发不用等待I/O)
RAID 0可以容纳多个容量不相同的disk。当RAID在最新的disk上用尽striping 空间后, 它会在其他盘的剩余空间上进行striping。 当这种情况发生后,在这部分空间上进行数据访问的速度会降低,因为可用的RAID drive总量变少了。 如现在又四块盘做成RAID 0, 大小分别为5GB 5GB 5GB 6GB。 第四块盘的最后一个G的空间被striping 后, 如果访问其上的数据,则仅有一个drive可用,而之前的5GB可以从4个DRIVE同时读取。
RAID 1: (Disk Mirroring)
RAID 1, 简单来说,数据除了会被写入到目标盘,还会被clone到另一个 disk。当在RAID set中的一块盘fail时, 另外一块盘还可以正常工作。当坏盘被替换或修复后,数据会自动从当前正常工作的盘复制到新替换的盘。所以,RAID 1 使得热备空闲盘成为可能,当primary disk 出现错误的时候,热备空闲盘会被自动使用来替换损坏的盘。
RAID 1提供了数据冗余,但是失去了RAID 0速度优势。RAID 1的一个缺点是每次OS想RAID 1的磁盘写数据的时候,都需要写两次。当然这是software RAID才会使用这种策略, 当使用hardware RAID的时候,OS仅写一次到RAID controller,由硬件RAID controller来完成写操作到mirror disks。
RAID 1的一个局限是他所能使用的disk总量是两个disk中最小的disk的磁盘容量。
RAID 4:
RAID 4和RAID 0 类似, 此外,RAID 4 通过将错误校正和奇偶校验信息写入另外一块盘parity disk。 所以 要组成RAID 4至少需要三块盘。而且自多仅允许一块盘损坏。如果损坏盘被替换掉以后,其上存储的原来的数据可以在parity disk帮助下恢复出来。
RAID 4结合了RAID 0的速度优势和RAID 1的数据冗余特点,但是,它最主要的缺点是它上存储的数据时striping的,但是parity 信息不被striping。所以,每次数据被写入RAID set的数据部分的时候,都需要更新parity disk上的数据,所以parity disk很容易成为瓶颈。正是因为这个原因,RAID 4 没有被广泛使用。
RAID 5:
RAID 5是为了克服RAID 4的缺点而出现的, 对于数据部分它同RAID 4使用striping存储,同时和RAID4 不一样的是对于parity部分,将和数据部分一起,进行striping存储。因此,RAID 5很好的将RAID 0 和RAID 1的优点结合起来。
RAID 5 最少需要三个disk或partition
开始之前
对于SCSI或IDE的hardware RAID,有专门的hardware-based RAID controller。一般来说RAID controller有自己的BIOS,你可以在你的系统完成POST(Power on self test)自后来多RAID controller进行配置。Hareware-based RAID 对于操作系统来说完全透明,硬件controller会完成所有的工作而不需要操作系统的干预。
如果Hardware-based RAID controller 不可用,可以使用software RAID。
IDE Drives
为了节省成本,许多小公司的系统会使用IDE disk,但是这会有很多限制。
1 IDE cable的长度很受限,仅有几英尺长。
2 IDE 不支持热交换。也就是说,不可以在系统运行时对IDE设备进行替换。
3 一个IDE controller只能支持两个设备
4 IDE 总线的性能会随着新的设备的连入而变差
5 IDE总线的一个设备的failure会使得另外一个连在同一总线的设备工作不正常。这将是致命的当一个RAID set的两个设备连在同一个cable上。
因此,在使用RAID的时候,构成RAID set的disk来自不同的controller。
Serial ATA Drives
SATA正在替换IDE disk,对于IDE来说,它拥有许多优点:
1 数据cable最长1米
2 SATA拥有更好的错误检错功能
3 每个cable仅有一个SATA设备相连,可以进行热交换,也就是在系统运行的时候进行替换SATA设备
4 没有类似于IDE设备的master和slave之分,更容易配置
5 IDE设备的最高速率为133MB/s 而SATA的是150MB/s,并且在未来有望达到600MB/s
SCSI Drives
SCSI hard disk 拥有更多优点,使得其对于IDE和SATA硬盘来说,更适合来实现RAID。
1 SCSI controller具有更强的容错功能,总线上的一个设备出错很少会影响到其他连着SCSI接口总线上的设备
2 SCSI cable最长可以达到25米,使得SCSI设备更适合数据中心应用
3 Much more than two devices may be connected to a SCSI cable bus. It can accommodate 7 (single-ended SCSI) or 15 (all other SCSI types) devices.
4 一些SCSI设备支持热交换。.
5 SCSI 支持高达 640 Mbytes/s 的传输速率。.
对于software RAID来说,是使用partition还是使用整个disk?
通常来说,在一个disk上的模型parition上做RAID,在另外一些parition作为正常的分区使用不是个好主意。显而易见,这样的话如果一个disk failure会导致整个该磁盘上的整个系统不可用。
如果你决定使用software RAID,一个disk上的所有parition都应该被划到RAID set当中,通常简单的做法是对用于software RAID的disk来说,只建立一个parition。
Disk /dev/sdb: 10.7 GB, 10737254400 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00072406
Device Boot Start End Blocks Id System
/dev/sdb1 1 1305 10482381 fd Linux raid autodetect
Disk /dev/sdc: 21.4 GB, 21474508800 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000053ad
Device Boot Start End Blocks Id System
/dev/sdc1 1 2610 20964793+ fd Linux raid autodetect
注意,建立software RAID之前备份好你原有的数据
Software RAID 会建立一个虚拟的disk, 这个disk是由物理上一个或多个disk或partion组成。建立好的RAID disk要被使用,就首先要被格式化。所以其上的原有数据将会被破坏。
在single user mode 下配置Software RAID
因为你将要修改你的disk结构,所以为了防止在你修改的同时,有人使用你需要创建software RAID disk而使用的物理disk或partition,所以要使你的系统处于single user mode 来杜绝此类情况的放生。
init 1 # runleve set to 1
配置software RAID
准备好你将在哪些disk或parition上建立software RAID。这里假设在如下三个分区上建立一个RAID 5
/dev/hde1 /dev/hdf2 /dev/hdg1
注意到这三个partition来自不同的disk,分别是hde, hdf和hdg.
如果你需要查看系统上所有的可用的filesystem,包括已经mount的和unmount的。使用fdisk –l和df –k 来查看详情.
[root@bigboy tmp]# fdisk -l Disk /dev/hda: 12.0 GB, 12072517632 bytes 255 heads, 63 sectors/track, 1467 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 13 104391 83 Linux /dev/hda2 14 144 1052257+ 83 Linux /dev/hda3 145 209 522112+ 82 Linux swap /dev/hda4 210 1467 10104885 5 Extended /dev/hda5 210 655 3582463+ 83 Linux ... ... /dev/hda15 1455 1467 104391 83 Linux [root@bigboy tmp]# [root@bigboy tmp]# df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda2 1035692 163916 819164 17% / /dev/hda1 101086 8357 87510 9% /boot /dev/hda15 101086 4127 91740 5% /data1 ... ... ... /dev/hda7 5336664 464228 4601344 10% /var [root@bigboy tmp]#
你不希望其他人使用你将要建立software RAID的disk或partition,所以先将你要是有的/dev/hde1 /dev/hdf2 /dev/hdg1 unmount掉。
接下来,使用fdisk来设置你要使用的partition:
[root@bigboy tmp]# fdisk /dev/hde The number of cylinders for this disk is set to 8355. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help):
输入m命令来获取帮助。
/dev/hde1 是/dev/hde上的第一个parition,使用fdisk的t命令来指定partition number和设置type code。如果不知道对应得type code是L命令来获取帮助。
Command (m for help): t Partition number (1-5): 1 Hex code (type L to list codes): L ... ... ... 16 Hidden FAT16 61 SpeedStor f2 DOS secondary 17 Hidden HPFS/NTF 63 GNU HURD or Sys fd Linux raid auto 18 AST SmartSleep 64 Novell Netware fe LANstep 1b Hidden Win95 FA 65 Novell Netware ff BBT Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): 为了确保你上面所做的改动已经被保存下来,是fdisk p命令来查看当前的partition table。
Command (m for help): p Disk /dev/hde: 4311 MB, 4311982080 bytes 16 heads, 63 sectors/track, 8355 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Device Boot Start End Blocks Id System /dev/hde1 1 4088 2060320+ fd Linux raid autodetect /dev/hde2 4089 5713 819000 83 Linux /dev/hde4 6608 8355 880992 5 Extended /dev/hde5 6608 7500 450040+ 83 Linux /dev/hde6 7501 8355 430888+ 83 Linux Command (m for help):
最后使用fdisk 的w命令将partition table 存储在硬盘上。对于剩下的disk或partition做同样的操作。接下来,开始准备RAID set:因为所以需要的partition都已经准备完毕,需要将它们合并到一个新的RAID partition当中去,然后我们会对新的RAID partition进行格式化并且执行mount操作。
创建RAID Set
使用mdadm命令。
[root@bigboy tmp]# mdadm --create --verbose /dev/md0 --level=5 / --raid-devices=3 /dev/hde1 /dev/hdf2 /dev/hdg1
其中 –create 是创建一个RAID set, --level=5是RAID 5 --raid-device是我们刚才准备要做RAID的三个partition。
确认RAID是否被正确初始化
raid set创建完成后,可以通过查看/proc/mdstat 来查看其状态。
root@bigboy tmp]# cat /proc/mdstat Personalities : [raid5] read_ahead 1024 sectors md0 : active raid5 hdg1[2] hde1[1] hdf2[0] 4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU] unused devices:
格式化新的RAID Set
mkfs.ext3在new RAID set上创建ext3 文件系统
[root@bigboy tmp]# mkfs.ext3 /dev/md0 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 36144 inodes, 144192 blocks 7209 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 18 block groups 8192 blocks per group, 8192 fragments per group 2008 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 33 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
创建mdadm.conf 配置文件
系统不会记住构成你RAID set的所有组件,所以你需要将这些信息记录到mdadm.conf 文件中去。使用mdadm –detail –scan –verbose > /etc/mdadm.conf
为新的RAID set创建一个挂载点
mkdir /mnt/raid
编辑/ect/fstab 开机自动挂载
/dev/md0 /mnt/raid ext3 defaults 1 2
mount RAID set
mount –a or mount /dev/md0 /mnt/raid
检查NEW RAID的状态:
/proc/mdstat