服务器运维

RAID 0 和 RAID 1 的区别:条带与镜像,两块盘怎么选

RAID 0 是条带:数据切块轮流写到两块盘上,容量和大文件读写速度接近两块盘之和,但任何一块坏了整个卷都没了。RAID 1 是镜像:两块盘存一模一样的数据,只能用一块盘的容量,写入不比单盘快,换来坏一块盘照常运行。两块盘时,数据丢了能重新生成就选 RAID 0,不能丢就选 RAID 1。

作者 顶联产品团队发布于 6 分钟阅读

RAID0 和 RAID1 的区别在于数据怎么放:RAID 0 把数据切成小块轮流写到两块盘上(条带),两块盘的容量和吞吐叠加,但没有任何冗余,坏一块盘整个卷的数据都丢;RAID 1 把同一份数据同时写到两块盘上(镜像),只能用一块盘的容量,写入不比单盘快,换来坏一块盘业务照常运行。只有两块盘时,判断标准只有一个:这份数据丢了能不能重新生成。能,就用 RAID 0 换速度和容量;不能,就用 RAID 1。

RAID 0 是什么意思:条带化,容量和速度叠加

RAID 0 把两块(或更多)盘组成一个卷,数据按固定大小切块,第一块写盘 1,第二块写盘 2,第三块又回到盘 1,每块的大小叫条带大小(strip,也叫 chunk)。以 256 KB 条带为例,写一个 1 MB 的文件,第 1、3 块落在盘 1,第 2、4 块落在盘 2,两块盘各写 512 KB,同时进行,耗时约为单盘的一半。

但速度不是在所有场景下都翻倍。一次 IO 比条带小时(例如数据库常见的 8 KB、16 KB 页),只会落到一块盘上,单个请求的延迟和单盘一样;只有多个请求同时落到不同的盘上,总 IOPS 才会增加。所以 RAID 0 对大文件顺序读写和高并发的随机读写有效,对一个接一个、单线程的小 IO 几乎没有提升。条带大小一般用控制器默认值;以大文件顺序读写为主的,可以设大一些。

# 阵列卡(MegaRAID / PERC):用 252:0、252:1 两块盘建 RAID 0,条带 256 KB;EID:Slt 以 storcli64 /c0 show 的输出为准
storcli64 /c0 add vd type=raid0 drives=252:0-1 strip=256
# Linux 软 RAID:不指定 --chunk 时,mdadm 默认条带为 512 KB
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

在阵列卡上还常见一种“单盘 RAID 0”:控制器不支持直通(JBOD)模式时,要让系统看到某块盘,就把它单独建成一个 RAID 0 虚拟盘。这样做不是为了性能,只是让盘能被识别,常用于 Ceph、ZFS 这类自己管理磁盘的软件。代价是盘上带着阵列卡的配置信息,换盘后要在阵列卡里重新建一次;查看 SMART 也要通过阵列卡,例如 smartctl -a -d megaraid,0 /dev/sda,最后的数字是盘在控制器上的设备号。

RAID 1 是什么意思:镜像,用一半容量换容错

RAID 1 让两块盘组成镜像,每一次写入都同时写到两块盘上,两块盘的内容始终一致。可用容量等于一块盘;写入要等两块盘都完成,速度和单盘差不多;读取可以从任意一块盘读,多个并发读请求能分摊到两块盘上,而单个文件的顺序读多数实现只从一块盘读,接近单盘速度。

坏一块盘时,阵列进入降级状态,业务照常读写,只是没有冗余了;换上新盘后,把好盘的内容整盘复制过去,这叫重建。RAID 1 的重建是顺序复制,不需要校验计算,比 RAID 5 简单,耗时大约是“单盘容量 ÷ 持续写入速度”,再加上业务读写的干扰。

# 阵列卡
storcli64 /c0 add vd type=raid1 drives=252:0-1
# Linux 软 RAID,用两块盘上的分区做镜像
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
cat /proc/mdstat      # 新建后会先做一次全盘同步(resync),进度在这里看

RAID 1 防的只是“一块盘坏了”。误删文件、程序写坏数据、勒索软件加密,都会被同步到两块盘上,所以 RAID 1 之外仍然要有备份。另一个容易被忽略的问题出在 SSD 上:同型号、同批次的两块 SSD 做镜像,写入量完全相同,磨损程度同步增长,寿命可能在相近的时间耗尽。用 smartctl -a 定期看磨损指标(NVMe 盘是 Percentage Used,SATA SSD 的属性名因厂商而异),接近寿命时错开时间先换掉一块。

