一,RAID:独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。因为多个硬盘增加了平均故障间隔时间(MTBF),储存冗余数据也增加了容错。整个 RAID 由于选择的等级(level 仅用于标识磁盘的组合方式的不同) 不同,而使得整合后的磁盘具有不同的功能, 基本常见的 level 有这几种 "RAID0(条带), RAID1(镜像), RAID5, RAID0+1, RAID1+0"。
RAID0(等量模式, stripe):效能最佳
这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (举例来说, 4KB), 然后当一个档案要写入 RAID 时,该档案会依据区块的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。如果某一颗磁盘损毁了,那么档案数据将缺一块,此时这个档案就损毁了。 由于每个档案都是这样存放的,因此 RAID-0 只要有任何一颗磁盘损毁,在 RAID 上面的所有数据都会遗失而无法读取。
PS:RAID0 至少需要两块相同型号与容量的磁盘,没有容错能力,读写性能都提升,空间利用率100%。
RAID-1 (映像模式, mirror):完整备份
这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘啦!如果是不同容量的磁盘组成 RAID-1 时,那么总容量将以最小的那一颗磁盘为主!这种模式主要是(让同一份数据,完整的保存在两颗磁盘上头)。举例来说,如果我有一个 100MB 的档案,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。由于两颗硬盘内容一模一样,好像镜子映照出来一样, 所以我们也称他为 mirror 模式。由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入 100MB 时,数据传送到 I/O 总线后会被复制多份到各个磁盘, 结果就是数据量感觉变大了!因此在大量写入 RAID-1 的情况下,写入的效能可能会变的非常差 (因为我们只有一个南桥啊!)。 好在如果你使用的是硬件 RAID (磁盘阵列卡) 时,磁盘阵列卡会主动的复制一份而不使用系统的 I/O 总线,效能方面则还可以。 如果使用软件磁盘阵列,可能效能就不好了。
PS:RAID1 至少需要两块相同型号与容量的磁盘,有硬件容错能力,读性能提升,写性能下降,空间利用率50%。
RAID 5:效能与数据备份的均衡考虑
RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似
RAID-0 , 不过每个循环的写入过程中,在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。每个循环写入时,都会有部分的同位检查码 (parity) 被记录起来,并且记录的同位检查码每次都记录在不同的磁盘, 因此,任何一个磁盘损毁时都能够藉由其他磁盘的检查码来重建原本磁盘内的数据喔!不过需要注意的是, 由于有同位检查码,因此 RAID 5 的总容量会是整体磁盘数量减一颗。例如 原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的资料就损毁了。 因为 RAID 5 预设仅能支持一颗磁盘的损毁情况。
PS:RAID5 至少需要三块相同型号与容量的磁盘,允许一块盘出错,读写性能提升,空间利用率(n-1)/n * 100%。
RAID 0+1,RAID 1+0:
RAID-0 的效能佳但是数据不安全,RAID-1 的数据安全但是效能不佳;那么能不能将这两者整合起来设
定 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所谓的 RAID 0+1 就是: (1)先让两颗磁盘组成 RAID 0,并且这样的设定共有两组; (2)将这两组 RAID 0 再组成一组 RAID 1。这就是 RAID 0+1 �!反过来说,RAID 1+0 就是先组成 RAID-1 再组成 RAID-0 的意思。
如上图所示,Disk A + Disk B 组成第一组 RAID 0,Disk C + Disk D 组成第二组 RAID 0, 然后这两组再整合成为一组 RAID 1。如果我有 100MB 的数据要写入,则由于 RAID 1 的关系, 两组 RAID 0 都会写入 100MB,但由于 RAID 0 的关系,因此每颗磁盘仅会写入 50MB 而已。 如此一来不论哪一组RAID 0 的磁盘损毁,只要另外一组 RAID 0 还存在,那么就能够透过 RAID 1 的机制来回复数据。 由于具有 RAID 0 的优点,所以效能得以提升,由于具有 RAID 1 的优点,所以数据得以备份。 但是也由于 RAID 1 的缺点,所以总容量会少一半用来做为备份喔!
Spare Disk:预备磁盘的功能
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启动磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘,此时通常得要关机才能这么做。为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助。 所谓的spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列! 然后立即重建数据系统。如此你的系统则可以永保安康啊!若你的磁盘阵列有支持热拔插那就更完美了! 直接将坏掉的那颗磁盘拔除换一颗新的,再将那颗新的设定成为 spare disk ,就完成了!
硬件RAID与软件RAID之分:
硬件RAID:所谓的硬件磁盘阵列 (hardware RAID) 是透过磁盘阵列卡来达成数组的目的。 磁盘阵列卡上面有一块专门的芯片在处理 RAID 的任务,因此在效能方面会比较好。在很多任务 (例如 RAID 5 的同位检查码计算) 磁盘阵列并不会重复消耗原本系统的 I/O 总线,理论上效能会较佳。此外目前一般的中高阶磁盘阵列卡都支持热拔插, 亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。使用硬件RAID 操作系统也必须要拥有磁盘阵列卡的驱动程序,才能够正确的捉到磁盘阵列所产生的磁盘驱动器!
软件RAID:软件来仿真磁盘阵列的功能, 这就是所谓的软件磁盘阵列 (software RAID)。软件磁盘阵列主要是透过软件来仿真数组的任务, 因此会损耗较多的系统资源,比如说 CPU 的运算与 I/O 总线的资源等。我们的 CentOS 提供的软件磁盘阵列为 mdadm 这套软件,这套软件会以 partition 或 disk 为磁盘的单位,也就是说,你不需要两颗以上的磁盘,只要有两个以上的分割槽 (partition) 就能够设计你的磁盘阵列了。此外, mdadm 支持刚刚我们前面提到的 RAID0/RAID1/RAID5/spare disk 等! 而且提供的管理机制还可以达到类似热拔插的功能,可以在线 (文件系统正常使用) 进行分割槽的抽换。
PS:硬件磁盘阵列在 Linux 底下看起来就是一颗实际的大磁盘,因此硬件磁盘阵列的设备文件名为 /dev/sd[a-p] ,因为使用到 SCSI 的模块之故。至于软件磁盘阵列则是系统仿真的,因此使用的设备文件名是系统的设备文件, 文件名为 /dev/md0, /dev/md1...,两者的设备文件名并不相同。通过md 内核模块来实现软RAID,使用工作在用户空间的mdadm 命令来配置。
二,mdadm :模式化工具
格式:
mdadm [mode] <raiddevice> [options] <component-devices>
Create 创建模式 -C, --create
-n, --raid-devices :指定用于做RAID磁盘的个数
-x, --spare-devicea :热备磁盘的个数
-l, --level : 指定RAID的级别
-a, --auto=yes : 决定创建后面接的RAID设备
-c, --chunk : 指定分块大小,默认为512KB
Manage 管理模式 -M, --mange
-a, --add :会将后面的设备加入到这个 RAID 中
-r, --remove :会将后面的设备由这个RAID中移除
-f, --fail :会将后面的设备设定成为出错的状态
-D, --detail : 查看后面所接的那个磁盘阵列设备的详细信息
-S, --stop : 关闭RAID
三,RAID5 实现:
1,利用 4 个 partition 组成 RAID 5;
2,每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;
3,利用 1 个 partition 设定为 spare disk
4,这个 spare disk 的大小与其他 RAID 所需 partition 一样大!
5,将此 RAID 5 装置挂载到 /mnt/raid 目录下
1,建置所需的磁盘分区(重复5次)
# fdisk /dev/sdb
n
+1G
p
t
6
L
fd
w
2,更新分区表
# kpartx -af /dev/sdb
# partx -a /dev/sdb
3,查看分区信息
# cat /proc/partitions
4,使用mdadm 命令创建RAID
# mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=4 --spare-devices=1 /dev/sdb{6,7,8,9,10}
5,查看RAID设备详细信息
# mdadm --detail /dev/md0 或 cat /proc/mdstat
[root@Director ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 hda9[3] hda10[4](S) hda8[2] hda7[1] hda6[0] <==第一行
2963520 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] <==第二行
unused devices: <none>
PS:第一行部分:指出 md0 为 raid5 ,且使用了 hda9, hda8, hda7, hda6 等四颗磁盘。每个设备后面的中括号 [] 内的数字为此磁盘在 RAID 中的顺序 (RaidDevice);至于 hda10 后面的[S] 则代表 hda10 为 spare 之意。
第二行:此磁盘阵列拥有 2963520 个block(每个 block 单位为 1K),所以总容量约为 3GB, 使用 RAID 5 等级,写入磁盘的小区块 (chunk) 大小为 64K,使用 algorithm 2 磁盘阵列算法。[m/n] 代表此数组需要 m 个设备,且 n 个设备正常运作。因此本 md0 需要 4 个设备且这 4 个设备均正常运作。 后面的 [UUUU] 代表的是四个所需的设备 (就是 [m/n] 里面的 m) 的启动情况,U 代表正常运作,若为 _ 则代表不正常。
6,格式化与挂载使用 RAID
# mke2fs -t ext4 /dev/md0
# mkdir /mnt/raid
# mount /dev/md0 /mnt/raid
# df
四,模以RAID 错误的救援模式:
1,设定磁盘为错误 (fault),让一个磁盘变成错误,然后让 spare disk 自动的开始重建。复制一些数据到raid目录下测试
# cp -a /etc /var/log /mnt/raid
# df /mnt/raid ; du -sm /mnt/raid/*
# mdadm --manage /dev/md0 --fail /dev/hda8 ###设置磁盘错误
# mdadm --detail /dev/md0
2,RAID5 重建系统
[root@Director ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 hda9[3] hda10[4] hda8[5](F) hda7[1] hda6[0]
2963520 blocks level 5, 64k chunk, algorithm 2 [4/3] [UU_U]
[>.......] recovery = 0.8% (9088/987840) finish=14.3min
speed=1136K/sec
3,将出错的磁盘移除并加入新磁盘
# mdadm --manage /dev/md0 --add /dev/hda11 --remove /dev/hda8
五,开机自动启动 RAID 并自动挂载:
1,获取RAID5 设备的uuid
# mdadm --detail /dev/md0 | grep -i uuid
2,编辑mdadm.conf 配置文件
# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b
3,设定开机自动挂载并测试
# vim /etc/fstab
/dev/md0 /mnt/raid ext4 defaults 1 2
# umount /dev/md0; mount -a
# df /mnt/raid
六,关闭软件 RAID
1. 先卸除且删除配置文件内与这个 /dev/md0 有关的设定
# umount /dev/md0
# vim /etc/fstab
#/dev/md0 /mnt/raid ext4 defaults 1 2
2. 直接关闭 /dev/md0 的方法
# mdadm --stop /dev/md0
# cat /proc/mdstat
# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b