有时候我们需要容量较大或读写性能比较好的磁盘,特别是在服务器中,但这样的磁盘价格自然比较昂高,比如说SSD。此时如果你手头有几块普通磁盘,RAID就可以派上用场了。
一、RAID是什么?
RAID(Redundant Arrays of Independent Disks)意思是廉价磁盘冗余阵列,它可将至少两个便宜的普通磁盘组合成容量巨大的磁盘组,以扩大存储空间或提升读写性能或让数据具有容错能力。磁盘可组成多种RAID级别。
评判RAID主要有三个标准:空间利用率、读写性能、容错性
二、RAID级别
1、RAID0/条带化
这种模式的RAID会将数据以切片的方式依序平均分配到每个磁盘。如图,“A1”保存于磁盘1,“A2”保存于磁盘于2,然后“B1”保存于磁盘1,“B2”保存于磁盘于2,这样循环下去。如果其中一块磁盘损坏,就会丢失数据
◆至少需要两块磁盘;空间利用率:100%;读写性能最好;无容错能力;RAID0主要具有扩容和提速的功能,不能应用于要求数据高可用的环境
2、RAID1/镜像化
这种模式的RAID让同一份数据完整地保存于两个或多个磁盘上,即把一个或多个磁盘作为另一磁盘的镜像。
◆至少需要两块磁盘;空间利用率:1/n,不超过50%;读性能提升,写性略有下降;完全容错,数据恢复快;用于对数据安全性要求较高的环境中,如数据库
3、RAID5
这种RAID模式的数据写入类似于RAID0,但它会在每个循环写入过程中加入校验码,而且这些校验码也是分散于各个磁盘上的,如下图,这样当其中一块磁盘损坏时,使用完好的数据和校验码经过CPU计算后还能恢复丢失的数据。如果两个或两个以上磁盘损坏,则无法恢复。
◆至少需要三块磁盘;空间利用率:(n-1)/n;读性能很好,写性能平均水平;容错(允许坏一块磁盘);这种模式相当于RAID0和RAID1的折衷,即有较好的性能,也具备一定的容错能力,是比较通用的做法
4、RAID6
RAID6类似于RAID5,只是有两块校验盘,允许同时坏两坏盘。
◆至少需要四块磁盘;空间利用率:(n-2)/n;读性能很好,写性能不如RAID5;容错能力比RAID强(允许坏两块磁盘)
5、RAID0+1和RAID10
RAID0+1容易理解,就是先组成RAID0,后组成RAID1,即先条带后镜像;RAID10刚好相反,先镜像后条带。如图,RAID0+1不允许disk1和disk3(或者disk2和disk4)同时坏掉,而RAID10不允许disk1和disk2(或者disk3和disk4)同时坏掉。因为在同一对磁盘中,两块磁盘都坏掉的概率很低,因此RAID10比RAID0+1安全
◆至少需要四块磁盘;空间利用率不超过50%;读性能好,写性能与RAID5相近;完全容错,数据恢复快;raid10既具有较高的性能,又有很好的容错性,因此应用广泛,缺点是成本高
三、spare disk(备用磁盘)
对于具有容错能力的RAID,当然需要一个或多个备用磁盘,这些磁盘平时并不使用,当 RAID中有磁盘损坏时才顶替上来。备用磁盘一般是预先装在主板上并设置为阵列的备用磁盘的,这样当阵列中某块磁盘损坏时,备用磁盘会被主动拉进阵列中重建数据,那块损坏的磁盘则会被移出阵列。如果系统支持热插拔,我们可直接拔出坏盘并再换上一个新的,否则需要关机处理。
四、硬RAID和软RAID
◆硬RAID:通过专门的RAID控制器实现,RAID控制器负责将各成员磁盘连接起来并虚拟成一个逻辑磁盘。操作系统只能识别到逻辑磁盘,而无法识别各物理成员盘。硬RAID需要在安装系统之前进入BIOS界面设置。硬RAID的设备名为/dev/sd[a-p]
◆软RAID:如果硬件条件不满足,可以在软件层面模拟实现RAID,这当然会消耗部分系统资源,且其性能自然不如硬RAID。创建软RAID仅需多个块设备,甚至只需要分区即可,但不宜将RAID创建在同一块磁盘上。Centos提供的配置软RAID的程序为mdadm,软RAID的设备名为/dev/md#(#为非负整数)
五、使用mdadm命令配置软RAID
mdadm:命令行工具,结合md(multidisks)模块实现软RAID,该模块由内核提供
主要用法:
①创建模式:创建RAID
mdadm --create/-C RAID设备 options...
主要选项:
-l #(--level=#):指定RAID级别
-c chunk_size(--chunk=chunk_size):指定chunk大小,默认为512K
-n #(--raid-devices=#):用于创建raid设备的磁盘个数
-x #(--spare-devices=#):用于RAID的备用磁盘个数
-a yes(--auto=yes):自动为创建的RAID生成设备文件
例如 mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/sda /dev/sdb /dev/sdc
②管理模式
mdadm [--manage] RAID设备 options...
主要选项:
--fail/-f DEVICE:将RAID设备中的指定磁盘手动设置为损坏
--remove/-r DEVICE:将RAID设备中的指定非活动盘(损坏盘或备用盘)移出
--add/-a DEVICE:给RAID设备添加磁盘
例如:
mdadm /dev/md0 -f /dev/sdc:将阵列md0中的sdc手动设置为损坏
mdadm /dev/md0 -r /dev/sdc:将md0中的损坏状态的sdc移除
mdadm /dev/md0 -a /dev/sde:给md0中添加sde
可写入同一行,如mdadm /dev/md0 -f /dev/sdc -r /dev/sdc -a /dev/sde
③查看指定软RAID设备的详细信息
mdadm --detail/-D RAID设备
④停止软RAID
mdadm --stop/-S RAID设备
⑤重新启用软RAID
mdadm --assemble/-A RAID设备 DEVICE
后面指定的DEVICE当然是原来属于同一RAID中的磁盘
⑥查看某个磁盘的RAID superblock信息,一般用来确定某磁盘是否被现有RAID使用或者其到底属于哪个RAID
mdadm --examine/-E DEVICE
⑦mdadm --detail --scan:get a list of array devices from /proc/mdstat
⑦mdadm还有其它使用模式,如装配模式,管理模式,监控模式等,不在此详解,可查看帮助文档
◆cat /proc/mdstat:查看系统上所有已启用的软RAID设备及其相关信息
◆mdadm的配置文件:/etc/mdadm.conf,默认没有,需手动创建。mdadm的正常运行并不依赖此文件,该配置文件的主要作用是便于跟踪软RAID的配置。
几点说明:
1、当我们创建RAID时,该RAID的相关信息会被注入到各成员磁盘(包括备用盘)的RAID超级块当中。
2、一个磁盘只能属于一个RAID,将其RAID superblock中的信息冲掉才能被使用于其它RAID的创建中
2、停止RAID后,此RAID的成员磁盘也不能直接被系统挂载使用,需要重新格式化。
示例:使用4块磁盘配置RAID5,其中一块作为备用盘
注:因只作演示,此例中选用单个磁盘上的5个分区,实际环境中不可这样操作。前面说过,RAID不宜创建在同一块磁盘上
1、创建分区
[root@localhost ~]# fdisk /dev/sda # 创建了5个逻辑分区 ... Command (m for help): n First cylinder (1593-3916, default 1593): Using default value 1593 Last cylinder, +cylinders or +size{K,M,G} (1593-3916, default 3916): +2G ... Command (m for help): p ... /dev/sda5 1593 1854 2103487+ 83 Linux /dev/sda6 1855 2116 2104483+ 83 Linux /dev/sda7 2117 2378 2104483+ 83 Linux /dev/sda8 2379 2640 2104483+ 83 Linux /dev/sda9 2641 2902 2104483+ 83 Linux Command (m for help): w # 保存退出 ... [root@localhost ~]# partx -a /dev/sda # 重读分区表 ... [root@localhost ~]# kpartx -af /dev/sda # 重读分区表 ...
2、创建RAID并查看RAID相关信息
[root@localhost ~]# mdadm -E /dev/sda5 # 实际环境中,当我们不确定某设备是否被现有RAID使用时,可这样测试 mdadm: No md superblock detected on /dev/sda5. [root@localhost ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sda{5,6,7,8} #这里使用了5-8分区创建了一个RAID mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. [root@localhost ~]# mdadm -D /dev/md0 # 查看该RAID的详细信息 /dev/md0: Version : 1.2 Creation Time : Wed Sep 30 21:26:56 2015 Raid Level : raid5 # RAID级别 Array Size : 4202496 (4.01 GiB 4.30 GB) # 该RAID的可用空间 Used Dev Size : 2101248 (2.00 GiB 2.15 GB) Raid Devices : 3 # RAID磁盘数 Total Devices : 4 # 包括备用盘的总磁盘数 Persistence : Superblock is persistent Update Time : Wed Sep 30 21:28:31 2015 State : clean Active Devices : 3 # 活动磁盘数 Working Devices : 4 # 工作磁盘数 Failed Devices : 0 Spare Devices : 1 # 备用磁盘数 Layout : left-symmetric Chunk Size : 512K Name : localhost.localdomain:0 (local to host localhost.localdomain) UUID : b0f5f243:c7f4a4af:b9362bb5:e2d265e4 # 该RAID设备的UUID Events : 18 Number Major Minor RaidDevice State # 各成员盘的信息 0 8 5 0 active sync /dev/sda5 1 8 6 1 active sync /dev/sda6 4 8 7 2 active sync /dev/sda7 3 8 8 - spare /dev/sda8 [root@localhost ~]# mdadm -E /dev/sda8 # 查看某成员盘的RAID超级块信息 /dev/sda8: Magic : a92b4efc Version : 1.2 Feature Map : 0x0 Array UUID : b0f5f243:c7f4a4af:b9362bb5:e2d265e4 Name : localhost.localdomain:0 (local to host localhost.localdomain) Creation Time : Wed Sep 30 21:29:15 2015 Raid Level : raid5 Raid Devices : 3 Avail Dev Size : 4204871 (2.01 GiB 2.15 GB) Array Size : 4202496 (4.01 GiB 4.30 GB) Used Dev Size : 4202496 (2.00 GiB 2.15 GB) Data Offset : 4096 sectors Super Offset : 8 sectors State : clean Device UUID : 0c446570:f386af4d:095bb98b:4b8ab449 # 该成员磁盘的UUID Update Time : Wed Sep 30 21:31:03 2015 Checksum : 5aeac748 - correct Events : 20 Layout : left-symmetric Chunk Size : 512K Device Role : spare # 在RAID中的角色 Array State : AAA (‘A‘ == active, ‘.‘ == missing) [root@localhost ~]# cat /proc/mdstat # 查看所有已启用的软RAID设备的相关信息 Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sda7[4] sda8[3](S) sda6[1] sda5[0] 4202496 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] # 中括号中的数字表示磁盘在RAID中的顺序,S表示spare即备用盘 unused devices: <none> [root@localhost ~]# mdadm --detail --scan >> /etc/mdadm.conf # 将RAID设备信息导入配置文件中 [root@localhost ~]# cat /etc/mdadm.conf ARRAY /dev/md0 metadata=1.2 spares=2 name=localhost.localdomain:0 UUID=b0f5f243:c7f4a4af:b9362bb5:e2d265e4
3、格式化并挂载
[root@localhost ~]# mke2fs -t ext4 -L mysr /dev/md0 # 对该RAID格式化 ... Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done ... [root@localhost ~]# mkdir /softraid [root@localhost ~]# mount /dev/md0 /softraid # 挂载 [root@localhost ~]# mount ... /dev/md0 on /softraid type ext4 (rw) # 显示挂载成功 [root@localhost ~]# vim /etc/fstab # 写入开机自动挂载配置文件 /dev/md0 /softraid ext4 defaults 0 0 [root@localhost ~]# cp /etc/inittab /softraid # 写入数据 [root@localhost ~]# ls /softraid inittab lost+found
4、模拟救援
[root@localhost ~]# mdadm /dev/md0 -f /dev/sda7 # 将sda7设置为损坏状态 mdadm: set /dev/sda7 faulty in /dev/md0 [root@localhost ~]# mdadm /dev/md0 -r /dev/sda7 # 移除sda7 mdadm: hot removed /dev/sda7 from /dev/md0 [root@localhost ~]# mdadm -D /dev/md0 ... Number Major Minor RaidDevice State 0 8 5 0 active sync /dev/sda5 1 8 6 1 active sync /dev/sda6 3 8 8 2 spare rebuilding /dev/sda8 # 可以看到备用盘sda8自动顶替上来并重建数据 [root@localhost ~]# mdadm -D /dev/md0 ... Number Major Minor RaidDevice State 0 8 5 0 active sync /dev/sda5 1 8 6 1 active sync /dev/sda6 3 8 8 2 active sync /dev/sda8 # 重建完毕 [root@localhost ~]# cat /softraid/inittab # 文件正常显示,数据没有丢失 # inittab is only used by upstart for the default runlevel. ... [root@localhost ~]# mdadm /dev/md0 -a /dev/sda9 将sda9加入到该RAID中 mdadm: added /dev/sda9 [root@localhost ~]# cat /proc/mdstat # 显示添加成功,sda9被自动设为备用磁盘 Personalities : [raid6] [raid5] [raid4] [raid1] md0 : active raid5 sda9[4](S) sda8[3] sda6[1] sda5[0] 4202496 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] unused devices: <none> [root@localhost ~]# umount /dev/md0 # 停止RAID前必先确保其没有被挂载 [root@localhost ~]# mdadm -S /dev/md0 # 若确定不再使用该RAID,卸载后务必将其关闭 mdadm: stopped /dev/md0 [root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50 50+0 records in 50+0 records out 52428800 bytes (52 MB) copied, 0.306279 s, 171 MB/s [root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50 [root@localhost ~]# dd if=/dev/zero of=/dev/sda5 bs=1M count=50 [root@localhost ~]# dd if=/dev/zero of=/dev/sda6 bs=1M count=50 [root@localhost ~]# dd if=/dev/zero of=/dev/sda7 bs=1M count=50 [root@localhost ~]# dd if=/dev/zero of=/dev/sda8 bs=1M count=50 [root@localhost ~]# dd if=/dev/zero of=/dev/sda9 bs=1M count=50 # 即使停止RAID后,各成员盘中的RAID相关信息还在,为防止这些成员磁盘被重新装配,最好将其RAID超级块中的信息都清除
原文地址:http://9124573.blog.51cto.com/9114573/1703696