两块盘做 RAID 0 和 RAID 1,具体差多少

以两块 1.92 TB 的 SATA SSD 为例。假设单盘顺序读 500 MB/s、顺序写 450 MB/s,4K 随机读在高并发下 80,000 IOPS、随机写 30,000 IOPS,下表是理论估算,不考虑阵列卡和总线成为瓶颈的情况:

对比项 单盘 RAID 0 RAID 1
可用容量 1.92 TB 3.84 TB(系统里约显示 3.49 TiB) 1.92 TB(约 1.75 TiB)
顺序读 500 MB/s 约 1,000 MB/s 单个读取流约 500 MB/s,多个并发流可接近 1,000 MB/s
顺序写 450 MB/s 约 900 MB/s 约 450 MB/s
4K 随机读,高并发 80,000 IOPS 约 160,000 IOPS 接近 160,000 IOPS
4K 随机写,高并发 30,000 IOPS 约 60,000 IOPS 约 30,000 IOPS
4K 读写,单线程逐个请求 基准 与单盘基本相同 与单盘基本相同
坏 1 块盘 数据丢失 两块盘上的数据全部丢失 照常运行,进入降级
换盘之后 从备份恢复 重建阵列,再从备份恢复 重建,业务不中断

两个结论:RAID 0 的优势集中在顺序读写和高并发写上;RAID 1 在读多写少、并发高的业务上并不慢,真正吃亏的只有写入和容量。

风险方面,RAID 0 的丢数据风险是两块盘叠加,任意一块坏整卷就没了,大约是单盘的两倍;RAID 1 只有在第一块盘坏了、换盘重建完成之前第二块也坏,才会丢数据,这个窗口通常是几小时到几天。但同批次、同环境的两块盘,故障并不完全独立,这个窗口不能当作不存在。

用 fio 测一测:你的业务吃哪种 IO

表里的数字是估算,阵列建好后用 fio 实测更可靠。下面的命令直接对阵列设备读写(阵列卡上的虚拟盘把 /dev/md0 换成系统里对应的 /dev/sdX),写入测试会覆盖设备上的数据、破坏文件系统,只能在新建、尚未存放数据的阵列上做:

# 大块顺序写:RAID 0 应接近单盘的两倍,RAID 1 接近单盘
fio --name=seqwrite --filename=/dev/md0 --rw=write --bs=1M --size=10G --direct=1 --ioengine=libaio --iodepth=32
# 4K 随机读,队列深度 1:两种阵列都和单盘差不多
fio --name=rand-qd1 --filename=/dev/md0 --rw=randread --bs=4k --size=10G --direct=1 --ioengine=libaio --iodepth=1 --runtime=60 --time_based
# 4K 随机读,高并发:两种阵列都能接近单盘的两倍
fio --name=rand-qd32 --filename=/dev/md0 --rw=randread --bs=4k --size=10G --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting

更重要的是弄清现有业务的 IO 长什么样。在正在跑业务的服务器上执行 iostat -x 1,看三列:rareq-sz、wareq-sz 是平均每次读、写的大小(KB),aqu-sz 是平均队列深度(老版本 sysstat 对应的是 avgrq-sz 和 avgqu-sz,其中 avgrq-sz 以扇区为单位,而且读写不分开)。如果每次写只有 8–16 KB、队列深度在 1 左右,说明业务是一个接一个的小 IO,换成 RAID 0 几乎不会变快;每次几百 KB 以上、队列常常排着十几个请求的,RAID 0 才有明显收益。

坏一块盘之后,两种阵列分别怎么处理

RAID 0:阵列卡上的虚拟盘变成 Offline 或 Failed,系统里这块盘直接消失或者大量报 IO 错误;mdadm 的 RAID 0 读写大量报错,整个设备不可用。没有任何重建的办法,步骤只有换盘、删掉旧虚拟盘重新建、重装或重新挂载,再从备份或数据源头恢复。所以 RAID 0 上的数据必须满足两个条件之一:能从别处重新生成,或者有存放在这台机器之外的定期备份。

RAID 1:阵列卡上的 RAID 1 对系统来说只是一块盘,插上新盘后控制器一般会自动开始重建。软 RAID 要手动操作:

