1. RAID详解

独立硬盘冗余阵列 ( RAID, Redundant Array of Independent Disks) , 旧称廉价磁盘冗余阵列 ( Redundant Array of Inexpensive Disks) , 简称磁盘阵列。其基本思想就是把多个相对便宜的硬盘组合起来 , 成为一个硬盘阵列组 , 使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。根据选择的版本不同 , RAID比单颗硬盘有以下一个或多个方面的好处 : 增强数据集成度 , 增强容错功能 , 增加处理量或容量。另外 , 磁盘阵列对于计算机来说 , 看起来就像一个单独的硬盘或逻辑存储单元。分为RAID-0 , RAID-1 , RAID-5 , RAID-6 , RAID-7 , RAID-01 , RAID-10 , RAID-50 , RAID-60。

从实现角度看,RAID 主要分为软 RAID、硬RAID 以及软硬混合RAID 三种。软 RAID 所有功能均有操作系统和 CPU 来完成 , 没有独立的 RAID 控制 / 处理芯片和 I/O 处理芯片 , 效率自然最低。硬RAID 配备了专门的 RAID 控制 / 处理芯片和 I/O 处理芯片以及阵列缓冲 , 不占用 CPU 资源 , 但成本很高。软硬混合RAID 具备 RAID 控制 / 处理芯片 , 但缺乏I/O 处理芯片 , 需要 CPU 和驱动程序来完成 , 性能和成本 在软 RAID 和硬RAID之间。

RAID 中主要有三个关键概念和技术 : 镜像 (Mirroring )、数据条带 ( Data Stripping )和数据校验 ( Data parity ) 。镜像 , 将数据复制到多个磁盘 , 一方面可以提高可靠性 , 另一方面可并发从两个或多个副本读取数据来提高读性能。显而易见 , 镜像的写性能要稍低 , 确保数据正确地写到多个磁盘需要更多的时间消耗。数据条带 , 将数据分片保存在多个不同的磁盘 , 多个数据分片共同组成一个完整数据副本 , 这与镜像的多个副本是不同的 , 它通常用于性能考虑。数据条带具有更高的并发粒度 , 当访问数据时 , 可以同时对位于不同磁盘上数据进行读写操作 , 从而获得非常可观的 I/O 性能提升 。数据校验 , 利用冗余数据进行数据错误检测和修复 , 冗余数据通常采用海明码、异或操作等算法来计算获得。利用校验功能 , 可以很大程度上提高磁盘阵列的可靠性、鲁棒性和容错能力。不过 , 数据校验需要从多处读取数据并进行计算和对比 , 会影响系统性能。 不同等级的 RAID 采用一个或多个以上的三种技术 , 来获得不同的数据可靠性、可用性和 I/O 性能。至于设计何种 RAID ( 甚至新的等级或类型)或采用何种模式的 RAID , 需要在深入理解系统需求的前提下进行合理选择 , 综合评估可靠性、性能和成本来进行折中的选择。

1.1 RAID 0

RAID0 是一种简单的、无数据校验的数据条带化技术。实际上不是一种真正的 RAID , 因为它并不提供任何形式的冗余策略。 RAID0 将所在磁盘条带化后组成大容量的存储空间 , 将数据分散存储在所有磁盘中 , 以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作 , 总线带宽得到充分利用。再加上不需要进行数据校验 , RAID0 的性能在所有 RAID 等级中是最高的。理论上讲 , 一个由 n 块磁盘组成的 RAID0 , 它的读写性能是单个磁盘性能的 n 倍 , 但由于总线带宽等多种因素的限制 , 实际的性能提升低于理论值。

RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点 , 但是它不提供数据冗余保护 , 一旦数据损坏 , 将无法恢复。 因此 , RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用 , 如视频、音频存储、临时数据缓存空间等。

54161303

1.2 RAID 1

RAID1 称为镜像 , 它将数据完全一致地分别写到工作磁盘和镜像 磁盘 , 它的磁盘空间利用率为 50% 。 RAID1 在数据写入时 , 响应时间会有所影响 , 但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护 , 一旦工作磁盘发生故障 , 系统自动从镜像磁盘读取数据 , 不会影响用户工作。

RAID1 与 RAID0 刚好相反 , 是为了增强数据安全性使两块 磁盘数据呈现完全镜像 , 从而达到安全性好、技术简单、管理方便。 RAID1 拥有完全容错的能力 , 但实现成本高。 RAID1 应用于对顺序读写性能要求高以及对数据保护极为重视的应用 , 如对邮件系统的数据保护。

RAID1

1.3 RAID 4

RAID4 在不同磁盘上的同级数据块同样使用XOR 校验 , 结果存储在单独的校验盘中。写入数据时 , RAID4 按这种方式把各磁盘上的同级数据的校验值写入校验盘 , 读取时进行即时校验。因此 , 当某块磁盘的数据块损坏 , RAID4 可以通过校验值以及其他磁盘上的同级数据块进行数据重建。

