我们安装的 Linux 系统使用 mdadm 软件 RAID,默认将两块相同的磁盘组成镜像(RAID 1)。本指南介绍健康检查、告警、磁盘更换以及存储服务器的磁盘布局。您需要 root 权限。示例使用 nvme0n1 这样的 NVMe 设备名;SATA 和 SAS 磁盘则显示为 sda、sdb,依此类推。
默认磁盘布局
两块磁盘使用相同的分区表,每对分区组成一个 RAID 1 阵列,例如 md0 对应 /boot,md1 对应 /。具体有哪些阵列取决于操作系统和启动模式。查看您服务器上的布局:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
检查阵列健康状态
cat /proc/mdstat
sudo mdadm --detail /dev/md1
md1 : active raid1 nvme1n1p3[1] nvme0n1p3[0]
998848512 blocks super 1.2 [2/2] [UU]
[UU] 表示两个成员盘都处于活动状态;[U_] 表示阵列已降级,仅靠一块磁盘运行。在 mdadm --detail 的输出中,检查 State 行,并留意标记为 faulty 或 removed 的成员盘。
设置告警
降级的镜像仍会继续工作,因此如果没有告警,您可能要等到第二块磁盘也发生故障时才会察觉。在 /etc/mdadm/mdadm.conf(Debian、Ubuntu)或 /etc/mdadm.conf(AlmaLinux、Rocky Linux)中告诉 mdadm 将报告发往何处:
MAILADDR root
PROGRAM /usr/local/sbin/raid-alert
发送给 root 的告警需要一个正常工作的邮件传输代理,例如在本地投递或通过您的邮件服务商中继的 Postfix。可选的 PROGRAM 行会运行您自己的脚本,并将事件名和设备名作为参数传入,例如用于向聊天工具的 webhook 推送消息。重启监控服务,并为每个阵列发送一条测试告警:
sudo systemctl restart mdmonitor
sudo mdadm --monitor --scan --oneshot --test
更换故障磁盘
- 找出故障磁盘,并记下两块磁盘的序列号:
cat /proc/mdstat lsblk -o NAME,SIZE,MODEL,SERIAL sudo smartctl -i /dev/nvme1n1 - 将故障磁盘上的分区标记为故障(faulty),并将其从所有阵列中移除。如果该磁盘已经消失,且 mdadm 已将其列为已移除(removed),请跳过此步骤。
sudo mdadm /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2 sudo mdadm /dev/md1 --fail /dev/nvme1n1p3 --remove /dev/nvme1n1p3 - 提交工单,写明需要更换的磁盘序列号、需要保留的磁盘序列号,以及更换时是否允许我们关机。故障确认后一小时内即开始更换;参见 SLA。
- 更换完成后,用
lsblk找到新的空白磁盘。将健康磁盘的分区表复制到新磁盘上,然后为副本生成唯一的 GUID:sudo sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1 sudo sgdisk --randomize-guids /dev/nvme1n1 - 将新分区加入阵列,并观察重建进度:
sudo mdadm /dev/md0 --add /dev/nvme1n1p2 sudo mdadm /dev/md1 --add /dev/nvme1n1p3 watch -n 10 cat /proc/mdstat - 让新磁盘可以引导启动。在 BIOS 系统上,运行
sudo grub-install /dev/nvme1n1(在 AlmaLinux 和 Rocky Linux 上为grub2-install)。在 EFI 分区不属于任何阵列的 UEFI 系统上,用sudo dd if=/dev/nvme0n1p1 of=/dev/nvme1n1p1 bs=4M从健康磁盘复制该分区。
在
sgdisk --replicate=TARGET SOURCE中,等号后面的磁盘会被覆盖。一旦把两者写反,就会抹掉您唯一一块健康磁盘的分区表。使用dd时,对if=(源)和of=(目标)也要同样小心。
默认情况下,重建速度最高约为 200 MB/s,即 /proc/sys/dev/raid/speed_limit_max 中设定的上限。这相当于每 TB 大约需要 1.4 小时,一块 22 TB 的磁盘则需要一天以上。在 NVMe 服务器上,可以用 sudo sysctl -w dev.raid.speed_limit_max=2000000 提高这一上限。
存储服务器的磁盘布局
存储服务器配备 4、12 或 24 块 22 TB 机械硬盘,外加两块 NVMe 硬盘。请将操作系统放在 NVMe 镜像上,用机械硬盘组建数据阵列。由于 22 TB 硬盘的重建需要一天以上,请使用双重校验(RAID 6 或 ZFS RAIDZ2)或镜像,而不要使用 RAID 5。
| 磁盘 | 布局 | 可用容量 | 容错能力 |
|---|---|---|---|
| 4 × 22 TB | RAID 10,或两组 ZFS 镜像 | 44 TB (40 TiB) | 每对中的一块磁盘 |
| 4 × 22 TB | RAID 6 或 RAIDZ2 | 44 TB (40 TiB) | 任意两块磁盘 |
| 12 × 22 TB | RAID 6 或 RAIDZ2 | 220 TB (200 TiB) | 任意两块磁盘 |
| 12 × 22 TB | RAID 10 | 132 TB (120 TiB) | 每对中的一块磁盘 |
| 24 × 22 TB | 两组 RAID 6 或 RAIDZ2,每组 12 块 | 440 TB (400 TiB) | 每组两块磁盘 |
| 24 × 22 TB | 三组 RAIDZ2,每组 8 块 | 396 TB (360 TiB) | 每组两块磁盘 |
以上数据未扣除文件系统开销,且 df 等工具以 TiB 为单位显示容量。RAID 10 的随机 I/O 性能最好,而 RAID 6 和 RAIDZ2 可承受任意两块磁盘故障,并且在 12 块及以上磁盘时能提供更多空间。分组更多、每组更窄时,重建更快、性能更好,但会牺牲一些容量。ZFS 存储池的使用率请保持在约 80% 以下。
使用 ZFS 时,空闲的 NVMe 分区还可以为存储池加速;请在安装操作系统时就规划好这些分区:
- cache 设备(L2ARC)将读缓存扩展到内存之外。它不需要冗余:即使它发生故障,存储池也能继续运行。
- special vdev 将元数据(以及可选的小文件)存放在闪存上,从而加快目录扫描和小文件负载。一旦丢失它,整个存储池都会丢失。只有两块 NVMe 硬盘时,它只能做成双向镜像,只能承受一块磁盘故障,而 RAIDZ2 可承受两块,因此除非加上
-f,否则zpool会拒绝这种冗余级别不匹配的配置。只有在您接受这一取舍时才使用它。
检查磁盘磨损和 SMART 数据
sudo smartctl -a /dev/nvme0
sudo smartctl -H -A /dev/sda
对于 NVMe 硬盘,请关注 Percentage Used,即已消耗的额定写入寿命比例(100% 并不代表硬盘已经损坏),同时关注 Available Spare、Media and Data Integrity Errors 以及应为 0x00 的 Critical Warning。对于机械硬盘,如果 Reallocated_Sector_Ct、Current_Pending_Sector 或 Offline_Uncorrectable 的数值不断上升,说明应在磁盘彻底故障之前将其更换。smartmontools 软件包中的 smartd 守护进程会持续检查这些数值,并可通过电子邮件通知您;在 AlmaLinux 和 Rocky Linux 上,用 sudo systemctl enable --now smartd 启用它。



