RAID
{Back to Index}
Table of Contents
1 简介
RAID 是通过 多磁盘并行运行 来提高 IO 性能。一共有 7 类,但实际中常用的有 4 类:
RAID0
读写性能好,没有冗余性。
RAID1
读性能好,提供冗余性。
RAID5
读写性能好,提供冗余性,最多可以损坏 1 块硬盘。
RAID6
读写性能好,提供冗余性,最多可以损坏 2 块硬盘。
2 RAID0
最少使用 2 块磁盘,通过将数据分别读写到多块硬盘来提高读写性能。
Figure 1: RAID0 IO 模型
- 磁盘利用率
- 100%
- IO 性能
- 所有磁盘 IO 总和
- 冗余能力
- 无
3 RAID1
最少使用 2 块磁盘,写数据时,同一份数据会写到多块磁盘上,以提高冗余性(但写性能就减弱了)。
读数据时可以同时从多块磁盘并行读取,以提高读性能。
Figure 2: RAID1 IO 模型
- 磁盘利用率
- 1 / n
- IO 性能
- 读性能好,写性能弱
- 冗余能力
- 最多可以损坏 n - 1 块磁盘
4 RAID5
最少使用 3 块磁盘,读数据时可以分布式读,写数据时会将奇偶校验信息写到磁盘上,该信息可用于数据恢复。
Figure 3: RAID5 IO 模型
- 磁盘利用率
- 1 - 1/n
- IO 性能
- 读性能好,写性能稍弱于 RAID0
- 冗余能力
- 最多可以损坏 1 块磁盘
5 RAID6
最少使用 4 块磁盘,读数据时可以分布式读,写数据时会将奇偶校验信息写到磁盘上(比 RAID5 多存一份校验信息),所以冗余性更好。
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