1 周年 PowerDedi 1 周年: −20% 所有服务器适用 优惠码 距结束 14 h 立即领取

PowerDedi

服务器管理

监控与修复软件 RAID

检查 mdadm 健康状态、接收告警、安全更换故障硬盘,并规划 RAID 6、RAID 10 或 RAIDZ2 存储池的容量。

2026年9月25日更新 · 阅读约 4 分钟 · 6 个章节

本页目录 6 个章节
  1. 默认磁盘布局
  2. 检查阵列健康状态
  3. 设置告警
  4. 更换故障磁盘
  5. 存储服务器的磁盘布局
  6. 检查磁盘磨损和 SMART 数据

我们安装的 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

更换故障磁盘

  1. 找出故障磁盘,并记下两块磁盘的序列号:
    cat /proc/mdstat
    lsblk -o NAME,SIZE,MODEL,SERIAL
    sudo smartctl -i /dev/nvme1n1
  2. 将故障磁盘上的分区标记为故障(faulty),并将其从所有阵列中移除。如果该磁盘已经消失,且 mdadm 已将其列为已移除(removed),请跳过此步骤。
    sudo mdadm /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2
    sudo mdadm /dev/md1 --fail /dev/nvme1n1p3 --remove /dev/nvme1n1p3
  3. 提交工单,写明需要更换的磁盘序列号、需要保留的磁盘序列号,以及更换时是否允许我们关机。故障确认后一小时内即开始更换;参见 SLA。
  4. 更换完成后,用 lsblk 找到新的空白磁盘。将健康磁盘的分区表复制到新磁盘上,然后为副本生成唯一的 GUID:
    sudo sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1
    sudo sgdisk --randomize-guids /dev/nvme1n1
  5. 将新分区加入阵列,并观察重建进度:
    sudo mdadm /dev/md0 --add /dev/nvme1n1p2
    sudo mdadm /dev/md1 --add /dev/nvme1n1p3
    watch -n 10 cat /proc/mdstat
  6. 让新磁盘可以引导启动。在 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 TBRAID 10,或两组 ZFS 镜像44 TB (40 TiB)每对中的一块磁盘
4 × 22 TBRAID 6 或 RAIDZ244 TB (40 TiB)任意两块磁盘
12 × 22 TBRAID 6 或 RAIDZ2220 TB (200 TiB)任意两块磁盘
12 × 22 TBRAID 10132 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 启用它。

相关指南

全部指南
服务器管理

更新于

使用 IPMI/KVM 控制台

在浏览器中查看服务器屏幕、控制电源、挂载 ISO 并进入 BIOS,即使操作系统无法启动也可以。

阅读约 4 分钟