插入驱动器时Zpool会降级
为了测试添加ZFS日志设备对ZFSarrays会产生什么影响,我决定创建一个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 RAIDarrays“转换”为使用这些标签,以防止将来发生这种情况,如果已经发生这种情况,甚至可以解决降级后的arrays。
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
报告没有错误。