Skip to content

RAID磁盘阵列

RAID(Redundant Array of Independent Disks,独立冗余磁盘阵列)是一种将多个独立的磁盘组合成一个逻辑存储单元的技术,旨在提高数据存储的性能、容量、可靠性和冗余性。

基本原理

RAID 通过将数据分割成多个区段并分别存储在不同的硬盘上,利用个别磁盘提供数据加成效果,从而提升整个磁盘系统的效能。它采用同位检查的观念,当数组中任意一个硬盘发生故障时,仍可读出数据,并且在数据重构时,可将数据经计算后重新置入新硬盘中

分类

  • 硬件 RAID :通过 RAID 控制器来实现 RAID 功能,如外接式磁盘阵列柜和内接式磁盘阵列卡。外接式磁盘阵列柜常用于大型服务器,具可热交换的特性,但价格昂贵;内接式磁盘阵列卡价格便宜,但需要较高的安装技术。硬件 RAID 能够提供在线扩容、动态修改阵列级别、自动数据恢复等高级功能。
  • 软件 RAID :通过软件来仿真 RAID 功能,利用操作系统或专门的软件来管理磁盘阵列。其优点是成本低,不需要额外的硬件设备;缺点是会占用一定的系统资源,可能会影响系统的整体性能。一般用于一些对性能要求不是特别高,同时又希望实现数据冗余和简单磁盘管理的场景,如个人电脑、小型办公室网络等

级别划分

级别最低磁盘数数据分布冗余方式读写性能优点缺点适用场景
RAID 02条带化读写速度快性能提升明显,磁盘利用率 100%无数据冗余,安全性差对数据完整性要求不高的高性能场景,如日志存储、个人娱乐等
RAID 12完全镜像镜像冗余读快写慢数据安全性高磁盘利用率低(最高 50%),成本高存储关键性重要数据的场合,如财务数据存储
RAID 53条带化+奇偶校验分散的奇偶校验读快写中等兼具性能与冗余,磁盘利用率较高写入有性能开销,多盘故障风险文件服务器、应用服务器等
RAID 64条带化+双重奇偶校验双重奇偶校验读快写慢容错能力强,可容两盘故障成本高,磁盘利用率低对数据安全要求极高的场景,如存储关键业务数据的服务器
RAID 104镜像后条带化镜像冗余读写速度均较快继承 RAID 0 和 RAID 1 的优点成本高,磁盘利用率低(50%)对性能和数据安全性要求高的场景,如数据库服务器、金融交易系统

RAID 0(Striping)

mermaid
classDiagram
    class RAID_0 {
        <<RAID Level 0>>
    }

    class Disk0 {
        + Sector A1
        + Sector A3
        + Sector A5
        + Sector A7
    }

    class Disk1 {
        + Sector A2
        + Sector A4
        + Sector A6
        + Sector A8
    }

    RAID_0 --|> Disk0
    RAID_0 --|> Disk1

即Data Stripping数据分条技术。数据被条带化地分布到多个磁上盘,至少需要两块磁盘。优点是读写速度快,磁盘利用率 100%;缺点是无数据冗余,安全性差,任意一块磁盘损坏会导致整个数据丢失。适用于对数据完整性要求不高的场景,如日志存储、个人娱乐等。

RAID 0将数据平均分配到两块磁盘进行存储,不提供数据沉余,磁盘损坏数据无法恢复。

RAID 1(Mirroring)

mermaid
classDiagram
    class RAID_1 {
        <<RAID Level 1>>
    }

    class Disk0 {
        + Sector A1
        + Sector A2
        + Sector A3
        + Sector A4
    }

    class Disk1 {
        + Sector A1
        + Sector A2
        + Sector A3
        + Sector A4
    }

    RAID_1 --|> Disk0
    RAID_1 --|> Disk1

RAID 1称为磁盘镜像。数据被完整复制到另一块磁盘上,形成镜像,至少需要两块磁盘。优点是数据安全性高,读速度快;缺点是磁盘利用率低,最高为 50%,成本高。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。多用在保存关键性的重要数据的场合。

