linux磁盘阵列


软件磁盘阵列 (Software RAID)

回到顶部
过去硬盘容量都不大,几十GB容量就是大硬盘了! 但是某些情况下,需要很大的储存容量空间。可以通过磁盘阵列 (RAID)存储机制。这种机制的功能是什么?他有哪些等级?什么 是硬磁盘阵列和软磁盘阵列?Linux支持什么样的软件磁盘阵列?

什么是RAID

回到顶部
磁盘阵列RAID(Redundant Arrays of Inexpensive Disks),全称为容错式廉价磁盘阵列。 RAID通过软件或者硬件的方式将多个较小的磁盘整合成为一个较大的磁盘设备; 这个较大的磁盘除了储存功能外还具有数据保护的功能。 RAID选择的等级(level)不同,整合后的磁盘具有不同的功能,常见的level有以下几种:

RAID-0(stripe等量模式):性能最佳

回到顶部
这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。 RAID-0将磁盘切分为等量的chunk区块,chunk区块容量一般可设定为4K-1M。 当文件写入RAID时,将文件切割为chunk区块,每个文件区块按照顺序存放到各个磁盘chunk区块中。
每个磁盘交错存放数据, 数据写入RAID时,会被等量的放置在各个磁盘上面。
例如有两颗磁盘组成RAID-0, 文件大小为100MB,每个磁盘分配50MB的储存量。
RAID-0的示意图如下所示:
raid-0示意图 图 RAID-0的磁盘写入示意图
在组成RAID-0时,每颗磁盘(Disk A与Disk B)会先被分割成为小区块chunk。 数据写入RAID时,会先被切割成chunk大小,再一个一个按顺序放到不同的磁盘chunk。 由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了!
照这样的情况来看, 越多颗磁盘组成的 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模式。
raid-1示意图 图 RAID-1磁盘写入示意图
如上图所示,一份数据传送到RAID-1后会被分为两份,并分别写入到各个磁盘里头去。
由于同一份数据会被分别写入到不同磁盘,因此如果要写入100MB时,数据传送到I/O总线后会被复制多份到各个磁盘, 结果就是数据量感觉变大了!因此在大量写入RAID-1的情况下,写入性能可能会变的非常差(因为只有一个南桥)。
如果使用的是硬件RAID(磁盘阵列卡),磁盘阵列卡会主动的复制一份而不使用系统I/O总线,可以大大提高IO性能。
使用软件磁盘阵列,可能性能就不好了。
由于两颗磁盘内的数据一模一样,任何一颗硬盘损毁时,数据还是可以完整的保留下来!
RAID-1最大的优点就在于数据的备份!不过由于磁盘容量有一半用在备份,总容量会是全部磁盘容量的一半。
虽然RAID-1的写入性能不佳,不过读取的性能非常高!因为数据有两份在不同的磁盘上面, 多个processes读取同一数据时, RAID会自行取得最佳的读取平衡。

RAID 1+0或RAID 0+1

回到顶部
RAID-0的性能佳但是数据不安全,RAID-1的数据安全但是性能不佳,可以将这两者结合起来设定RAID! 那就是RAID 1+0或RAID 0+1。
RAID 1+0就是:
(1)先让两颗磁盘组成RAID 1,并且这样的设定共有两组;
(2)将这两组RAID 1再组成一组RAID 0。
这就是 RAID 1+0!
反过来RAID 0+1就是先组成RAID-0再组成RAID-1。
RAID-1+0磁盘写入示意图 图 14.2.3、RAID-1+0磁盘写入示意图
如上图所示,Disk A + Disk B组成第一组RAID 1,Disk C + Disk D组成第二组RAID 1, 然后这两组再整合成为一组RAID 0。如果有100MB的数据要写入,则由于RAID 0的关系, 两组RAID 1都会写入50MB, 又由于RAID 1的关系,每颗磁盘就会写入50MB而已。 不论哪一组RAID 1的磁盘损毁,由于是RAID 1的映像数据,因此就不会有任何问题发生了! 这也是目前储存设备厂商最推荐的方法!
为何会推荐RAID 1+0 呢? 想象20颗磁盘组成的系统,每两颗组成一个RAID1,就有总共10组可以复原的系统了! 然后这10组再组成一个新的RAID0,速度立刻拉升10倍了! 因为每组RAID1是个别独立存在的,因此任何一颗磁盘损毁, 数据都是从另一颗磁盘直接复制过来重建, 并不像RAID5/RAID6必须要整组RAID的磁盘共同重建一颗独立的磁盘系统!性能上差非常多! 而且RAID 1与RAID 0是不需要经过计算的 striping) ! 读写性能也比其他的RAID等级好很多了!