RAID4 提供了 非常好的读性能 , 但单一的校验盘往往成为系统性能的瓶颈。对于写操作 , RAID4 只能一个磁盘一个磁盘地写 , 并且还要写入校验数据 , 因此写性能比较差。而且随着成员磁盘数量的增加 , 校验盘的系统瓶颈将更加突出。正是如上这些限制和不足 , RAID4 在实际应用中很少见 , 主流存储产品也很少使用RAID4 保护。

RAID4_1

1.4 RAID 5

RAID5 应该是目前最常见的 RAID 等级 , 它的原理与RAID4 相似 , 区别在于校验数据分布在阵列中的所有磁盘上 , 而没有采用专门的校验磁盘。对于数据和校验数据 , 它们的写操作可以同时发生在完全不同的磁盘上。因此 , RAID5 不存在RAID4中的并发写操作时的校验盘性能瓶颈问题。另外 , RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时 , 并行操作量的能力也随之增长 , 可比 RAID4 支持更多的磁盘 , 从而拥有更高的容量以及更高的性能。

RAID5的磁盘上同时存储数据和校验数据 , 数据块和对应的校验信息存保存在不同的磁盘上 , 当一个数据盘损坏时 , 系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID 等级一样 , 重建数据时 , RAID5 的性能会受到较大的影响。

RAID5 兼顾存储性能、数据安全和存储成本等各方面因素 , 它可以理解为RAID0 和 RAID1 的折中方案 , 是目前综合性能最佳的数据保护解决方案。RAID5基本上可以满足大部分的存储应用需求 , 数据中心大多采用它作为应用数据的保护方案。

RAID5

1.6 RAID 6

RAID6引入双重校验的概念 , 它可以保护阵列中同时出现两个磁盘失效时 , 阵列仍能够继续工作 , 不会发生数据丢失。 RAID6 等级是在 RAID5 的基础上为了进一步增强数据保护而设计的一种 RAID 方式 , 它可以看作是一种扩展的 RAID5 等级。

RAID6 不仅要支持数据的恢复 , 还要支持校验数据的恢复 , 因此实现代价很高 , 控制器的设计也比其他等级更复杂、更昂贵。 RAID6 思想最常见的实现方式是采用两个独立的校验算法 , 假设称为 P 和 Q , 校验数据可以分别存储在两个不同的校验盘上 , 或者分散存储在所有成员磁盘中。当两个磁盘同时失效时 , 即可通过求解两元方程来重建两个磁盘上的数据。

RAID6 具有快速的读取性能、更高的容错能力。但是 , 它的成本要高于 RAID5 许多 , 写性能也较差 , 并有设计和实施非常复杂。因此 , RAID6 很少得到实际应用 , 主要用于对数据安全等级要求非常高的场合。它一般是替代RAID10 方案的经济性选择。

1.7 RAID 01与10

RAID01 是先做条带化再作镜像 , 本质是对物理磁盘实现镜像;而 RAID10 是先做镜像再作条带化 , 是对虚拟磁盘实现镜像。相同的配置下 , 通常 RAID10 比 RAID01 具有更好的容错能力。

RAID01 兼备了RAID0 和 RAID1 的优点 , 它先用两块磁盘建立镜像 , 然后再在镜像内部做条带化。 RAID01 的数据将同时写入到两个磁盘阵列中 , 如果其中一个阵列损坏 , 仍可继续工作 , 保证数据安全性的同时又提高了性能。 RAID01 和RAID10内部都含有RAID1模式 , 因此整体磁盘利用率均仅为50%。

RAID10VSRAID01

2. 软RAID-mdadm

mdadm (Multiple Device ADMin)是 Linux 下管理软RAID(Software RAID)的核心工具 , 支持 RAID 0/1/4/5/6/10 等多种级别 ,以及热备盘、故障恢复、阵列监控等功能。

  • 语法 : mdadm [模式] <RAID设备名称> [选项] [成员设备名称]

mdadm 没有单一固定子命令 , 靠不同选项切换 5 种模式 , 这是和其他命令最大区别

模式

参数

作用

Create 创建模式

--create / -C

新建 RAID 阵列 , 写入元数据 superblock

Assemble 组装模式

--assemble / -A

开机 / 手动组装已存在的旧阵列(读取磁盘上 RAID 元数据)

Manage 管理模式

无主选项 , 直接写/dev/md0

在线管理 : 标记故障盘、移除、添加磁盘、热备盘

Monitor 监控模式

--monitor / -F

后台持续监控阵列 , 故障发邮件告警

Grow 扩容 / 重组

--grow