RAID5

mermaid
classDiagram
    class RAID_5 {
        <<RAID Level 5>>
        + 分布式奇偶校验
        + 条带化存储
    }

    class Disk0 {
        + A1
        + B1
        + C1
        + D1
    }

    class Disk1 {
        + A2
        + B2
        + Cp
        + D2
    }

    class Disk2 {
        + A3
        + Bp
        + C2
        + D3
    }

    class Disk3 {
        + Ap
        + B3
        + C3
        + Dp
    }

    RAID_5 --|> Disk0 : 条带组1
    RAID_5 --|> Disk1 : 条带组2
    RAID_5 --|> Disk2 : 条带组3
    RAID_5 --|> Disk3 : 条带组4

    note for RAID_5 "校验块分布规则:\nAp=奇偶校验(A1,A2,A3)\nBp=奇偶校验(B1,B2,B3)\nCp=奇偶校验(C1,C2,C3)\nDp=奇偶校验(D1,D2,D3)"
    note for Disk3 "校验块位置:\n每个条带组的校验块\n循环分布在不同磁盘"

数据和奇偶校验信息被分散存储到多个磁盘上,至少需要三块磁盘。优点是具有较高的数据传输率,磁盘利用率较高,读写性能好;缺点是写入数据时需要计算奇偶校验信息,会带来一定的性能开销,且当磁盘数量较多时,同时出现多块磁盘故障的可能性会增加。适用于文件服务器、应用服务器等场景。

RAID 6

mermaid
classDiagram
    class RAID_6 {
        <<RAID Level 6>>
        + 双分布式奇偶校验
        + 条带化存储
    }

    class Disk0 {
        + A1
        + B1
        + C1
        + Dp
    }

    class Disk1 {
        + A2
        + B2
        + Cq
        + D1
    }

    class Disk2 {
        + A3
        + Bp
        + C2
        + Dq
    }

    class Disk3 {
        + Aρ
        + Bq
        + C3
        + D2
    }

    class Disk4 {
        + Aq
        + B3
        + Cp
        + D3
    }

    RAID_6 --|> Disk0 : 条带组1
    RAID_6 --|> Disk1 : 条带组2
    RAID_6 --|> Disk2 : 条带组3
    RAID_6 --|> Disk3 : 条带组4
    RAID_6 --|> Disk4 : 条带组5

    note for RAID_6 "校验规则:\nρ = P校验(横向奇偶校验)\nq = Q校验(Reed-Solomon编码)\n可容忍任意两块磁盘同时故障"
    note for Disk0 "校验块分布模式:\nDp/Dq在Disk0/Disk2\nCp/Cq在Disk4/Disk1\nBp/Bq在Disk2/Disk3\nAp/Aq在Disk3/Disk4"

类似于 RAID 5,但使用了双重奇偶校验,至少需要四块磁盘。优点是具有更强的容错能力,能够容忍两块磁盘同时故障;缺点是成本更高,磁盘利用率相对较低。适用于对数据安全要求极高的场景,如存储关键业务数据的服务器等。

RAID 10/01

结合了 RAID 1 和 RAID 0 的特点,先进行镜像再进行条带化,至少需要四块磁盘。优点是继承了 RAID 0 的快速与高效以及 RAID 1 的数据安全性;缺点是成本高,磁盘利用率低。在实际应用中较为常见,适用于对性能和数据安全性要求都很高的场景,如数据库服务器、金融交易系统等。

RAID软件基本操作步骤

准备工作

  1. 安装 mdadm 工具mdadm 是 Linux 下用于创建和管理软件 RAID 的常用命令。

    bash
    # RHEL
    yum/dnf -y install mdadm
    
    # Ubuntu 
    apt -y install mdadm
  2. 查看磁盘状态 :使用 lsblkfdisk -l 命令查看系统中已连接的磁盘设备及其状态,确定用于创建磁盘阵列的磁盘

创建磁盘阵列

