如何替换 BTRFS RAID-1 文件系统中的设备?

如何替换 BTRFS RAID-1 文件系统中的设备?

我有一个有 2 个分支的 BTRFS RAID-1 文件系统。由于再次出现读取错误,需要更换一张磁盘。

因此,计划是:

  1. 添加第三条腿 -> 结果应该是:三向镜
  2. 删除有故障的磁盘 -> 结果应该是:2路镜像

因此,我做了以下步骤:

btrfs dev add /dev/new_device /mnt/foo
btrfs balance /mnt/foo

我认为 btrfs 做了正确的事情,即创建一个三向镜像。

我猜,另一种选择是使用平衡滤波器。但既然文件系统已经是 RAID-1 了,那应该没有必要了吧?

我有点担心,因为btrfs fi show打印了这个:

平衡开始前:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 2.16TiB path /dev/left
    devid    2 size 2.73TiB used 2.16TiB path /dev/right
    devid    3 size 2.73TiB used 0.00B path /dev/new_device

平衡期间:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 1.93TiB path /dev/left
    devid    2 size 2.73TiB used 1.93TiB path /dev/right
    devid    3 size 2.73TiB used 458.03GiB path /dev/new_device

我的意思是,这看起来像 btrfs 将现有 RAID-1 组的一半平衡到单个磁盘......对吗?

因此,我的问题是,我是否需要指定平衡滤波器才能获得三向镜?

附:btrfs 是否支持 n 路镜像? Abtrfs wiki 中的注释说它没有 - 但也许它已经过时了?好家伙,cks 最近有一篇关于 2 路限制的文章

答案1

目前,btrfs才不是支持n路镜子

Btrfs 确实有一个特殊的替换子命令:

btrfs replace start /dev/left /dev/new_device /mnt/foo

阅读手册页的字里行间btrfs-replace,该命令应该能够使用两个现有的支路 - 例如,对于两个支路都有读取错误的情况 - 但两个错误集是不相交的。

btrfs 替换命令在后台执行 - 您可以通过status子命令检查其状态,例如:

btrfs replace status /mnt/foo
45.4% done, 0 write errs, 0 uncorr. read errs

或者,也可以将设备添加到 raid-1 文件系统,然后删除现有分支:

btrfs dev add /dev/mapper/new_device /mnt/foo
btrfs dev delete /dev/mapper/right  /mnt/foo

应该add会快速返回,因为它只是添加设备(发出 abtrfs fi show进行确认)。

以下内容delete应触发剩余设备之间的平衡,以便每个扩展在每个剩余设备上可用。因此,该命令可能运行很长时间。此方法也适用于处理问题中描述的情况。

与添加/删除周期垃圾邮件相比,btrfs replace系统日志包含低级信息消息。而且,完成所需的时间要长得多(例如,在我的测试系统中,具有 3 TB SATA 驱动器、80% FS 使用率,需要更长的时间 2-3 倍)。

最后,在实际更换后,如果新设备比原始设备大,您将需要btrfs fi resize在每个设备上发出 a 以利用整个可用磁盘空间。对于replace顶部的示例,这看起来像:

btrfs fi resize <devid>:max /mnt/foo

其中devid代表返回的设备 ID btrfs fi show

答案2

使用replace是首选解决方案,并且比以下快 2-3 倍balance。 (device remove首先重新平衡。也许它不使用soft转换类型,使其速度变慢)

此答案可防止故障磁盘阻塞内核 I/O。

我做了以下事情:

  1. 确保降级的文件系统noauto位于/etc/fstab
  2. 重新启动机器(由于 I/O 挂起,大约需要 20 分钟)
  3. 禁用故障驱动器上包含 btrfs fs 的 LVM VG:

    sudo vgchange -an <failed-vg>
    
  4. 禁用发生故障的设备:

    echo 1 | sudo tee /sys/block/sdb/device/delete
    
  5. 挂载文件系统-o rw,degraded笔记:degraded只能使用一次

  6. 失败的原因devid是:

    btrfs filesystem show /mountpoint
    
  7. btrfs replace start -B <devid> /dev/new-disk /mountpoint
    

当我写这篇文章时:

  • replace status每 30 秒左右显示 0.1% 的健康进展
  • iostat -d 1 -m <target-dev>显示约为 145MB/s(希捷宣传为 160MB/s)

答案3

btrfs replace建议这样做有一个缺点 - 它不允许用较小的设备替换较大的设备,甚至利用率很低。例如,将 1TB HDD 替换为 500GB SSD 的场景不起作用,并且仅允许添加/删除选项。

唯一的好处是,写入 SSD 的速度非常快,删除仅依赖于 HDD,每分钟几 GB,在加载的系统上 100% 利用 HDD 驱动器(寻道时间远远超过性能,1TB 可能需要 1 天才能删除) 。

相关内容