cat /proc/mdstat                                    # [U_] 表示缺了一块盘
mdadm --detail /dev/md1                             # 看哪块盘是 faulty 或 removed
mdadm /dev/md1 --fail /dev/sdc1 --remove /dev/sdc1
# 换上新盘后,把好盘 sdb 的 GPT 分区表复制到新盘 sdc,再给新盘生成新的 GUID
sgdisk -R /dev/sdc /dev/sdb && sgdisk -G /dev/sdc
mdadm /dev/md1 --add /dev/sdc1
watch -n 5 cat /proc/mdstat                         # 看重建进度

软 RAID 1 做系统盘还要多一步:引导程序要装到两块盘上。Legacy(BIOS)模式下对两块盘分别执行 grub-install(RHEL 系为 grub2-install),否则坏的恰好是装了引导的那块时,系统数据完好却开不了机;UEFI 模式下,EFI 系统分区不能放在默认格式(metadata 1.2)的 mdadm 阵列里,常见做法是每块盘各建一个 EFI 分区并保持内容同步。

两块盘怎么选:按数据能不能重新生成

场景 建议 理由
系统盘 RAID 1 系统坏了要重装、恢复配置,停机的代价远高于一块盘的容量
小型数据库、网站、业务应用 RAID 1,另做异机备份 数据不能重新生成,写入量不大,单盘性能够用
编译缓存、转码中间文件、下载或 CDN 缓存 RAID 0 丢了可以重新生成,要的是容量和吞吐
视频剪辑、科学计算的临时工作区 RAID 0 原始数据另有保存,工作区要速度
Ceph、HDFS、MinIO 这类分布式存储节点 不做 RAID,两块盘分别交给软件 软件自己在多台机器之间保存副本,做成 RAID 0 反而让一块盘的故障牵连两块盘的数据
拿不准 RAID 1 选错 RAID 1 只是少用一块盘的容量,选错 RAID 0 是丢数据

还有一个常被忽略的选项:两块盘都不做 RAID,各自挂载到不同目录。容量和 RAID 0 一样,坏一块只丢这块盘上的数据。业务能把数据分到两个目录时(比如两个缓存目录),它比 RAID 0 稳妥,代价是单个文件的读写速度不会叠加。

阵列级别要在装系统之前定好。建好之后再改,多数情况要先备份、删除阵列再重建;部分阵列卡支持在线迁移级别,但对盘数和容量有要求,迁移过程也很长,以控制器文档为准。

在管理系统里怎么落地

同样是坏了一块盘,RAID 0 和 RAID 1 的服务器处理方式完全不同:前者意味着数据已经丢失、要通知客户准备恢复,后者只需安排换盘。值班人员接到报修时,要能马上查到这台机器装了几块盘、是什么阵列,所以阵列级别应当和硬件配置一起记录在资产信息里。DCIM 机房管理系统的机柜与资产会向服务器下发硬件采集脚本,CPU、内存、硬盘等真实配置自动入库并保留每次采集的历史,与人工录入的配置同时保留,少了一块盘、换过一块盘都能对照出来;换下的硬盘作为部件登记返修,服务器故障的处理过程记录在故障管理里。RAID 0 的机器坏盘后要重建虚拟盘时,在 IPMI 远程管理里打开走 BMC 通道的控制台,开机时进阵列卡界面重建,再挂载 ISO 重装系统,不必派人去机房接显示器。

常见问题

两块容量不同的盘能做 RAID 0 或 RAID 1 吗?

能,但大盘多出来的容量多半浪费。阵列卡按小盘计算,RAID 0 可用容量是小盘的两倍,RAID 1 等于小盘;Linux mdadm 的 RAID 0 能用上两块盘的全部容量,只是超出小盘的那部分不再条带化,RAID 1 仍按小盘算。

RAID 1 的盘拆下来能单独读吗?

软 RAID 1 的每块盘都是完整副本,接到另一台 Linux 机器上,mdadm 能把它组装成降级阵列直接读。阵列卡上的 RAID 1 盘带有控制器的配置信息,稳妥的做法是接到同系列阵列卡上导入外来配置后再读。

一块 SSD 和一块机械盘能做 RAID 1 吗?

软 RAID 可以做,多数阵列卡不允许混用介质。即使能做,写入要等慢的那块完成,写速度会降到机械盘的水平;用 mdadm 时可以给机械盘加 --write-mostly 参数,让读请求尽量走 SSD。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88