注意:创建完阵列后需要mdadm -D 阵列路径查看状态进度Resync Status到达100%后在继续下一步操作。如没有Resync Status则表示进度100%。

  1. 创建 RAID0 阵列

    假设使用两块磁盘 /dev/sdb/dev/sdc-C创建,-v显示过程,-n磁盘数量,-lraid0级别

    创建完成后,mdadm 会开始同步数据,可通过查看 /proc/mdstat 文件监控同步进度。

    bash
    mdadm -Cv /dev/md0 -n 2 -l 0 /dev/sdb /dev/sdc
    # 查看详情进度
    mdadm -D /dev/md0
  2. 创建 RAID1 阵列

    假设使用两块磁盘 /dev/sdb/dev/sdc-C创建,-v显示过程,-n磁盘数量,-lraid1级别 ,-x备用盘数量

    创建完成后,mdadm 会开始同步数据,可通过查看 /proc/mdstat 文件监控同步进度。

    bash
    mdadm -Cv /dev/md1 -n 2 -l 0 -x 1 /dev/sdb /dev/sdc
    # 查看详情进度
    mdadm -D /dev/md1
  3. 创建 RAID5 阵列

    假设使用三块磁盘/dev/sda1/dev/sdb1/dev/sdc1-C创建,-v显示过程,-n磁盘数量,-lraid5级别 ,-x备用盘数量,创建完成后,mdadm 会开始同步数据

    bash
    mdadm -Cv /dev/md5 -l 5 -n 3 -x 1 /dev/sda1 /dev/sdb1 /dev/sdc1
    # 查看详情进度
    mdadm -D /dev/md5
  4. 创建 RAID10 阵列

    若使用四块磁盘 /dev/sdb/dev/sdc/dev/sdd/dev/sde-C创建,-v显示过程,-n磁盘数量,-lraid1和0的组合 ,-x备用盘数量,创建完成后,mdadm 会开始同步数据

    bash
    mdadm -Cv /dev/md10 -n 4 -l 10 -x 1 /dev/sd[b-e]
    
    # 查看详情进度
    mdadm -D /dev/md10

格式化与挂载磁盘阵列

bash
# 格式化
mkfs.ext4 /dev/md0
# 创建挂载点
mkdir /mnt/raid
# 挂载
mount /dev/md0 /mnt/raid

# 设置自动挂载
## /etc/fstab 
/dev/md0 /mnt/raid ext4 defaults 0 2
## /etc/rc.d/rc.local(添加执行权限chmod +x /etc/rc.d/rc.local)
mount /dev/md0 /mnt/raid

查看磁盘阵列状态

bash
mdadm -D /dev/md0		# 查看指定 RAID 设备的详细信息
# 或
cat /proc/mdstat		# 获取当前所有 RAID 设备的状态信息

停止和删除磁盘阵列

bash
# 停止阵列,停止后数据将无法访问,但磁盘上的数据不会丢失
mdadm -S /dev/md0
# 删除阵列,先确保阵列已停止且数据已备份或不再需要,然后删除与阵列相关的文件系统
mdadm -r /dev/md0

raid扩容

bash
# 添加磁盘设备到阵列md0中
mdadm -a /dev/md0 /dev/sdb
# 扩展阵列x设置 RAID 中活动设备的数量
mdadm -G /dev/md0 -n x

生成配置文件

默认的配置文件在/etc/mdadm.conf,在阵列的信息行尾添加auto=yes

bash
mdadm -Ds /dev/md0 | sed "s/$/ auto=yes/" > /etc/mdadm.conf

RAID磁盘管理案例

RAID创建逻辑卷步骤

操作思路:可以创建两个RAID1阵列,用两个阵列创建逻辑卷。

创建RAID阵列

1.创建 RAID 阵列

bash
mdadm -Cv /dev/md1 -n 3 -l 1 /dev/sd[bc]

2.查看 RAID 阵列状态

bash
mdadm -D /dev/md0

创建逻辑卷

3.创建物理卷

使用 pvcreate 命令将磁盘或分区转换为物理卷。例如:

bash
# 创建
pvcreate /dev/sdb

# 查看
pvdisplay /dev/sdb

