纸上得来终觉浅,绝知此事要躬行。
独立硬盘冗余阵列(RAID),旧称廉价磁盘冗余阵列,简称磁盘阵列。其基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。根据选择的版本不同,RAID 比单颗硬盘有以下一个或多个方面的好处:增强数据集成度,增强容错功能,增加处理量或容量。另外,磁盘阵列对于电脑来说,看起来就像一个单独的硬盘或逻辑存储单元。
提成方面
- 提高 IO 能力
- 磁盘并行读写
- 提高耐用性
- 磁盘冗余来实现
- 有的厂商给 riad 添加内存来提高 I/O 能力,但是因为是内存所以数据可能会丢失,所以后来的 raid 控制器提供了独立得电池,足以将内存中的数据写完。
RAID 实现的方式
- 外接式磁盘阵列
- 通过扩展卡提供适配能力
- 内接式 RAID
- 主板集成 RAID 控制器
- Software RAID
RAID 实现的方式详解
软件磁盘阵列(Software RAID)
- 主要由电脑主板 CPU 处理数组存储作业,缺点为耗损较多 CPU 资源运算 RAID,优点则是价格偏低。分类有二种:
- 纯软件磁盘阵列(Pure Software RAID):只需要主板支持即可,不需要任何磁盘阵列卡。若主板损坏,可能难以购买同款主板重建 RAID。
- 硬件辅助磁盘阵列(Hardware-Assisted RAID):需要一张 RAID 卡,以及厂商所提供的驱动程序。这款 RAID 较易迁移到其他电脑。
- 主要由电脑主板 CPU 处理数组存储作业,缺点为耗损较多 CPU 资源运算 RAID,优点则是价格偏低。分类有二种:
硬件磁盘阵列(Hardware RAID)
- RAID 卡上内置处理器,不需要服务器的 CPU 运算。优点是读写性能最快,不占用服务器资源,可用于任何操作系统,也能在系统断电后,通过备份电池模块(BBU, Backup Battery Unit)以及非易失性内存 (NVRAM)将硬盘读写日志档(Journal)包含的剩余读写作业先纪录在内存中,等待电力供应撤消后,再由 NVRAM 取回日志档数据,接着再完成读写作业,将剩余读写作业安全完成以确保读写完整性。备份电池模块通常会配合数组卡的 Write-Back 缓存模式,借由此内存缓存读写作业以得到更高的读写性能;但是没有备份电池模块的硬件磁盘阵列卡,切勿使用 Write-Back 缓存模式以免遭遇断电情形导致读写数据流失。此外,因为硬件磁盘阵列卡搭载 CPU 处理器,所以可以与系统分离出来,对硬盘进行各种作业,还原作业的速度也比软件磁盘阵列快。缺点是其售价很高,通常只用于 RAID 5 和 RAID 6。
RAID 级别
- 标准 RAID
- RAID 0
- RAID 1
- RAID 2
- RAID 3
- RAID 4
- RAID 5
- RAID 6
- 混合 RAID
- JBOD
- RAID 7
- RAID 10
- RAID 01
- RAID 50
- RAID 53
- RAID 60
各个级别性能评价
1. RAID 级别介绍
1.1 RAID 0
RAID 0 亦称为带区集。它将两个以上的磁盘并联起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0 的速度是最快的。但是 RAID 0 既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,危险程度与 JBOD 相当。
1.2 RAID 1
两组以上的 N 个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,另外写入速度有微小的降低。只要一个磁盘正常即可维持运作,可靠性最高。其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以 RAID 1 的数据安全性在所有的 RAID 级别上来说是最好的。但无论用多少磁盘做 RAID 1,仅算一个磁盘的容量,是所有 RAID 中磁盘利用率最低的一个级别。
1.3 RAID 4
它与 RAID 3 不同的是它在分区时是以区块为单位分别存在硬盘中,但每次的数据访问都必须从同比特检查的那个硬盘中取出对应的同比特数据进行核对,由于过于频繁的使用,所以对硬盘的损耗可能会提高。(块交织技术,Block interleaving)
1.4 RAID 5
RAID Level 5 是一种储存性能、数据安全和存储成本兼顾的存储解决方案。它使用的是 Disk Striping(硬盘分区)技术。RAID 5 至少需要三块硬盘,RAID 5 不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成 RAID5 的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。
当 RAID5 的一个磁盘数据发生损坏后,可以利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5 可以理解为是 RAID 0 和 RAID 1 的折衷方案。RAID 5 可以为系统提供数据安全保障,但保障程度要比镜像低而磁盘空间利用率要比镜像高。
RAID 5 具有和 RAID 0 相近似的数据读取速度,只是因为多了一个奇偶校验信息,写入数据的速度相对单独写入一块硬盘的速度略慢,若使用“回写缓存”可以让性能改善不少。同时由于多个数据对应一个奇偶校验信息,RAID 5 的磁盘空间利用率要比 RAID 1 高,存储成本相对较便宜。
1.5 RAID 6
与 RAID 5 相比,RAID 6 增加第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,任意两块磁盘同时失效时不会影响数据完整性。RAID 6 需要分配给奇偶校验信息更大的磁盘空间和额外的校验计算,相对于 RAID 5 有更大的 IO 操作量和计算量,其“写性能”强烈取决于具体的实现方案,因此 RAID6 通常不会通过软件方式来实现,而更可能通过硬件/固件方式实现。
同一数组中最多容许两个磁盘损坏。更换新磁盘后,数据将会重新算出并写入新的磁盘中。依照设计理论,RAID 6 必须具备四个以上的磁盘才能生效。
1.6 RAID 10
RAID 10 是先镜射再分区数据,再将所有硬盘分为两组,视为是 RAID 0 的最低组合,然后将这两组各自视为 RAID 1 运作。RAID 01 则是跟 RAID 10 的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成 RAID 1 的最低组合,而将两组硬盘各自视为 RAID 0 运作。
1.7 RAID 01
当 RAID 10 有一个硬盘受损,其余硬盘会继续运作。RAID 01 只要有一个硬盘受损,同组 RAID 0 的所有硬盘都会停止运作,只剩下其他组的硬盘运作,可靠性较低。如果以六个硬盘建 RAID 01,镜射再用三个建 RAID 0,那么坏一个硬盘便会有三个硬盘脱机。因此,RAID 10 远较 RAID 01 常用,零售主板绝大部分支持 RAID 0/1/5/10,但不支持 RAID 01。
1.8 JBOD
JBOD( Just a Bunch Of Disks)在分类上,JBOD 并不是 RAID 的档次。由于并没有规范,市场上有两类主流的做法:
- 使用单独的链接端口如 SATA、USB 或 1394 同时控制多个各别独立的硬盘,使用这种模式通常是较高级的设备,还具备有 RAID 的功能,不需要依靠 JBOD 达到合并逻辑扇区的目的。
- 只是将多个硬盘空间合并成一个大的逻辑硬盘,没有错误备援机制。
数据的存放机制是由第一颗硬盘开始依序往后存放,即操作系统看到的是一个大硬盘(由许多小硬盘组成的)。但如果硬盘损毁,则该颗硬盘上的所有数据将无法救回。若第一颗硬盘损坏,通常无法作救援(因为大部分文件系统将磁盘分区表(partition table)存在磁盘前端,即第一颗),失去磁盘分区表即失去一切数据,若遭遇磁盘阵列数据或硬盘出错的状况,危险程度较 RAID 0 更剧。它的好处是不会像 RAID,每次访问都要读写全部硬盘。
1.9 RAID 7
RAID 7 并非公开的 RAID 标准,而是 Storage Computer Corporation 的专利硬件产品名称,RAID 7 是以 RAID 3 及 RAID 4 为基础所发展,但是经过强化以解决原来的一些限制。另外,在实现中使用大量的高速缓存以及用以实现异步数组管理的专用即时处理器,使得 RAID 7 可以同时处理大量的 IO 要求,所以性能甚至超越了许多其他 RAID 标准的实做产品。但也因为如此,在价格方面非常的高昂。
2. 实战演示
CentOS 6 上 mdadm 命令的软件 RAID 的实现
- 使用之前,需要内核开启
md
(multi devices
)模块方可使用。 - 模式化的工具,支持的
RAID
级别:LINEAR
,RAID0
,RAID1
,RAID4
,RAID5
,RAID6
,RAID10
格式:
mdadm [mode] <raiddevice> [options] <component-devices>
2.1 模式化命令
(1) 创建模式:创建 raid 设备的 -C
专用选项:
-l N
- 级别
-n N
- 设备个数
-a{yes|no}
- 自动为其创建设备文件
-c N
- 指定的数据的大小默认 64k
-x N
- 指定空闲盘个数-x 和-n 数一样
(2) 管理模式:停止,拆散
-a
,--add
- 添加硬盘
-r
,--remove
- 移除坏的硬盘
-f
,--fail
- 模拟损坏
-S
,--stop
- 停止一个阵列
# 移除一个硬盘
mdadm /dev/md1 -r /dev/sdb1
# 添加盘,和原来的盘的大小相同
mdadm /dev/md1 -a /dev/sdb2
# 模拟一块硬盘已经损坏
mdadm /dev/md1 -f /dev/sdb1
# 停止一个阵列
mdadm -S /dev/md1
(3) 监控模式:是否正常
-F
,--monitor
- 选择监控模式
-D
,--detail
- 显示指定 raid 的详细信息
- 举例:
mdadm -D /dev/md1
-D --scan
- 当前主机 raid 设备
- 将当前 raid 信息保存至配置文件,以便以后进行装配
mdadm -D --scan >/etc/mdadm.conf
直接mdadm -A /dev/md1
就行了
(4) 增长模式:添加盘用到
-G
,--grow
- 改变激活阵列的大小或形态
(5) 装配模式:重新识别为 raid
-A
mdadm -A /dev/md1 /dev/sda1 /dev/sdc1
2.2 其他相关命令
观察 md 的状态
cat /proc/mdstat
mdadm --detail /dev/md0
watch 命令
-n # command
- 缺省每 2 秒运行一下程序,可以用-n 来指定间隔的时间,单位是秒
-d
- 会高亮显示变化的区域
-t
- 会关闭 watch 命令在顶部的时间间隔
-h
- 查看帮助文档
2.3 实战演示
# 1、加硬盘,分区,修改id(调整类型为fd)
# 这里的sdd1是在模拟故障时做备份的
DeviceBoot Start End Blocks Id System
/dev/sdb1 1 130 1044193+ fd Linux raid autodetect
/dev/sdc1 1 130 1044193+ fd Linux raid autodetect
/dev/sdd1 1 130 1044193+ fd Linux raid autodetect
# cat /proc/partitions :查看可用分区
[root@localhost~]# cat /proc/partitions
majorminor blocks name
8 0 20971520 sda
8 1 204800 sda1
8 2 10485760 sda2
8 3 2097152 sda3
8 16 1048576 sdb
8 17 1044193 sdb1
8 32 1048576 sdc
8 33 1044193 sdc1
8 48 1048576 sdd
8 49 1044193 sdd1
# 2、创建raid
[root@localhost~]# mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sd{b1,c1}
# 查看raid设备的状态:cat /proc/mdstat
[root@localhost ~]# cat /proc/mdstat
Personalities: [raid1]
md0: active raid1 sdc1[1] sdb1[0]
1043648 blocks super 1.2 [2/2] [UU]
unuseddevices: <none>
# 解释:
# md0:raid名字,active:显示活动的硬盘,也就是可用的硬盘,[1]代表在阵列中的顺序,这个顺序可以从mdadm -D /dev/md0中的number中体现1043648个block ,[UU]:都在使用中,也就是正常运行的如果是 [U_ ]的话,_就是出问题的faulty状态。
# 3、格式化:
mke2fs -j /dev/md0
# 格式化之后就可以用了
# 4、挂载:
[root@localhost ~]# mount /dev/md0 /mnt
# 复制一个文件,后面做恢复实验
[root@localhost ~]# cp /root/install.log/mnt/
# 5、模拟磁盘损坏
# a)现在模拟/dev/sdb1损坏
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb1
# b)移除:坏了就是拔掉
[root@localhost ~]# mdadm /dev/md0 -r /dev/sdb1
# c)添加一个硬盘:拔掉硬盘就要再上一块
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdd1
# d)阵列不想用了
[root@localhost~]# umount /mnt/
[root@localhost~]# mdadm -S /dev/md0
mdadm:stopped /dev/md0
# 如果/dev/md0删除就彻底删除了这个阵列
# e)我又想使用了
[root@localhost~]# mdadm -A /dev/md0 /dev/sdb1/dev/sdc1
mdadm:/dev/md0 assembled from 1 drive - need all 2 to start it (use --run to insist).
[root@localhost~]# cat /proc/mdstat
Personalities: [raid1]
md0 : inactive sdc1[1](S) sdb1[0](S) # S的意思处于热备状态的
2087363 blocks super 1.2
unuseddevices: <none>
# 在重组raid的时候出错了。出现的是需要2个硬盘同时来启动,但是上面有一个坏了,她就起不来了。所以此时这样
[root@localhost ~]# mdadm --runin insist /dev/md0
Personalities: [raid1]
md0: active raid1 sdc1[1]
1043648 blocks super 1.2 [2/1] [_U]
unuseddevices: <none>
# 此时又可以添加硬盘了
# 6、指定配置文件
# 默认的在我的虚拟机上是没有配置文件的,所以要自己生成了,配置文件有什么作用?
# 配置文件的作用最大的一个好处就是 装配RAID的时候,可以根据配置文件来装配,如果没有配置文件,你装配的时候就是:
[root@localhost ~]# mdadm -A /dev/md0 /dev/sdb1/dev/sdc1
# 如过有配置文件的话,你装配的时候就会去扫描你的配置文件,自动进行装配,此时,你只需要装配raid不用指定使用的硬盘了
[root@localhost ~]# mdadm -A /dev/md0
# 7、生成配置文件:可以自己手动去touch下面介绍第二种方法
[root@localhost~]# mdadm -D --scan >/etc/m
# --scan = -s 扫描配置文件
# 下面是效果
[root@localhost~]# mdadm -S /dev/md0
mdadm:stopped /dev/md0
[root@localhost~]# mdadm -A /dev/md0
mdadm:/dev/md0 has been started with 2 drives.
# 8、raid优化
# 软raid每一次生成chunk 的时候会计算占用多少block,所以格式化的时候 -E stride=倍数
# 倍数就是 chunk 除以 block的商默认chunk=64k,如果格式化的时候block是4k那么stride就等于16了,这样会优化raid性能
[root@localhost~]# mke2fs -j -E stride=16 -b 4096 /dev/md0