RAID 5:性能与数据备份的均衡考虑

回到顶部
至少需要三颗以上的磁盘才能组成RAID-5磁盘阵列。RAID-5磁盘阵列的数据写入有点类似RAID-0 , 不过每个循环的写入过程中(striping),在每颗磁盘还加入一个同位检查数据(Parity), 这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。RAID-5读写的情况有点像底下这样:
RAID-5磁盘写入示意图 图 RAID-5磁盘写入示意图
每个循环写入时,都会有部分的同位检查码(parity)被记录起来,并且记录的同位检查码每次都记录在不同的磁盘, 任何一个磁盘损毁时都能够藉由其他磁盘的检查码来重建原本磁盘内的数据!
不过需要注意的是, 由于有同位检查码,RAID 5的总容量会是整体磁盘数量减一颗。 以上图为例, 原本的3颗磁盘只会剩下(3-1)=2颗磁盘的容量。
因为RAID 5预设仅能支持一颗磁盘的损毁情况。当损毁的磁盘数量大于等于两颗时,整组RAID 5的资料就损毁了。
在读写性能的比较上,读取的性能还不赖!与RAID-0有的比!不过写的性能就不见得能够增加很多! 因为要写入RAID 5的数据还得要经过计算同位检查码(parity)。由于加上这个计算的动作, 所以写入的性能与系统的硬件关系较大! 尤其使用软件磁盘阵列时,同位检查码是透过CPU计算而非专职的磁盘阵列卡, 因此性能方面还需要评估
。 由于RAID 5仅能支持一颗磁盘的损毁,因此近来还有发展出另外一种等级,就是RAID 6, RAID 6使用两颗磁盘的容量作为parity的储存,因此整体的磁盘容量就会少两颗,但是允许出错的磁盘数量就可以达到两颗了! 也就是在RAID 6的情况下,同时两颗磁盘损毁时,数据还是可以救回来!

Spare Disk:预备磁盘的功能