这条命令将 /dev/sdb 磁盘转换为 LVM 物理卷。

4. 创建卷组

使用 vgcreate 命令创建卷组,并将物理卷添加到卷组中。例如:

bash
vgcreate datavg /dev/sdb

这条命令创建了一个名为 datavg 的卷组,并将 /dev/sdb 物理卷添加到该卷组中。

5. 创建逻辑卷

使用 lvcreate 命令在卷组中创建逻辑卷。例如:

bash
lvcreate -n datalv -L +5G datavg

这条命令在 datavg 卷组中创建了一个名为 datalv、大小增加 5GB 的逻辑卷。

注意:+5G是在原基础上增加,5G是整体大小为5G

6.格式化逻辑卷

bash
mkfs.ext4 /dev/datavg/datalv

7.创建挂载点并挂载逻辑卷

bash
mkdir /var/www/html
mount /dev/datavg/datalv /var/www/html

8.持久化挂载

bash
# /etc/fstab 文件
/dev/datavg/datalv /var/www/html ext4 defaults 0 2

# /etc/rc.d/rc.local
mount /dev/datavg/datalv /var/www/html

RAID10 创建逻辑卷

查看硬盘信息

bash
# 查看系统中可用的磁盘设备
lsblk
 
fdisk -l

安装 mdadm 工具

如果系统未安装,可通过包管理器进行安装

bash
# RHEL 
yum install mdadm -y
# Ubuntu
apt -y install mdadm

创建 RAID10 阵列

bash
mdadm -Cv /dev/md10 -l 10 -n 4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
  • /dev/md0 为创建的 RAID 设备名称
  • -l--level=10 指定 RAID 级别为 10
  • -n--raid-devices=4 指定用于创建阵列的磁盘数量为 4 块
  • 最后跟着的是组成阵列的各个磁盘设备路径

查看 RAID 阵列状态

查看刚创建的 RAID10 阵列的详细信息,包括阵列的状态、成员磁盘等。

查看信息由百分比进度提示说明还未创建完成,创建完成后进度会消失。

bash
mdadm -D /dev/md10

创建raid配置文件

默认读取/etc/mdadm.conf配置文件

bash
mdadm -Ds | sed 's/$/ auto=yes/' > /etc/mdadm.conf

创建裸分区(可选)

创建裸分区这一步骤在某些特定场景下是必要的,并非在所有创建 RAID10 逻辑卷的流程中都必须有

主要目的及原因

  • 某些特定的应用程序或数据库系统,如 Oracle 数据库、某些高性能计算应用等,可能要求数据存储在裸分区上。
  • 创建裸分区后,可以将多个裸分区整合到一个卷组中,实现存储资源的灵活分配和管理,通过在卷组中创建逻辑卷,可以根据实际需求将不同存储设备的容量组合起来,提供给用户统一的、逻辑上的存储空间,而用户无需关心底层存储设备的具体物理分布情况
  • 当使用裸分区创建逻辑卷后,可以根据业务需求的变化,灵活地对逻辑卷的大小进行调整。
  • 裸分区的存在使得数据在存储设备之间的迁移和备份更加方便。
  • 兼容多种文件系统和操作系统

创建分区

使用 partedfdisk 等工具对 RAID 阵列设备 /dev/md10 进行分区操作,创建裸分区,如创建一个占满整个阵列空间的分区 /dev/md10p1

bash
# mbr最大支持2T
fdisk /dev/md10
	m 帮助
	n 添加主分区
	w 保存退出

# gpt
parted /dev/md10
	(parted) mklabel                                                          
	新的磁盘卷标类型? gpt
	(parted) mkpart                                                           
	分区名称?  []? yunjisuan
	文件系统类型?  [ext2]? ext4
	起始点? 0  
	结束点? 10G  或者 100%
	(parted) q

创建物理卷

将刚才创建的裸分区初始化为物理卷,使其能够被 LVM 使用

bash
pvcreate /dev/md10p1

创建卷组

创建一个名为 vg_raid10 的卷组,并将物理卷 /dev/md10p1 添加到该卷组中

