Linux-Software-RAID

介绍

什么是 RAID

RAID (Redundant Arrays of Inexpensive Disk, 容错式廉价磁盘阵列), 指一种硬件/软件技术, 将多个较小的磁盘整合成一个较大的磁盘设备. 用于数据存储以及保护.

RAID 分为多个 level, 分别对应不同的功能, 各 level 之间互有优劣:

RAID-0, 性能最佳

RAID-0 模式下, 数据会被等量的放置在各个磁盘中.

如有两个磁盘组成 RAID-0, 当要写入 100MB 数据时, 每个磁盘会分配到 50MB 的存储量.

读取数据时也是从 RAID-0 中所有磁盘读取.

如果 RAID-0 中所有的磁盘为相同型号以及容量, 此时效果最好.

其缺点就在于, 只要其中一块磁盘损坏, 则所有的数据都无法被读取 (因为一份数据是均匀分散到所有磁盘上的).

且当组成 RAID-0 磁盘容量不一致时, 如 200G 和 500G 的两块磁盘, 当 200G 的磁盘被用完之后, 新增的所有数据都会写入 500G 的磁盘中.

RAID-1, 完整备份

RAID-1 模式下, 会让同一份数据完整的保存在两块磁盘上:

如有两块磁盘组成 RAID-1, 当写入一个 100MB 的文件时, 两块磁盘都会同步写入 100MB 的数据.

RAID-1 模式也最好是使用一样的磁盘来组建. 但如果容量不同, 则以总容量最小的一块磁盘为主.

缺点在与 RAID 的容量相当于只有 50%. 且文件写入时性能较差. (主要是软件磁盘阵列比较差, 会占用系统 I/O 总线)

但优点就是任何一块磁盘损坏时, 数据还是能完整保存, 且读取性能还行 (当多个 process 读取同一笔数据时, RAID 会自行平衡).

RAID 1+0, RAID 0+1

RAID 1+0 指, 先将磁盘组成 RAID-1 阵列, 在将多个 RAID-1 阵列组成 RAID-0 阵列:

(RAID 0+1 就是先组 RAID-0 再组 RAID-1)

RAID-5, 性能和数据备份的均衡考虑

RAID-5 至少需要三块以上的磁盘才能组成, 在数据写入时类似 RAID-0, 不过在均匀循环写入的过程中, 会在每块磁盘中写入一个 Parity, 用以记录其他磁盘的备份数据, 用于当有磁盘损毁时修复.

由于 Parity 的存在, RAID-5 实际上的总体容量是整体磁盘数量减一块. 如由 3 块磁盘组成 RAID-5, 就只会剩下 2 块的存储容量.

RAID-5 仅支持一块磁盘损毁, 如果损毁的磁盘数量大于等于两块, 整组的数据都会被损毁.

优点在与读取性能和 RAID-0 接近, 但写入时由于要计算 parity, 则几乎没有性能的提升.

RAID-6, 使用两块磁盘存储 parity

RAID-6 和 RAID-5 类似, 只是会使用两块磁盘来存储 parity, 也即整体磁盘容量会减少两块.

此时容错的磁盘数量为 2.

Spare Disk

Spare Disk 指一块或多块没有包含在原本磁盘阵列中的磁盘, 平时不会被磁盘阵列使用, 但当阵列中有磁盘损毁时, spare disk 会被主动拉进磁盘阵列中, 并将损坏的磁盘移除磁盘阵列.

software, hardware RAID

Hardware RAID, 指通过磁盘阵列卡来达成阵列. 磁盘阵列卡上有一块专门的芯片处理 RAID 的任务, 因此在性能上会比较好. (毕竟不消耗系统 I/O 了) 且一般的中高阶磁盘阵列卡都支持热插拔, 即在不关机的情况下抽换损坏的磁盘.

但好的磁盘阵列卡价格比较贵, 而低端的磁盘阵列卡仅支持低端功能. 且需要操作系统有磁盘阵列卡的驱动.

Software RAID 则是用软件来仿真阵列, 因此会消耗较多系统资源, 如 CPU 算力和 I/O 总线的资源.

软件磁盘阵列的设置

使用 mdadm (“Multiple Device Administration”) 命令.

常用参数有:

  • --create, 表示当前是创建 RAID
  • --auto=yes, 表明创建软件磁盘阵列设备
  • --chunk=Nk, 决定设备的 chunk, stripe 大小, 一般是 64K 或 512K
  • --raid-devices=N, 使用几个磁盘作为磁盘阵列
  • --spare-devices=N, 使用几个磁盘作为 spare disk
  • --level=[015], 设置磁盘阵列的等级 (这里建议用0, 1, 5)
  • --detail, 查看一个阵列的详细信息

语法如:

1
2
[root@localhost]# mdadm --detail /dev/md0
[root@localhost]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=Nk --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx ...

命令最后接的是设备文件名, 其可以是一整块磁盘, 也可以是分区, 注意提供的数量要与 --raid-devices--spare-devices 指定数目的和相同.

创建和挂载示例

假设要创建一个 RAID 5 环境:

  • 利用 4 个 partition 组成 RAID 5
  • 每个 partition 大小为 1G
  • 再用 1 个 partition 作为 spare disk, 也是 1G
  • chunk 设置为 256K
  • 将 RAID 5 设备挂载到 /srv/raid 目录下