回到顶部
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启动磁盘阵列后, 磁盘阵列就会开始主动重建(rebuild)原本坏掉的那颗磁盘数据到新的磁盘上! 然后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。 不过,我们还是得要动手拔插硬盘,除非你的系统有支持热拔插,否则通常得要关机才能这么做。
为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘(spare disk)的辅助。 spare disk就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,这颗spare disk会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列! 然后立即重建数据系统。如此系统则可以永保安康! 若你的磁盘阵列有支持热拔插那就更完美了! 直接将坏掉的那颗磁盘拔除换一颗新的,再将那颗新的设定成为spare disk就完成了!
举例来说,有一个磁盘阵列可允许16颗磁盘的数量,不过只安装了10颗磁盘作为RAID 5。 每颗磁盘的容量为250GB,用一颗磁盘作为spare disk,并将其他的9颗设定为一个RAID5, 因此这个磁盘阵列的总容量为:(9-1)*250G=2000G。运作了一两年后真的有一颗磁盘坏掉了,我们后来看灯号才发现! 不过对系统没有影响呢!因为spare disk主动的加入支持,坏掉的那颗拔掉换颗新的,并重新设定成为spare 后,系统内的数据还是完整无缺的!
磁盘阵列的优点
其实你的系统如果需要磁盘阵列的话,其实重点在于:
1. 数据安全与可靠性:指的并非网络信息安全,而是当硬件 (指磁盘) 损毁时,数据是否还能够安全的救援或 使用之意;
2. 读写性能:例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分得以改善;
3. 容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。
尤其数据的可靠性与完整性更是使用RAID的考虑重点!
毕竟硬件坏掉换掉就好了,软件数据损毁那可不是闹着玩的! 所以企业界为何需要大量的RAID来做为文件系统的硬件基准。
那依据这三个重点,我们来列表看看上面几个重要的 RAID 等级各有哪些优点吧!假设有n颗磁盘组成的RAID设定!
项目 RAID0 RAID1 RAID10 RAID5 RAID6
最少磁盘数 2 2 4 3 4
最大容错磁盘
数(1) 无 n-1 n/2 1 2
数据安全性(1) 完全没有 最佳 最佳 好 比 RAID5好
理论写入性能(2) n 1 n/2 <n-1 <n-2
理论读出性能(2) n n n <n-1 <n-2
可用容量(3) n 1 n/2 n-1 n-2
一般应用 强调性能但数据不重要的环境 资料与备份 服务器、云系统常用 资料与备份 资料与备份
RAID5, RAID6读写都需要计算parity,因此读写性能都不会刚好满足于使用的磁盘数量!
根据使用情况d的不同,一般推荐的磁盘阵列等级也不太一样。
近年来也比较积极在作一些云计算程序环境的设计,在云环境下,确保每个虚拟机能够快速的反应以及提供数据保全是最重要的部份! 因此性能方面比较弱的RAID5/RAID6是不考虑的, 总结来说,大概就剩下RAID10能够满足云环境的性能需求了。在某些更特别的环境下, 如果搭配SSD那才更具有性能上的优势!

software, hardware RAID

回到顶部
磁盘阵列又分为硬磁盘阵列与软磁盘阵列。 硬件磁盘阵列(hardware RAID)通过磁盘阵列卡来达成数组的目的。 磁盘阵列卡上有一块专门的芯片处理RAID的任务,在性能方面会比较好。 在很多任务(例如RAID 5的同位检查码计算)磁盘阵列并不会重复消耗原本系统的I/O总线,理论上性能会较佳。 一般的中高阶磁盘阵列卡都支持热拔插, 亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。 不过一块好的磁盘阵列卡动不动就上万元台币,便宜的在主板上面附赠的磁盘阵列功能可能又不支持某些高阶功能, 例如低阶主板若有磁盘阵列芯片,通常仅支持到RAID0与RAID1,并没有支持RAID6。 此外,操作系统也必须要拥有磁盘阵列卡的驱动程序,才能够正确的识别磁盘阵列所产生的磁盘驱动器!
由于磁盘阵列有很多优秀的功能,然而硬件磁盘阵列卡偏偏又贵~因此就有发展出利用软件来仿真磁盘阵列的功能, 这就是所谓的软件磁盘阵列 (software RAID)。 软件磁盘阵列主要是透过软件来仿真数组的任务, 因此会损耗较多的系统资源,比如说CPU的运算与I/O总线的资源等。 不过目前个人计算机已经非常快速了, 因此以前的速度限制已经不存在!所以我们可以来玩一玩软件磁盘阵列!
CentOS提供的软件磁盘阵列为mdadm这套软件,mdadm以partition或disk为磁盘单位,也就是说,不需要两颗以上的磁盘, 只要有两个以上的分区槽 (partition)就能够设计磁盘阵列了。 此外, mdadm支持刚刚我们前面提到的RAID0/RAID1/RAID5/spare disk等! 而且提供的管理机制还可以达到类似热拔插的功能,可以在线(文件系统正常使用)进行分区槽的抽换! 使用上也非常的方便呢!
另外须要知道的是,硬件磁盘阵列使用SCSI模块,在Linux底下看起来就是一颗实际的大磁盘,硬件磁盘阵列的设备文件名为/dev/sd[a-p], 软件磁盘阵列则是系统仿真的,使用的设备文件名系统文件名/dev/md0, /dev/md1...
Intel南桥附赠的磁盘阵列功能,在windows下似乎是完整的磁盘阵列,但是在Linux下则被视为是软件磁盘阵列的一种! 因此如果你有设定过Intel的南桥芯片磁盘阵列,在Linux底下还会是/dev/md126,/dev/md127等设备文件名, 而分区设备文件名类似/dev/md126p1, /dev/md126p2...!比较特别,所以这里加强说明!

