为了测试添加 ZFS 日志设备对 ZFS 阵列的影响,我决定创建一个 zpool 并执行一些基准测试,然后插入 SSD 充当 ZIL。
不幸的是,每当我在创建 zpool 后插入 SSD,或者在创建池后拔下 SSD(任何导致池创建后驱动器号发生变化的事情),然后重新启动时,我的池就会降级,如运行以下命令所示:sudo zpool status
pool: zpool1
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sda ONLINE 0 0 0
1875547483567261808 UNAVAIL 0 0 0 was /dev/sdc1
我怀疑问题源于我使用驱动器号创建池,如下所示:
sudo zpool create -f zpool1 mirror /dev/sdb /dev/sdc
问题
幸运的是,这只是一次测试,没有丢失数据的风险,但如果这种情况在现实场景中发生,从这个问题中恢复的最佳方法是什么?显然,驱动器仍然存在,并且可以运行。
有没有更好的方法来创建 zpool 而不使用驱动器号,以/dev/sda
避免将来出现此问题?我注意到Ubuntu 文档指出以与我相同的方式创建 zpool。
额外信息
- 操作系统:Ubuntu 16.04 Server 4.10
zfsutils-linux
从安装包安装 zfs
答案1
在获得 Dexter_Kane 的帮助后一级技术论坛,答案是/dev/disk/by-id/...
在创建池时使用路径。
例如
sudo zpool create zpool1 mirror \
/dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 \
/dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H
改造和修复现有泳池
好消息是,您可以“转换”现有的 ZFS RAID 阵列以使用这些标签,从而防止将来发生这种情况,并且如果这种情况已经发生在您身上,甚至可以解决您的降级阵列。
sudo zpool export [pool name]
sudo zpool import -d /dev/disk/by-id [pool name]
您只需确保池数据集未被使用即可。例如,不要在池内执行命令,并确保它们未通过 NFS 等进行共享。
执行转换后,输出sudo zpool status
应类似于:
pool: zpool1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 ONLINE 0 0 0
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H ONLINE 0 0 0
测试执行
我确保测试一下:
- 使用 by-id 路径确实可以防止问题的发生。
- 在池处于降级状态时写入一些数据后,执行导出/导入后我仍然能够读取所有文件,并且
sudo zpool status
没有报告任何错误。