7.1 RAID磁盘冗余阵列
近年来, CPU的处理性能保持着高速增长,Intel公司在2017年最新发布的i9-7980XE处理器芯片更是达到了18核心36线程。但与此同时,硬盘设备的性能提升却不是很大,因此逐渐成为当代计算机整体性能的瓶颈。而且,由于硬盘设备需要进行持续、频繁、大量的IO操作,相较于其他设备,其损坏几率也大幅增加,导致重要数据丢失的几率也随之增加。
1988年,加利福尼亚大学伯克利分校首次提出并定义了RAID技术的概念。RAID技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。
任何事物都有它的两面性。RAID技术确实具有非常好的数据冗余备份功能,但是它也相应地提高了成本支出。就像原本我们只有一个电话本,但是为了避免遗失,我们将联系人号码信息写成了两份,自然要为此多买一个电话本,这也就相应地提升了成本支出。RAID技术的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现代企业更看重的则是RAID技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升。也就是说,RAID不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度,所以它在绝大多数运营商或大中型企业中得以广泛部署和应用。
出于成本和技术方面的考虑,需要针对不同的需求在数据可靠性及读写性能上作出权衡,制定出满足各自需求的不同方案。目前已有的RAID磁盘阵列的方案至少有十几种,而刘遄老师接下来会详细讲解RAID 0、RAID 1、RAID 5与RAID 10这4种最常见的方案。
1. RAID 0
RAID 0技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。通俗来说,RAID 0技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。如图7-1所示,数据被分别写入到不同的硬盘设备中,即disk1和disk2硬盘设备会分别保存数据资料,最终实现提升读取、写入速度的效果。
图7-1 RAID 0技术示意图
2. RAID 1
尽管RAID 0技术提升了硬盘设备的读写速度,但是它是将数据依次写入到各个物理硬盘中,也就是说,它的数据是分开存放的,其中任何一块硬盘发生故障都会损坏整个系统的数据。因此,如果生产环境对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时,就需要用到RAID 1技术了。
在图7-2所示的RAID 1技术示意图中可以看到,它是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
图7-2 RAID 1技术示意图
RAID 1技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数据,因此硬盘设备的利用率得以下降,从理论上来说,图7-2所示的硬盘空间的真实可用率只有50%,由三块硬盘设备组成的RAID 1磁盘阵列的可用率只有33%左右,以此类推。而且,由于需要把数据同时写入到两块以上的硬盘设备,这无疑也在一定程度上增大了系统计算功能的负载。
那么,有没有一种RAID方案既考虑到了硬盘设备的读写速度和数据安全性,还兼顾了成本问题呢?实际上,单从数据安全和成本问题上来讲,就不可能在保持原有硬盘设备的利用率且还不增加新设备的情况下,能大幅提升数据的安全性。刘遄老师也没有必要忽悠各位读者,下面将要讲解的RAID 5技术虽然在理论上兼顾了三者(读写速度、数据安全性、成本),但实际上更像是对这三者的“相互妥协”。
3. RAID 5
如图7-3所示,RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命缺陷;图7-3中parity部分存放的就是数据的奇偶校验信息,换句话说,就是RAID 5技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。RAID这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性与存储成本问题。
图7-3 RAID5技术示意图
4. RAID 10
鉴于RAID 5技术是因为硬盘设备的成本问题对读写速度和数据的安全性能而有了一定的妥协,但是大部分企业更在乎的是数据本身的价值而非硬盘价格,因此生产环境中主要使用RAID 10技术。
顾名思义,RAID 10技术是RAID 1+RAID 0技术的一个“组合体”。如图7-4所示,RAID 10技术需要至少4块硬盘来组建,其中先分别两两制作成RAID 1磁盘阵列,以保证数据的安全性;然后再对两个RAID 1磁盘阵列实施RAID 0技术,进一步提高硬盘设备的读写速度。这样从理论上来讲,只要坏的不是同一组中的所有硬盘,那么最多可以损坏50%的硬盘设备而不丢失数据。由于RAID 10技术继承了RAID 0的高读写速度和RAID 1的数据安全性,在不考虑成本的情况下RAID 10的性能都超过了RAID 5,因此当前成为广泛使用的一种存储技术。
图7-4 RAID 10技术示意图
7.1.1 部署磁盘阵列
在具备了上一章的硬盘设备管理基础之后,再来部署RAID和LVM就变得十分轻松了。首先,需要在虚拟机中添加4块硬盘设备来制作一个RAID 10磁盘阵列,如图7-5所示。
图7-5 为虚拟机系统模拟添加4块硬盘设备
这几块硬盘设备是模拟出来的,不需要特意去买几块真实的物理硬盘插到电脑上。需要注意的是,一定要记得在关闭系统之后,再在虚拟机中添加硬盘设备,否则可能会因为计算机架构的不同而导致虚拟机系统无法识别添加的硬盘设备。
mdadm命令用于管理Linux系统中的软件RAID硬盘阵列,格式为“mdadm [模式] <RAID设备名称> [选项] [成员设备名称]”。
当前,生产环境中用到的服务器一般都配备RAID阵列卡,尽管服务器的价格越来越便宜,但是我们没有必要为了做一个实验而去单独购买一台服务器,而是可以学会用mdadm命令在Linux系统中创建和管理软件RAID磁盘阵列,而且它涉及的理论知识的操作过程与生产环境中的完全一致。mdadm命令的常用参数以及作用如表7-1所示。
表7-1 mdadm命令的常用参数和作用
参数 | 作用 |
-a | 检测设备名称 |
-n | 指定设备数量 |
-l | 指定RAID级别 |
-C | 创建 |
-v | 显示过程 |
-f | 模拟设备损坏 |
-r | 移除设备 |
-Q | 查看摘要信息 |
-D | 查看详细信息 |
-S | 停止RAID磁盘阵列 |
接下来,使用mdadm命令创建RAID 10,名称为“/dev/md0”。
第6章中讲到,udev是Linux系统内核中用来给硬件命名的服务,其命名规则也非常简单。我们可以通过命名规则猜测到第二个SCSI存储设备的名称会是/dev/sdb,然后依此类推。使用硬盘设备来部署RAID磁盘阵列很像是将几位同学组成一个班级,但总不能将班级命名为/dev/sdbcde吧。尽管这样可以一眼看出它是由哪些元素组成的,但是并不利于我们的记忆和阅读。更何况如果我们是使用10、50、100个硬盘来部署RAID磁盘阵列呢?
此时,就需要使用mdadm中的参数了。其中,-C参数代表创建一个RAID阵列卡;-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;-a yes参数代表自动创建设备文件;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID 10方案;最后再加上4块硬盘设备的名称就搞定了。
- [root@linuxprobe ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
- mdadm: layout defaults to n2
- mdadm: layout defaults to n2
- mdadm: chunk size defaults to 512K
- mdadm: size set to 20954624K
- mdadm: Defaulting to version 1.2 metadata
- mdadm: array /dev/md0 started.
其次,把制作好的RAID磁盘阵列格式化为ext4格式。
- [root@linuxprobe ~]# mkfs.ext4 /dev/md0
- mke2fs 1.42.9 (28-Dec-2013)
- Filesystem label=
- OS type: Linux
- Block size=4096 (log=2)
- Fragment size=4096 (log=2)
- Stride=128 blocks, Stripe width=256 blocks
- 2621440 inodes, 10477312 blocks
- 523865 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=2157969408
- 320 block groups
- 32768 blocks per group, 32768 fragments per group
- 8192 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
- 4096000, 7962624
- Allocating group tables: done
- Writing inode tables: done
- Creating journal (32768 blocks): done
- Writing superblocks and filesystem accounting information: done
再次,创建挂载点然后把硬盘设备进行挂载操作。挂载成功后可看到可用空间为40GB。
- [root@linuxprobe ~]# mkdir /RAID
- [root@linuxprobe ~]# mount /dev/md0 /RAID
- [root@linuxprobe ~]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/mapper/rhel-root 18G 3.0G 15G 17% /
- devtmpfs 905M 0 905M 0% /dev
- tmpfs 914M 84K 914M 1% /dev/shm
- tmpfs 914M 8.9M 905M 1% /run
- tmpfs 914M 0 914M 0% /sys/fs/cgroup
- /dev/sr0 3.5G 3.5G 0 100% /media/cdrom
- /dev/sda1 497M 119M 379M 24% /boot
- /dev/md0 40G 49M 38G 1% /RAID
最后,查看/dev/md0磁盘阵列的详细信息,并把挂载信息写入到配置文件中,使其永久生效。
- [root@linuxprobe ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Tue May 5 07:43:26 2017
- Raid Level : raid10
- Array Size : 41909248 (39.97 GiB 42.92 GB)
- Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
- Raid Devices : 4
- Total Devices : 4
- Persistence : Superblock is persistent
- Update Time : Tue May 5 07:46:59 2017
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 0
- Layout : near=2
- Chunk Size : 512K
- Name : localhost.localdomain:0 (local to host localhost.localdomain)
- UUID : cc9a87d4:1e89e175:5383e1e8:a78ec62c
- Events : 17
- Number Major Minor RaidDevice State
- 0 8 16 0 active sync /dev/sdb
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- [root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
7.1.2 损坏磁盘阵列及修复
之所以在生产环境中部署RAID 10磁盘阵列,是为了提高硬盘存储设备的读写速度及数据的安全性,但由于我们的硬盘设备是在虚拟机中模拟出来的,因此对读写速度的改善可能并不直观,因此刘遄老师决定给各位读者讲解一下RAID磁盘阵列损坏后的处理方法,这样大家在步入运维岗位后遇到类似问题时,也可以轻松解决。
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用mdadm命令将其移除,然后查看RAID磁盘阵列的状态,可以发现状态已经改变。
咱们在生产环境中部署RAID10磁盘阵列组目的就是为了提高存储设备的IO读写速度及数据的安全性,但因为这次是在本机电脑上模拟出来的硬盘设备所以对于读写速度的改善可能并不直观,因此刘遄老师决定给同学们讲解下RAID磁盘阵列组损坏后的处理方法,这样以后步入了运维岗位后不会因为突发事件而手忙脚乱。首先确认有一块物理硬盘设备出现损坏不能再继续正常使用后,应该使用mdadm命令来予以移除之后查看下RAID磁盘阵列组的状态已经被改变:
- [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
- mdadm: set /dev/sdb faulty in /dev/md0
- [root@linuxprobe ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Fri May 8 08:11:00 2017
- Raid Level : raid10
- Array Size : 41909248 (39.97 GiB 42.92 GB)
- Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
- Raid Devices : 4
- Total Devices : 4
- Persistence : Superblock is persistent
- Update Time : Fri May 8 08:27:18 2017
- State : clean, degraded
- Active Devices : 3
- Working Devices : 3
- Failed Devices : 1
- Spare Devices : 0
- Layout : near=2
- Chunk Size : 512K
- Name : linuxprobe.com:0 (local to host linuxprobe.com)
- UUID : f2993bbd:99c1eb63:bd61d4d4:3f06c3b0
- Events : 21
- Number Major Minor RaidDevice State
- 0 0 0 0 removed
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 0 8 16 - faulty /dev/sdb
在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。当购买了新的硬盘设备后再使用mdadm命令来予以替换即可,在此期间我们可以在/RAID目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先重启系统,然后再把新的硬盘添加到RAID磁盘阵列中。
- [root@linuxprobe ~]# umount /RAID
- [root@linuxprobe ~]# mdadm /dev/md0 -a /dev/sdb
- [root@linuxprobe ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Mon Jan 30 00:08:56 2017
- Raid Level : raid10
- Array Size : 41909248 (39.97 GiB 42.92 GB)
- Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
- Raid Devices : 4
- Total Devices : 4
- Persistence : Superblock is persistent
- Update Time : Mon Jan 30 00:19:53 2017
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 0
- Layout : near=2
- Chunk Size : 512K
- Name : localhost.localdomain:0 (local to host localhost.localdomain)
- UUID : d3491c05:cfc81ca0:32489f04:716a2cf0
- Events : 56
- Number Major Minor RaidDevice State
- 4 8 16 0 active sync /dev/sdb
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- [root@linuxprobe ~]# mount -a
7.1.3 磁盘阵列+备份盘
RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一RAID 1磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失。换句话说,在RAID 10磁盘阵列中,如果RAID 1中的某一块硬盘出现了故障,而我们正在前往修复的路上,恰巧该RAID1磁盘阵列中的另一块硬盘设备也出现故障,那么数据就被彻底丢失了。刘遄老师可真不是乌鸦嘴,这种RAID 1磁盘阵列中的硬盘设备同时损坏的情况还真被我的学生遇到过。
在这样的情况下,该怎么办呢?其实,我们完全可以使用RAID备份盘技术来预防这类事故。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态,一旦RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。这样很棒吧!
为了避免多个实验之间相互发生冲突,我们需要保证每个实验的相对独立性,为此需要大家自行将虚拟机还原到初始状态。另外,由于刚才已经演示了RAID 10磁盘阵列的部署方法,我们现在来看一下RAID 5的部署效果。部署RAID 5磁盘阵列时,至少需要用到3块硬盘,还需要再加一块备份硬盘,所以总计需要在虚拟机中模拟4块硬盘设备,如图7-6所示。
图7-6 在虚拟机中模拟添加4块硬盘设备
现在创建一个RAID 5磁盘阵列+备份盘。在下面的命令中,参数-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数,参数-l 5代表RAID的级别,而参数-x 1则代表有一块备份盘。当查看/dev/md0(即RAID 5磁盘阵列的名称)磁盘阵列的时候就能看到有一块备份盘在等待中了。
- [root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
- mdadm: layout defaults to left-symmetric
- mdadm: layout defaults to left-symmetric
- mdadm: chunk size defaults to 512K
- mdadm: size set to 20954624K
- mdadm: Defaulting to version 1.2 metadata
- mdadm: array /dev/md0 started.
- [root@linuxprobe ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Fri May 8 09:20:35 2017
- Raid Level : raid5
- Array Size : 41909248 (39.97 GiB 42.92 GB)
- Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
- Raid Devices : 3
- Total Devices : 4
- Persistence : Superblock is persistent
- Update Time : Fri May 8 09:22:22 2017
- State : clean
- Active Devices : 3
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 512K
- Name : linuxprobe.com:0 (local to host linuxprobe.com)
- UUID : 44b1a152:3f1809d3:1d234916:4ac70481
- Events : 18
- Number Major Minor RaidDevice State
- 0 8 16 0 active sync /dev/sdb
- 1 8 32 1 active sync /dev/sdc
- 4 8 48 2 active sync /dev/sdd
- 3 8 64 - spare /dev/sde
现在将部署好的RAID 5磁盘阵列格式化为ext4文件格式,然后挂载到目录上,之后就可以使用了。
- [root@linuxprobe ~]# mkfs.ext4 /dev/md0
- mke2fs 1.42.9 (28-Dec-2013)
- Filesystem label=
- OS type: Linux
- Block size=4096 (log=2)
- Fragment size=4096 (log=2)
- Stride=128 blocks, Stripe width=256 blocks
- 2621440 inodes, 10477312 blocks
- 523865 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=2157969408
- 320 block groups
- 32768 blocks per group, 32768 fragments per group
- 8192 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
- 4096000, 7962624
- Allocating group tables: done
- Writing inode tables: done
- Creating journal (32768 blocks): done
- Writing superblocks and filesystem accounting information: done
- [root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
- [root@linuxprobe ~]# mkdir /RAID
- [root@linuxprobe ~]# mount -a
最后是见证奇迹的时刻!我们再次把硬盘设备/dev/sdb移出磁盘阵列,然后迅速查看/dev/md0磁盘阵列的状态,就会发现备份盘已经被自动顶替上去并开始了数据同步。RAID中的这种备份盘技术非常实用,可以在保证RAID磁盘阵列数据安全性的基础上进一步提高数据可靠性,所以,如果公司不差钱的话还是再买上一块备份盘以防万一。
- [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
- mdadm: set /dev/sdb faulty in /dev/md0
- [root@linuxprobe ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Fri May 8 09:20:35 2017
- Raid Level : raid5
- Array Size : 41909248 (39.97 GiB 42.92 GB)
- Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
- Raid Devices : 3
- Total Devices : 4
- Persistence : Superblock is persistent
- Update Time : Fri May 8 09:23:51 2017
- State : active, degraded, recovering
- Active Devices : 2
- Working Devices : 3
- Failed Devices : 1
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 512K
- Rebuild Status : 0% complete
- Name : linuxprobe.com:0 (local to host linuxprobe.com)
- UUID : 44b1a152:3f1809d3:1d234916:4ac70481
- Events : 21
- Number Major Minor RaidDevice State
- 3 8 64 0 spare rebuilding /dev/sde
- 1 8 32 1 active sync /dev/sdc
- 4 8 48 2 active sync /dev/sdd
- 0 8 16 - faulty /dev/sdb
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。