软件磁盘阵列的设定

回到顶部
软件磁盘阵列的设定很简单!只要使用一个指令即可!那就是mdadm这个指令。
这个指令在建立RAID的语法有点像这样:
[root@initroot ~]# mdadm --detail /dev/md0
[root@initroot ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
选项与参数:
--create :为建立 RAID 的选项;
--auto=yes :决定建立后面接的软件磁盘阵列设备,亦即 /dev/md0, /dev/md1...
--chunk=Nk :决定这个设备的 chunk 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用几个磁盘 (partition) 作为磁盘阵列的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
--level=[015] :设定这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
--detail :后面所接的那个磁盘阵列设备的详细信息
上面的语法中,最后面会接许多的设备文件名,这些设备文件名可以是整颗磁盘,例如 /dev/sdb , 也 可以是分区槽,例如 /dev/sdb1 之类。不过,这些设备文件名的总数必须要等于 --raid-devices 与 --spare-devices 的个数总和才行!
利用我的测试机来建置一个 RAID 5 的软件磁盘阵列给您瞧瞧! 底下是希望做成的 RAID 5 环境:
利用 4 个 partition 组成 RAID 5;
每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;
利用 1 个 partition 设定为 spare disk
chunk 设定为 256K 这么大即可!
这个 spare disk 的大小与其他 RAID 所需 partition 一样大!
将此 RAID 5 设备挂载到 /srv/raid 目录下
最终我需要 5 个 1GB 的 partition。在的测试机中,根据前面的章节实做下来,包括课后的情 境模拟题目,目前应该还有 8GB 可供利用! 因此就利用这部测试机的 /dev/vda 切出 5 个 1G 的 分区槽。实际的流程就不一一展示了,自己透过 gdisk /dev/vda 实作一下! 最终这部测试机的 结果应该如下所示:
[root@initroot ~]# gdisk -l /dev/vda
Number
Start (sector)
End (sector)
Size Code
2.0 MiB EF02
1024.0 MiB 0700
Name
1 2048 6143 2 6144 2103295 3 2103296 65026047 30.0 GiB 8E00 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
5 67123200 69220351 1024.0 MiB FD00 Linux RAID
6 69220352 71317503 1024.0 MiB FD00 Linux RAID
7 71317504 73414655 1024.0 MiB FD00 Linux RAID
8 73414656 75511807 1024.0 MiB FD00 Linux RAID
9 75511808 77608959 1024.0 MiB FD00 Linux RAID
# 上面特殊字体的部份就是我们需要的那 5 个 partition 啰!注意注意!
[root@initroot ~]# lsblk
NAME MAJ:MIN RM
SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm
/
| |-centos-swap 253:1 0 1G 0 lvm
[SWAP]
| `-centos-home 253:2 0 5G 0 lvm
/home
|-vda4 252:4 0 1G 0 part /srv/myproject
|-vda5 252:5 0 1G 0 part
|-vda6 252:6 0 1G 0 part
|-vda7 252:7 0 1G 0 part
|-vda8 252:8 0 1G 0 part`-vda9

252:9
0
1G
0 part
以 mdadm 建置 RAID 接下来就简单啦!透过 mdadm 来建立磁盘阵列先!
[root@initroot ~]# mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K \
>
--raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9}
mdadm: /dev/vda5 appears to contain an ext2fs file system  # 某些时刻会出现这个东西!没关系的!
size=1048576K  
mtime=Thu Jun 25 00:35:01 2015
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 详细的参数说明请回去前面看看啰!这里我透过 {} 将重复的项目简化! # 此外,因为这个系统经常在建置测试的环境,因此系统可能会抓到之前的 filesystem # 所以就会出现如上前两行的讯息!那没关系的!直接按下 y 即可删除旧系统
[root@initroot ~]# mdadm --detail /dev/md0
# RAID 的设备文件名
/dev/md0:
Version : 1.2
Creation Time : Mon Jul 27 15:17:20 2015
# 建置 RAID 的时间
Raid Level : raid5 # 这就是 RAID5 等级!
Array Size : 3142656 (3.00 GiB 3.22 GB) # 整组 RAID 的可用容量
Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)
# 每颗磁盘(设备)的容量
Raid Devices : 4 # 组成 RAID 的磁盘数量
Total Devices : 5 # 包括 spare 的总磁盘数
Persistence : Superblock is persistent
Update Time : Mon Jul 27 15:17:31 2015
# 目前这个磁盘阵列的使用状态
State : clean
# 启动(active)的设备数量
Active Devices : 4
# 目前使用于此数组的设备数
Working Devices : 5
# 损坏的设备数
Failed Devices : 0
# 预备磁盘的数量
Spare Devices : 1
Layout : left-symmetric
# 就是 chunk 的小区块容量
Chunk Size : 256K
Name : study.centos.vbird:0
(local to host study.centos.vbird)
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
Events : 18
Number
Major
Minor
RaidDevice State0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
2 252 7 2 active sync /dev/vda7
5 252 8 3 active sync /dev/vda8
4 252 9 - spare
/dev/vda9
# 最后五行就是这五个设备目前的情况,包括四个 active sync 一个 spare ! # 至于 RaidDevice 指的则是此 RAID 内的磁盘顺序 由于磁盘阵列的建置需要一些时间,所以你最好等待数分钟后再使用 mdadm --detail /dev/md0 去查阅你的磁盘阵列详细信息! 否则有可能看到某些磁盘正在spare rebuilding之类的建置字样! 透过上面的指令, 你就能够建立一个 RAID5 且含有一颗 spare disk 的磁盘阵列啰!非常简单吧! 除 了指令之外,你也可以查阅如下的文件来看看系统软件磁盘阵列的情况:
[root@initroot ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 vda8[5] vda9[4](S) vda7[2] vda6[1] vda5[0]
#第一行
3142656 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] 
#第二行
unused devices: <none>
上述的资料比较重要的在特别指出的第一行与第二行部分(注 3):
第一行部分:指出 md0 为 raid5 ,且使用了 vda8, vda7, vda6, vda5 等四颗磁盘设备。每个设备后面的中 括号 [] 内的数字为此磁盘在 RAID 中的顺序 (RaidDevice);至于 vda9 后面的 [S] 则代表 vda9 为 spare 之意。
第二行:此磁盘阵列拥有 3142656 个 block(每个 block 单位为 1K),所以总容量约为 3GB, 使用 RAID 5 等级,写入磁盘的小区块 (chunk) 大小为 256K,使用 algorithm 2 磁盘阵列算法。 [m/n] 代表此数组需 要 m 个设备,且 n 个设备正常运作。因此本 md0 需要 4 个设备且这 4 个设备均正常运作。 后面的 [UUUU] 代表的是四个所需的设备 (就是 [m/n] 里面的 m) 的启动情况,U 代表正常运作,若为 _ 则代 表不正常。
这两种方法都可以知道目前的磁盘阵列状态啦!