bash
vgcreate vg_raid10 /dev/md10p1

创建逻辑卷

从卷组 vg_raid10 中创建一个名为 lv_raid10大小为 20GB 的逻辑卷

bash
lvcreate -n lv_raid10 -L 20G vg_raid10

格式化逻辑卷

根据需求使用相应的文件系统格式化命令对逻辑卷进行格式化,如格式化为 ext4或xfs文件系统

bash
# ext4
mkfs.ext4 /dev/vg_raid10/lv_raid10
# xfs
mkfs.xfs /dev/vg_raid10/lv_raid10

创建挂载点并挂载

创建挂载目录然后将格式化后的逻辑卷挂载到该目录下

bash
mkdir /data && mount /dev/vg_raid10/lv_raid10 /data

设置开机挂载

若希望系统启动时自动挂载该逻辑卷,可将挂载信息添加到 /etc/fstab

bash
echo "/dev/vg_raid10/lv_raid10 /data ext4 defaults 0 0" >> /etc/fstab

RAID10 逻辑卷扩容

添加新硬盘

将新硬盘与现有 RAID 阵列中的硬盘型号和规格一致,物理连接到服务器或存储系统中

扩容 RAID 设备

命令执行需要查看进度100%后才可以执行后续操作

bash
# 向 RAID 中添加新设备
mdadm -a /dev/md10 /dev/sdf

设置RAID设备大小

bash
mdadm -G /dev/md10 --size=max

这只RAID磁盘数量

bash
mdadm -G /dev/md10 -n 5

扩容物理卷

由于 RAID 设备上已经有分区 /dev/md10p1,不能直接对 /dev/md10 使用 pvcreate,需要对分区 /dev/md10p1 进行操作。执行以下命令扩容物理卷:

bash
pvresize  /dev/md10p1

验证扩容结果

使用 df -h 命令查看文件系统空间是否成功扩展,确认新增空间可用

扩容文件系统(可选)

如果df -Th结果大小为改变可尝试以下命令

bash
# ext4
resize2fs /dev/vg_raid10/lv_raid10

# xfs
xfs_growfs /dev/vg_raid10/lv_raid10

RAID10 逻辑卷缩容

取消逻辑卷挂载

bash
umount /dev/vg_raid10/lv_raid10

查看RAID设备详细信息

bash
mdadm -D /dev/md10

将磁盘标记为故障

bash
mdadm -f /dev/md10 /dev/sdf

从RAID阵列中移除磁盘

bash
mdadm -r /dev/md10 /dev/sdf

清除磁盘上的RAID超级块信息

bash
mdadm --zero-superblock /dev/sdf

调整 RAID 阵列大小

bash
mdadm -G /dev/md10 --size=10G

调整 RAID 阵列的磁盘数量

bash
mdadm -G /dev/md10 -n 4

调整物理卷大小

bash
pvresize /dev/md10p1

调整逻辑卷大小

bash
lvreduce -L 10G /dev/vg_raid10/lv_raid10

检测并修复文件系统

bash
e2fsck -f /dev/vg_raid10/lv_raid10

调整文件系统大小

bash
resize2fs /dev/vg_raid10/lv_raid10 10G

挂载文件系统

bash
mount /dev/vg_raid10/lv_raid10 /data

检测文件系统大小

bash
df -Th

RAID10 逻辑卷销毁

取消挂载

bash
umount /dev/vg_raid10/lv_raid10

删除逻辑卷

bash
lvremove /dev/vg_raid10/lv_raid10

删除卷组

bash
vgremove vg_raid10

删除物理卷

bash
pvremove /dev/md10p1

停止RAID

bash
mdadm -S /dev/md10

清除磁盘上的 RAID 超级块信息

bash
mdadm --zero-superblock /dev/sd[bcdefg]

更新 RAID 配置文件

bash
/etc/mdadm.conf中要销毁的raid相关配置删除掉

验证 RAID 阵列是否已销毁

确认 RAID 阵列已不存在

bash
cat /proc/mdstat

1