创建 5 个分区以供使用

这里通过一个 loop 设备来模拟:

1
2
3
4
dd if=/dev/zero of=/root/disk bs=5M count=1024
losetup /dev/loop1 /root/disk
gdisk /dev/loop1
partprobe /dev/loop1

创建出的分区结构大概为:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop1 7:1 0 5G 0 loop
├─loop1p1 259:0 0 1G 0 loop
├─loop1p2 259:1 0 1G 0 loop
├─loop1p3 259:2 0 1G 0 loop
├─loop1p4 259:3 0 1G 0 loop
└─loop1p5 259:4 0 1023M 0 loop
vda 253:0 0 30G 0 disk
├─vda1 253:1 0 3G 0 part [SWAP]
└─vda2 253:2 0 27G 0 part /

创建 RAID

1
2
3
4
[root@localhost]# mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K \
> --raid-devices=4 --spare-devices=1 /dev/loop1p{1,2,3,4,5}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

查看 RAID 信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@localhost]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Mar 23 06:44:09 2024
Raid Level : raid5
Array Size : 3135744 (2.99 GiB 3.21 GB)
Used Dev Size : 1045248 (1020.75 MiB 1070.33 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent

Update Time : Sat Mar 23 06:44:16 2024
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 256K

Consistency Policy : resync

Name : zabbix1:0 (local to host zabbix1)
UUID : 9a543106:d79123c0:ff6655de:81ad7034
Events : 18

Number Major Minor RaidDevice State
0 259 0 0 active sync /dev/loop1p1
1 259 1 1 active sync /dev/loop1p2
2 259 2 2 active sync /dev/loop1p3
5 259 3 3 active sync /dev/loop1p4

4 259 4 - spare /dev/loop1p5

也可以通过:

1
2
3
4
5
6
[root@localhost]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 loop1p4[5] loop1p5[4](S) loop1p3[2] loop1p2[1] loop1p1[0]
3135744 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>

来查看阵列信息.

格式化与挂载使用 RAID

1
2
3
4
5
6
[root@localhost]# mkfs.ext4 /dev/md0
[root@localhost]# mkdir /srv/raid
[root@localhost]# mount /dev/md0 /srv/raid
[root@localhost]# df -Th /srv/raid
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 ext4 2.9G 24K 2.8G 1% /srv/raid

RAID 的救援模式

语法为:

1
mdadm --manage /dev/md[0-9] [--add device] [--remove device] [--fail device]
  • --add, 指添加 device 到 md 中
  • --remove, 指将指定 device 从 md 中移除
  • --fail, 将指定 device 设置为出错的状态

将一个 device 标记为 fail 之后, RAID 会自动用 spare disk 进行重建.

标记一个 device 为 fail

1
2
[root@localhost]# mdadm --manage /dev/md0 --fail /dev/loop1p4
mdadm: set /dev/loop1p4 faulty in /dev/md0

将一个 device 移出 RAID

1
2
[root@localhost]# mdadm --manage /dev/md0 --remove /dev/loop1p4
mdadm: hot removed /dev/loop1p4 from /dev/md0

将一个 device 添加回 RAID

1
2
[root@localhost]# mdadm --manage /dev/md0 --add /dev/loop1p4
mdadm: added /dev/loop1p4

开机自动启动 RAID 并自动挂载

大多数 Linux 发行版都会自己搜寻 /dev/md[0-9] 并在开机时设置好所需的功能.

也可以自行配置 software RAID, 其配置文件为 /etc/mdadm.conf.

只需要知道 RAID 设备的 UUID 即可设置:

1
[root@localhost]# mdadm --detail /dev/md0 | grep -i uuid

修改 /etc/mdadm.conf 内容来自动启动 RAID:

1
2
#     RAID device   UUID
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6

修改 /etc/fstab 自动挂载 RAID:

1
UUID=2256da5f:4870775e:cf2fe320:4dfabbc6    /srv/raid   ext4 defaults 0 0

关闭 RAID

1
[root@localhost]# umount /srv/raid

之后注释掉写在 /etc/fstab 以及 /etc/mdadm.conf 中的条目.

覆盖掉 RAID 中的 metadata:

1
[root@localhost]# dd if=/dev/zero of=/dev/md0 bs=1M count=50

关闭 RAID:

1
[root@localhost]# mdadm --stop /dev/md0

覆盖掉各分区中的 RAID 的 metadata:

1
2
3
4
5
[root@localhost]# dd if=/dev/zero of=/dev/loop1p1 bs=1M count=10
[root@localhost]# dd if=/dev/zero of=/dev/loop1p2 bs=1M count=10
[root@localhost]# dd if=/dev/zero of=/dev/loop1p3 bs=1M count=10
[root@localhost]# dd if=/dev/zero of=/dev/loop1p4 bs=1M count=10
[root@localhost]# dd if=/dev/zero of=/dev/loop1p5 bs=1M count=10

Linux-Software-RAID
http://example.com/2024/03/23/Linux-Software-RAID/
作者
Jie
发布于
2024年3月23日
许可协议