格式化与挂载使用 RAID

回到顶部
接下来就是开始使用格式化工具!因为涉及到xfs文件系统的优化,这里的参数为:
stripe(chunk)容量为256K,所以su=256k
共有4颗组成RAID5 ,因此容量少一颗,所以sw=3!
由上面两项计算出数据宽度为:256K*3=768k
所以整体来说,要优化这个XFS文件系统就变成这样:
[root@initroot ~]# mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0
# 有趣吧!是 /dev/md0 做为设备被格式化呢!
[root@initroot ~]# mkdir /srv/raid
[root@initroot ~]# mount /dev/md0 /srv/raid
[root@initroot ~]# df -Th /srv/raid
Filesystem Type Size
/dev/md0 xfs 3.0G
Used Avail Use% Mounted on
33M
3.0G
2% /srv/raid
看吧!多了一个 /dev/md0 的设备,而且真的可以让你使用呢!还不赖!

仿真RAID错误的救援模式

回到顶部
俗话说天有不测风云、人有旦夕祸福,谁也不知道你的磁盘阵列内的设备啥时会出差错, 因此,了解一下软件磁盘阵列的救援还是必须的!底下我们就来玩一玩救援的机制吧! 首先来了解一下mdadm 这方面的语法:
[root@initroot ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
选项与参数:
--add :会将后面的设备加入到这个md中!  
--remove :会将后面的设备由这个md中移除
--fail :会将后面的设备设定成为出错的状态
设定磁盘为错误 (fault)
首先,我们来处理一下,该如何让一个磁盘变成错误,然后让spare disk自动的开始重建系统呢?
0. 先复制一些东西到/srv/raid去,假设这个RAID已经在使用了
[root@initroot ~]# cp -a /etc /var/log /srv/raid
[root@initroot ~]# df -Th /srv/raid ; du -sm /srv/raid/*
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 144M
28 /srv/raid/etc
51 /srv/raid/log
2.9G
5% /srv/raid
#确实有资料在里面!
1. 假设/dev/vda7这个设备出错了!实际模拟的方式:
[root@initroot ~]# mdadm --manage /dev/md0 --fail /dev/vda7
mdadm: set /dev/vda7 faulty in /dev/md0   # 设定成为错误的设备啰!
/dev/md0:
.....(中间省略).....
Update Time : Mon Jul 27 15:32:50 2015
State : clean, degraded, recovering  
Active Devices : 3
Working Devices : 4
Failed Devices : 1      #出错的磁盘有一个!
Spare Devices : 1
.....(中间省略).....
Number
Major
Minor
RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 spare rebuilding
5 252 8 3 active sync 2 252 7 - faulty
/dev/vda9
/dev/vda8
/dev/vda7
#这的动作要快做才会看到! /dev/vda9启动了而/dev/vda7死掉了 上面的画面得要快速的连续输入那些mdadm的指令才看的到! 因为RAID 5正在重建系统! 若你等待一段时间再输入后面的观察指令,则会看到如下的画面了:
2. 已经藉由spare disk重建完毕的RAID 5情况
[root@initroot ~]# mdadm --detail /dev/md0
....(前面省略)....
Number
Major
Minor
RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
2 252 7 - faulty
/dev/vda7
又恢复正常了!/srv/raid文件系统是完整的!并不需要卸除!
将出错的磁盘移除并加入新磁盘。 因为系统那个/dev/vda7实际上没有坏掉!只是用来模拟而已! 因此,如果有新的磁盘要替换,其实替换的名称会一样啊! 也就是我们需要:
1. 先从/dev/md0数组中移除/dev/vda7磁盘;
2. 整个Linux系统关机,拔出/dev/vda7磁盘,并安装上新的/dev/vda7磁盘,之后开机;
3. 将新的/dev/vda7放入/dev/md0数组中!
# 3. 拔除旧的/dev/vda7 磁盘
[root@initroot ~]# mdadm --manage /dev/md0 --remove /dev/vda7
# 假设接下来你就进行了上面谈到的第 2, 3 个步骤,然后重新启动成功了!
# 4. 安装新的/dev/vda7 磁盘
[root@initroot ~]# mdadm --manage /dev/md0 --add /dev/vda7
[root@initroot ~]# mdadm --detail /dev/md0
....(前面省略)....
Number
Major
Minor
RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
6 252 7 - spare
/dev/vda7
磁盘阵列内的数据不但一直存在,而且可以一直顺利的运作/srv/raid内的数据,即使/dev/vda7损毁了! 然后透过管理的功能就能够加入新磁盘且拔除坏掉的磁盘!这一切都是在上线(on-line)的情况下进行! 所以,您说这样的咚咚好不好用啊!

开机自动启动 RAID 并自动挂载

回到顶部
新的distribution大多会自己搜寻/dev/md[0-9],然后在开机的时候给予设定好所需要的功能。 不过还是建议修改一下配置文件! software RAID也是有配置文件的,这个配置文件在/etc/mdadm.conf! 配置文件内容很简单,只要知道/dev/md0的UUID就能够设定了!这里仅介绍最简单的语法:
[root@initroot ~]# mdadm --detail /dev/md0 | grep -i uuid
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
# 后面那一串数据,就是这个设备向系统注册的 UUID 标识符!
# 开始设定 mdadm.conf
[root@initroot ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
#
RAID 设备
标识符内容
# 开始设定开机自动挂载并测试
[root@initroot ~]# blkid /dev/md0
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"
[root@initroot ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523
/srv/raid xfs defaults 0 0
[root@initroot ~]# umount /dev/md0; mount -a
[root@initroot ~]# df -Th /srv/raid
Filesystem
Type
Size
Used Avail Use% Mounted on/dev/md0
xfs
3.0G
111M
2.9G
4% /srv/raid
你得确定可以顺利挂载,并且没有发生任何错误! 如果到这里都没有出现任何问题!接下来就请reboot系统并等待看能否顺利启动吧!

关闭软件 RAID(重要!)

回到顶部
除非未来要使用这颗software RAID(/dev/md0),否则将这个/dev/md0关闭!
为什么要关掉他呢?因为这个/dev/md0其实还是使用到我们系统的磁盘分区, 在的例子里面就是/dev/vda{5,6,7,8,9},如果只是将/dev/md0卸除,忘记将RAID关闭, 结果就是未来重新分区/dev/vdaX时可能会出现一些莫名的错误! 所以才需要关闭 software RAID 的步骤!
那如何关闭呢?也是简单到爆炸!请注意,确认你的 /dev/md0 确实不要用且要关闭了才进行底下的玩意儿。 1. 先卸除且删除配置文件中与这个/dev/md0有关的设定:
[root@initroot ~]# umount /srv/raid
[root@initroot ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0  #将这一行删除或者注释掉!
2. 先覆盖掉RAID的metadata以及XFS的superblock,最后关闭/dev/md0:
[root@initroot ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@initroot ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
#这样就关闭了!
[root@initroot ~]# dd if=/dev/zero of=/dev/vda5 bs=1M count=10
[root@initroot ~]# dd if=/dev/zero of=/dev/vda6 bs=1M count=10
[root@initroot ~]# dd if=/dev/zero of=/dev/vda7 bs=1M count=10
[root@initroot ~]# dd if=/dev/zero of=/dev/vda8 bs=1M count=10
[root@initroot ~]# dd if=/dev/zero of=/dev/vda9 bs=1M count=10
[root@initroot ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>
#y看吧!确实不存在任何数组设备!
[root@initroot ~]# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6  #删除或注释掉!
为啥上面会有数个dd的指令?这是因为RAID的相关数据其实也会存一份在磁盘当中, 如果只是将配置文件移除, 同时关闭了RAID,但是分区并没有重新规划过,那么重新启动后, 系统还是会将这颗磁盘阵列建立起来,只是名称可能会变成/dev/md127!
因此,移除掉Software RAID时,上述的dd指令不要忘记!注意不要dd到错误的磁盘,那可是会欲哭无泪的。
在这个练习中,使用同一颗磁盘进行软件RAID的实验。不过朋友们要注意的是,如果真的要实作软件磁盘阵列, 最好是由多颗不同的磁盘来组成较佳!因为这样才能够使用到不同磁盘的读写,性能才会好!
而数据分配在不同的磁盘,当某颗磁盘损毁时数据才能够藉由其他磁盘挽救回来!这点得特别留意呢!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读