我有一个有 2 个分支的 BTRFS RAID-1 文件系统。由于再次出现读取错误,需要更换一张磁盘。
因此,计划是:
- 添加第三条腿 -> 结果应该是:三向镜
- 删除有故障的磁盘 -> 结果应该是: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 确实有一个特殊的替换子命令:
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。
我做了以下事情:
- 确保降级的文件系统
noauto
位于/etc/fstab
- 重新启动机器(由于 I/O 挂起,大约需要 20 分钟)
禁用故障驱动器上包含 btrfs fs 的 LVM VG:
sudo vgchange -an <failed-vg>
禁用发生故障的设备:
echo 1 | sudo tee /sys/block/sdb/device/delete
挂载文件系统
-o rw,degraded
(笔记:degraded
只能使用一次)失败的原因
devid
是:btrfs filesystem show /mountpoint
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 天才能删除) 。