RAID
{Back to Index}

Table of Contents

1 简介

RAID 是通过 多磁盘并行运行 来提高 IO 性能。一共有 7 类,但实际中常用的有 4 类:

  • RAID0

    读写性能好,没有冗余性。

  • RAID1

    读性能好,提供冗余性。

  • RAID5

    读写性能好,提供冗余性,最多可以损坏 1 块硬盘。

  • RAID6

    读写性能好,提供冗余性,最多可以损坏 2 块硬盘。

2 RAID0

最少使用 2 块磁盘,通过将数据分别读写到多块硬盘来提高读写性能。

raid0.png

Figure 1: RAID0 IO 模型

磁盘利用率
100%
IO 性能
所有磁盘 IO 总和
冗余能力

3 RAID1

最少使用 2 块磁盘,写数据时,同一份数据会写到多块磁盘上,以提高冗余性(但写性能就减弱了)。
读数据时可以同时从多块磁盘并行读取,以提高读性能。

raid1.png

Figure 2: RAID1 IO 模型

磁盘利用率
1 / n
IO 性能
读性能好,写性能弱
冗余能力
最多可以损坏 n - 1 块磁盘

4 RAID5

最少使用 3 块磁盘,读数据时可以分布式读,写数据时会将奇偶校验信息写到磁盘上,该信息可用于数据恢复。

raid5.png

Figure 3: RAID5 IO 模型

磁盘利用率
1 - 1/n
IO 性能
读性能好,写性能稍弱于 RAID0
冗余能力
最多可以损坏 1 块磁盘

5 RAID6

最少使用 4 块磁盘,读数据时可以分布式读,写数据时会将奇偶校验信息写到磁盘上(比 RAID5 多存一份校验信息),所以冗余性更好。

raid6.png

Figure 4: RAID6 IO 模型

磁盘利用率
1 - 2/n
IO 性能
读性能好,写性能稍弱于 RAID5
冗余能力
最多可以损坏 2 块磁盘

6 软件级 RAID (mdadm)

mdadm (Multi Disk Admin) 硬盘,分区或者是逻辑卷来创建基于软件实现的 RAID 。

实验基于 CentOS7 。1

6.1 创建

$> mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb /dev/sdd
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
meta-data=/dev/md0               isize=512    agcount=8, agsize=16256 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=130048, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=624, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

$> mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Jan 12 13:36:13 2021
        Raid Level : raid0
        Array Size : 520192 (508.00 MiB 532.68 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Tue Jan 12 13:36:13 2021
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 512K

Consistency Policy : none

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 176666d5:270b10b2:7a84db3d:d6a0169f
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       48        1      active sync   /dev/sdd

$> mdadm -D --scan > /etc/mdadm.conf # 开机生效

6.2 挂载文件系统

$> mkfs.xfs -f /dev/md0
$> mkdir -p /mnt/md0
$> mount /dev/md0 /mnt/md0
$> df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        489M     0  489M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.8M  489M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/sda1        40G  5.9G   35G  15% /
tmpfs           100M     0  100M   0% /run/user/1000
/dev/md0        506M   26M  480M   6% /mnt/md0
$> echo "/dev/md0     /mnt/md0     xfs     defaults   0 0" >> /etc/fstab

6.3 IO 性能测试

各自使用 5 块磁盘 (256M) 组成 RAID0 和 RAID1 :

$> dd if=/dev/urandom of=/mnt/md0/test.img bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 5.46442 s, 38.4 MB/s

$> dd if=/dev/urandom of=/mnt/md1/test.img bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 5.72892 s, 36.6 MB/s

6.4 测试冗余性

删除一个磁盘设备:

echo 1 >/sys/block/sdb/device/delete

之后访问 /mnt/md0 报错:

$> ls /mnt/md0
ls: cannot access /mnt/md0: Input/output error

如果是 RAID1 ( 2 块磁盘 ),RAID5 ( 3 块磁盘) ,或 RAID6 ( 4 块磁盘),分别删除 1 ,1 ,2 个磁盘,则不会破坏数据完整性。

测试过使用 dd 命令对磁盘数据进行破坏,结果是无论是什么 RAID 等级,数据都会被破坏,猜测 RAID 底层的磁盘如果在能访问的前提下, 必须保证超级块不被破坏,否则 RAID 无法正常工作。

被删除的设备可以通过以下脚本扫描回来:

for host in /sys/class/scsi_host/*; do echo "- - -" | tee $host/scan; ls /dev/sd* ; done

Footnotes:

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2021-01-12 Tue 13:16

Updated: 2021-08-17 Tue 11:23

Emacs 27.1 (Org mode 9.3)