修改阵列: 扩容、增减成员盘、修改 chunk

  • 创建模式 : -C ,--create

    专有选项

    • -n # : 使用#个块设备来创建此RAID :

    • -l # : 指明创建的RAID的级别

    • -a {yea|no} :自动创建目标RAID设备的设备文件

    • -c CHUNK_SIZE : 指明块代销

    • -x # : 指明空闲盘的个数 :

  • 装配模式 : -A ,--assemble

  • 增长模式 : -G ,--grow

    • -a :添加新硬盘

    • -n : 改变RAID磁盘本身的活动设备数量

  • 监控模式 : -F ,--follow ,--monitor (很少用)

  • 杂项模式 : --misc

    • -D , --detail : 显示详细信息

    • -S : 停止现在的RAID

    • -s , --scan :扫描设备

    • --zero-superblock : 删除磁盘中超级块中保存的RAID信息

  • 管理模式 : --manager

    • -a,--add :添加设备

    • -r,--remove :移除设备

    • -f,--fail :标记设备为损坏

    • -S :设备停止运行

示例:

[root@localhost /]# mdadm -C /dev/md0  -a yes -l 5 -n 3 -x 1 /dev/sd{b1,c1,d1,e1}       //创建新的RAID5
mdadm: /dev/sdb1 appears to contain an ext2fs file system
       size=5253220K  mtime=Wed Oct  3 23:53:17 2018
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
​
[root@localhost /]# mdadm -S /dev/md0   //停止运行对应的RAID
mdadm: stopped /dev/md0
[root@localhost /]# mdadm -A /dev/md0  /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/md0 has been started with 3 drives and 1 spare.
[root@localhost /]# mdadm -Ds > /etc/mdadm.conf   //如果提前将对应的配置存放在配置文件中 ,  之后 启动时可以直接启动
[root@localhost /]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@localhost /]# mdadm -As /dev/md0
mdadm: /dev/md0 has been started with 3 drives and 1 spare.
​
​
[root@localhost /]# mdadm  /dev/md0 -f /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0
[root@localhost /]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Oct  5 00:22:06 2018
     Raid Level : raid5
     Array Size : 10498048 (10.01 GiB 10.75 GB)
  Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent
​
    Update Time : Fri Oct  5 00:51:43 2018
          State : clean, degraded, recovering 
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
​
         Layout : left-symmetric
     Chunk Size : 512K
​
 Rebuild Status : 20% complete
​
           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : a2bc0622:be4ad1cc:2f06585a:f82f1ede
         Events : 23
​
    Number   Major   Minor   RaidDevice State
       3       8       65        0      spare rebuilding   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1
​
       0       8       17        -      faulty   /dev/sdb1
[root@localhost /]# mdadm  --manage /dev/md0 -r  /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0
[root@localhost /]# mdadm  --manage /dev/md0 -a  /dev/sdb1
mdadm: added /dev/sdb1
​
[root@localhost ~]# mdadm --zero-superblock /dev/sd{b,c,d,e}1  //清除磁盘RAID信息
​

注 :

  1. 可以通过mdadm --[mode] --help对应模式的帮助文档

  1. 模式中--manage,--misc 这两个模式可以省略不用写 ;

  2. /proc/mdstat文件中可以查看对应RAID的状态

RAID 1 硬盘更换流程

# 1. 标记故障盘
mdadm --manage /dev/md0 --fail /dev/sda1
​
# 2. 移除故障盘
mdadm --manage /dev/md0 --remove /dev/sda1
​
# 3. 物理更换硬盘后,分区(保持相同大小或更大)
fdisk /dev/sda  # 创建 sda1
​
# 4. 添加新盘
mdadm --manage /dev/md0 --add /dev/sda1
​
# 5. 查看重建进度
watch -n 1 cat /proc/mdstat
# 或
mdadm --detail /dev/md0 | grep -E "State|Rebuild"
​

创建 RAID 5 并配置热备

# 创建(3活动+1热备)
mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd[b-e]1
​
# 保存配置
mdadm --detail --scan >> /etc/mdadm.conf
update-initramfs -u  # Debian/Ubuntu 更新启动配置
​
# 创建文件系统
mkfs.ext4 /dev/md0
​
# 挂载
mount /dev/md0 /mnt/data
​

迁移 RAID 到新系统

# 旧系统停止
mdadm --stop /dev/md0
​
# 新系统扫描装配(自动识别)
mdadm --assemble --scan
​
# 如果无法识别,手动指定
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1
​

定期检查: 每月执行一次校验(Scrubbing) :

# 启动校验(检查奇偶校验一致性)
echo check > /sys/block/md0/md/sync_action
​
# 查看校验进度
cat /sys/block/md0/md/sync_action
cat /proc/mdstat
​



参考链接

维基百科:RAID 图文并茂 RAID 技术全解 ,

熊熊