Centos 7 之 RAID 5 详解及配置
- 磁盘阵列全名是“ Redundant Arrays of Inexpensive Disks, RAID ”,英翻中的意思是:容错式廉价磁盘阵列。
- RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备;而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能呢。
- 整个 RAID 由于选择的等级(level)不同,而使得整合后的磁盘具有不同的功能
1、RAID-0(等量模式,stripe):性能最佳
- 这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。
- 这种模式的 RAID 会将磁盘先切出等量的区块(名为chunk,一般可设置 4K~1M 之间),然后当一个文件要写入 RAID 时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。
- 由于每个磁盘会交错的存放数据,因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。
2、RAID-1(映射模式,mirror):完整备份
- 这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘啦!
- 如果是不同容量的磁盘组成 RAID-1 时,那么总容量将以最小的那一颗磁盘为主!这种模式主要是“让同一份数据,完整的保存在两颗磁盘上头”
- 举例来说,如果我有一个 100MB 的文件,且我仅有两颗磁盘组成 RAID-1 时,那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。因此,整体 RAID 的容量几乎少了 50%。由于两颗硬盘内容一模一样,好像镜子映照出来一样,所以我们也称他为 mirror 模式、
3、RAID 1+0,RAID 0+1
- RAID-0 的性能佳但是数据不安全,RAID-1 的数据安全但是性能不佳,那么能不能将这两者整合起来设置 RAID 呢?
- RAID 1+0 就是:
(1)先让两颗磁盘组成 RAID 1,并且这样的设置共有两组;
(2)将这两组 RAID 1 再组成一组 RAID 0。这就是 RAID 1+0- RAID 0+1 就是:
(1)先让两颗磁盘组成RAID 0,并且这样的设置共有两组;
(2) 将这两组RAID 0 再组成一组RAID 1 。这就是RAID 0+1
4、RAID5:性能与数据备份的均衡考虑(重点)
- RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。
- 这种磁盘阵列的数据写入有点类似 RAID-0 ,不过每个循环的写入过程中(striping),在每颗磁盘还加入一个同位检查数据(Parity),这个数据会记录其他磁盘的备份数据,用于当有磁盘损毁时的救援。
RAID5 怎么工作:
- 每个循环写入时,都会有部分的同位检查码(parity)被记录起来,并且记录的同位检查码每次都记录在不同的磁盘,因此,任何一个磁盘损毁时都能够借由其他磁盘的检查码来重建原本磁盘内的数据喔!不过需要注意的是,由于有同位检查码,因此 RAID 5 的总容量会是整体磁盘数量减一颗。
- 原本的 3 颗磁盘只会剩下(3-1)=2 颗磁盘的容量。
- 当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的数据就损毁了。因为 RAID 5 默认仅能支持一颗磁盘的损毁情况。
RAID 6 可以支持两颗磁盘损坏
SPare Disk(预留磁盘功能):
为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘(spare disk)的辅助。所谓的 spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用,当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列!然后立即重建数据系统。磁盘阵列的优点:
- 数据安全与可靠性:指的并非网络信息安全,而是当硬件(指磁盘)损毁时,数据是否还能够安全的救援或使用之意;
- 读写性能:例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分得以改善;
- 容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。
二、Software,hardware RAID:
.
为何磁盘阵列又分为硬件与软件呢?
所谓的硬件磁盘阵列(hardware RAID)是通过磁盘阵列卡来达成阵列的目的。磁盘阵列卡上面有一块专门的芯片在处理 RAID 的任务,因此在性能方面会比较好。在很多任务(例如 RAID 5 的同位检查码计算)磁盘阵列并不会重复消耗原本系统的 I/O 总线,理论上性能会较佳。此外目前一般的中高阶磁盘阵列卡都支持热拔插,亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。
而软件磁盘阵列主要是通过软件来仿真阵列的任务,因此会损耗较多的系统资源,比如说 CPU 的运算与 I/O 总线的资源等。不过目前我们的个人计算机实在已经非常快速了,因此以前的速度限制现在已经不存在!
我们的 CentOS 提供的软件磁盘阵列为 mdadm 这套软件,这套软件会以 partition 或 disk 为磁盘的单位,也就是说,你不需要两颗以上的磁盘,只要有两个以上的分区(partition)就能够设计你的磁盘阵列了。
此外, mdadm 支持刚刚我们前面提到的RAID0/RAID1/RAID5/spare disk 等!而且提供的管理机制还可以达到类似热拔插的功能,可以线上(文件系统正常使用)进行分区的抽换!使用上也非常的方便!
三、软件磁盘阵列的配置:
也唠叨那么多了,下来我们就来配置一下软件磁盘阵列:
大概步骤:
- 利用 4 个 partition 组成 RAID 5;
- 每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;
- 利用 1 个 partition 设置为 spare disk chunk 设置为 256K 这么大即可!
- 这个 spare disk 的大小与其他 RAID 所需 partition 一样大!
- 将此 RAID 5 设备挂载到 /srv/raid 目录下
开始配置:
1、分区
[ /]# gdisk /dev/sdb # 通过gdisk命令创建分区,也可使用fdisk Command (? for help): n # 添加一个新分区 Partition number (1-128, default 1): 1 # 分区号为1 First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +1G # 大小为1G Current type is ‘Linux filesystem‘ Hex code or GUID (L to show codes, Enter = 8300): # GUID号 Changed type of partition to ‘Linux filesystem‘ #依照此上命令创建四个分区 Command (? for help): P # 查看创建好的分区 .......................// 省略部分 Number Start (sector) End (sector) Size Code Name 1 2048 2099199 1024.0 MiB 8300 Linux filesystem 2 2099200 4196351 1024.0 MiB 8300 Linux filesystem 3 4196352 6293503 1024.0 MiB 8300 Linux filesystem 4 6293504 8390655 1024.0 MiB 8300 Linux filesystem 5 8390656 10487807 1024.0 MiB 8300 Linux filesystem # 保存退出 [ /]# lsblk # 查看磁盘列表 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─cl-root 253:0 0 50G 0 lvm / ├─cl-swap 253:1 0 2G 0 lvm [SWAP] └─cl-home 253:2 0 47G 0 lvm /home sdb 8:16 0 20G 0 disk # 看到我们sdb磁盘上已经分出了四个分区 ├─sdb1 8:17 0 1G 0 part ├─sdb2 8:18 0 1G 0 part ├─sdb3 8:19 0 1G 0 part └─sdb4 8:20 0 1G 0 part └─sdb5 8:21 0 1G 0 part # 第五个是预留磁盘 sr0 11:0 1 1024M 0 rom
2、创建
[ /]# mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K --raid-devices=4 --spare-devices=1 /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. --create:为创建RAID的选项 --auto=yes:决定创建后面接的软件磁盘阵列设备,即md [0-9] --chunk=256K:决定这个设备的chunk大小,也可以当成 stripe 大小,一般是64K或512K --raid-devices=4:使用几个磁盘或分区作为磁盘阵列的设备 --spare-devices=1:使用几个磁盘或分区作为备用设备 --level=5:设置这组磁盘阵列的等级,建议只用0、1、5即可 --detail:后面所接的那个磁盘阵列设备的详细信息 [ /]# mdadm --detail /dev/md0 /dev/md0: # RAID的设备文件名 Version : 1.2 Creation Time : Thu Nov 7 20:26:03 2019 # 创建时间 Raid Level : raid5 # RAID 的等级 Array Size : 3142656 (3.00 GiB 3.22 GB) # 整组RAID的可用容量 Used Dev Size : 1047552 (1023.00 MiB 1072.69 MB) # 每颗磁盘的容量 Raid Devices : 4 # 组成RAID的磁盘数量 Total Devices : 5 # 包括spare的总磁盘数 Persistence : Superblock is persistent Update Time : Thu Nov 7 20:26:08 2019 State : clean # 目前这个磁盘阵列的使用状态 Active Devices : 4 # 启动的设备数量 Working Devices : 5 # 目前使用于此阵列的设备数 Failed Devices : 0 # 损坏的设备数 Spare Devices : 1 # 预留磁盘的数量 Layout : left-symmetric Chunk Size : 256K # 这就是chunk的小区块容量 Name : raid5:0 (local to host raid5) UUID : facfa60d:c92b4ced:3f519b65:d135fd98 Events : 18 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 2 8 19 2 active sync /dev/sdb3 5 8 20 3 active sync /dev/sdb4 4 8 21 - spare /dev/sdb5 # 看到sdb5作为备用设备在候场区 # 最后五行就是这五个设备目前的状况,RaidDevice 指的是此Raid内的磁盘顺序
[ /]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb4[5] sdb5[4](S) sdb3[2] sdb2[1] sdb1[0] # 第一行 3142656 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] # 第二行 unused devices: <none>
第一行部分:指出 md0 为 raid5 ,且使用了 sdb1,sdb2,sdb3,sdb4,等四颗磁盘设备。每个设备后面的中括号 [] 内的数字为此磁盘在 RAID 中的顺序(RaidDevice);至于 sdb5 后面的 [S] 则代表 sdb5 为 spare 之意。
第二行部分:此磁盘阵列拥有 3142656 个block(每个 block 单位为 1K),所以总容量约为 3GB,使用 RAID 5 等级,写入磁盘的小区块(chunk)大小为 256K,使用 algorithm 2 磁盘阵列演算法。 [m/n] 代表此阵列需要 m 个设备,且 n 个设备正常运行。因此本 md0 需要 4 个设备且这 4 个设备均正常运行。后面的 [UUUU] 代表的是四个所需的设备(就是 [m/n] 里面的 m)的启动情况,U 代表正常运行,若为 _ 则代表不正常。
3、格式化并挂载使用
[ /]# mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0 # 要注意,这块格式化的是 md0 meta-data=/dev/md0 isize=512 agcount=8, agsize=98176 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=785408, imaxpct=25 = sunit=128 swidth=384 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=1572864 blocks=0, rtextents=0 [ /]# mkdir /srv/raid [ /]# mount /dev/md0 /srv/raid/ [ /]# df -TH /srv/raid/ # 看到我们已经挂载成功了 Filesystem Type Size Used Avail Use% Mounted on /dev/md0 xfs 3.3G 34M 3.2G 2% /srv/raid
4、仿真RAID错误的救援
俗话说“天有不测风云,人有旦夕祸福”,谁也不知道你的磁盘阵列内的设备啥时候会出错,因此了解一下软件磁盘阵列的救援是必须的!下面我们就来模仿一下RAID错误并救援。
[ /]# cp -a /var/log/ /srv/raid/ # 先复制一些数据到挂载点 [ /]# df -TH /srv/raid/ ; du -sm /srv/raid/* # 看到里面已经有了数据 Filesystem Type Size Used Avail Use% Mounted on /dev/md0 xfs 3.3G 39M 3.2G 2% /srv/raid 5 /srv/raid/log [ /]# mdadm --manage /dev/md0 --fail /dev/sdb3 mdadm: set /dev/sdb3 faulty in /dev/md0 # 显示已经成为了错误的设备 .............................. // 省略部分内容 Update Time : Thu Nov 7 20:55:31 2019 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 1 # 出错一个磁盘 Spare Devices : 0 # 这里预备已经变为0,说明已经顶替工作了,这里截得有点慢了,不然还是1 ............................ // 省略部分内容 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 4 8 21 2 active sync /dev/sdb5 # 这里可以看到sdb5 已经顶替工作了 5 8 20 3 active sync /dev/sdb4 2 8 19 - faulty /dev/sdb3 # sdb3 死掉了
接下来就可以将坏磁盘拔掉,更换新的磁盘了
[ /]# mdadm --manage /dev/md0 --remove /dev/sdb3 # 模拟拔掉旧磁盘 mdadm: hot removed /dev/sdb3 from /dev/md0 [ /]# mdadm --manage /dev/md0 --add /dev/sdb3 # 插入新磁盘 mdadm: added /dev/sdb3 [ /]# mdadm --detail /dev/md0 # 查看 ........................... // 省略部分内容 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 4 8 21 2 active sync /dev/sdb5 5 8 20 3 active sync /dev/sdb4 6 8 19 - spare /dev/sdb3 # 我们会发现sdb3 已经作为预备磁盘在此等待了
5、设置开机自启动RAID并自动挂载
[ /]# mdadm --detail /dev/md0 | grep -i uuid UUID : facfa60d:c92b4ced:3f519b65:d135fd98 [ /]# vim /etc/mdadm.conf ARRAY /dev/md0 UUID=facfa60d:c92b4ced:3f519b65:d135fd98 # RAID设备 识别码内容 [ /]# blkid /dev/md0 /dev/md0: UUID="bc2a589c-7df0-453c-b971-1c2c74c39075" TYPE="xfs" [ /]# vim /etc/fstab # 设置开机自动挂载 ............................ // 省略部分内容 /dev/md0 /srv/raid xfs defaults 0 0 #开头也可填写为UUID [ /]# df -Th /srv/raid/ # 可以进行重启测试 Filesystem Type Size Used Avail Use% Mounted on /dev/md0 xfs 3.0G 37M 3.0G 2% /srv/raid