Appearance
RAID磁盘阵列
RAID(Redundant Array of Independent Disks,独立冗余磁盘阵列)是一种将多个独立的磁盘组合成一个逻辑存储单元的技术,旨在提高数据存储的性能、容量、可靠性和冗余性。
基本原理
RAID 通过将数据分割成多个区段并分别存储在不同的硬盘上,利用个别磁盘提供数据加成效果,从而提升整个磁盘系统的效能。它采用同位检查的观念,当数组中任意一个硬盘发生故障时,仍可读出数据,并且在数据重构时,可将数据经计算后重新置入新硬盘中
分类
- 硬件 RAID :通过 RAID 控制器来实现 RAID 功能,如外接式磁盘阵列柜和内接式磁盘阵列卡。外接式磁盘阵列柜常用于大型服务器,具可热交换的特性,但价格昂贵;内接式磁盘阵列卡价格便宜,但需要较高的安装技术。硬件 RAID 能够提供在线扩容、动态修改阵列级别、自动数据恢复等高级功能。
- 软件 RAID :通过软件来仿真 RAID 功能,利用操作系统或专门的软件来管理磁盘阵列。其优点是成本低,不需要额外的硬件设备;缺点是会占用一定的系统资源,可能会影响系统的整体性能。一般用于一些对性能要求不是特别高,同时又希望实现数据冗余和简单磁盘管理的场景,如个人电脑、小型办公室网络等
级别划分
级别 | 最低磁盘数 | 数据分布 | 冗余方式 | 读写性能 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|---|---|---|
RAID 0 | 2 | 条带化 | 无 | 读写速度快 | 性能提升明显,磁盘利用率 100% | 无数据冗余,安全性差 | 对数据完整性要求不高的高性能场景,如日志存储、个人娱乐等 |
RAID 1 | 2 | 完全镜像 | 镜像冗余 | 读快写慢 | 数据安全性高 | 磁盘利用率低(最高 50%),成本高 | 存储关键性重要数据的场合,如财务数据存储 |
RAID 5 | 3 | 条带化+奇偶校验 | 分散的奇偶校验 | 读快写中等 | 兼具性能与冗余,磁盘利用率较高 | 写入有性能开销,多盘故障风险 | 文件服务器、应用服务器等 |
RAID 6 | 4 | 条带化+双重奇偶校验 | 双重奇偶校验 | 读快写慢 | 容错能力强,可容两盘故障 | 成本高,磁盘利用率低 | 对数据安全要求极高的场景,如存储关键业务数据的服务器 |
RAID 10 | 4 | 镜像后条带化 | 镜像冗余 | 读写速度均较快 | 继承 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软件基本操作步骤
准备工作
安装 mdadm 工具 :
mdadm
是 Linux 下用于创建和管理软件 RAID 的常用命令。bash# RHEL yum/dnf -y install mdadm # Ubuntu apt -y install mdadm
查看磁盘状态 :使用
lsblk
或fdisk -l
命令查看系统中已连接的磁盘设备及其状态,确定用于创建磁盘阵列的磁盘
创建磁盘阵列
注意:创建完阵列后需要mdadm -D 阵列路径
查看状态进度Resync Status
到达100%后在继续下一步操作。如没有Resync Status
则表示进度100%。
创建 RAID0 阵列
假设使用两块磁盘
/dev/sdb
和/dev/sdc
,-C
创建,-v
显示过程,-n
磁盘数量,-l
raid0级别创建完成后,
mdadm
会开始同步数据,可通过查看/proc/mdstat
文件监控同步进度。bashmdadm -Cv /dev/md0 -n 2 -l 0 /dev/sdb /dev/sdc # 查看详情进度 mdadm -D /dev/md0
创建 RAID1 阵列
假设使用两块磁盘
/dev/sdb
和/dev/sdc
,-C
创建,-v
显示过程,-n
磁盘数量,-l
raid1级别 ,-x
备用盘数量创建完成后,
mdadm
会开始同步数据,可通过查看/proc/mdstat
文件监控同步进度。bashmdadm -Cv /dev/md1 -n 2 -l 0 -x 1 /dev/sdb /dev/sdc # 查看详情进度 mdadm -D /dev/md1
创建 RAID5 阵列
假设使用三块磁盘
/dev/sda1
、/dev/sdb1
、/dev/sdc1
,-C
创建,-v
显示过程,-n
磁盘数量,-l
raid5级别 ,-x
备用盘数量,创建完成后,mdadm
会开始同步数据bashmdadm -Cv /dev/md5 -l 5 -n 3 -x 1 /dev/sda1 /dev/sdb1 /dev/sdc1 # 查看详情进度 mdadm -D /dev/md5
创建 RAID10 阵列
若使用四块磁盘
/dev/sdb
、/dev/sdc
、/dev/sdd
、/dev/sde
,-C
创建,-v
显示过程,-n
磁盘数量,-l
raid1和0的组合 ,-x
备用盘数量,创建完成后,mdadm
会开始同步数据bashmdadm -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 数据库、某些高性能计算应用等,可能要求数据存储在裸分区上。
- 创建裸分区后,可以将多个裸分区整合到一个卷组中,实现存储资源的灵活分配和管理,通过在卷组中创建逻辑卷,可以根据实际需求将不同存储设备的容量组合起来,提供给用户统一的、逻辑上的存储空间,而用户无需关心底层存储设备的具体物理分布情况
- 当使用裸分区创建逻辑卷后,可以根据业务需求的变化,灵活地对逻辑卷的大小进行调整。
- 裸分区的存在使得数据在存储设备之间的迁移和备份更加方便。
- 兼容多种文件系统和操作系统
创建分区
使用 parted
或 fdisk
等工具对 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