在大约一年的时间里,我有一个 debian 服务器,在 zfs(池名称 zdata)下的 dm-crypt/luks 加密硬盘上运行数据,8 个硬盘处于镜像模式,因此 4 个镜像,每个镜像有 2 个硬盘。健康时期的 zpool 状态:
# zpool status
pool: zdata
state: ONLINE
scrub: scrub completed after (blahblah)
config:
NAME STATE READ WRITE CKSUM
zdata ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
dm-name-n8_2 ONLINE 0 0 0
dm-name-n8_3 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
dm-name-n8_0 ONLINE 0 0 0
dm-name-n8_1 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
dm-name-n8_4 ONLINE 0 0 0
dm-name-n8_5 ONLINE 0 0 0
mirror-3 ONLINE 0 0 0
dm-name-n8_7 ONLINE 0 0 0
dm-name-n8_6 ONLINE 0 0 0
errors: No known data errors
(当然,没有备份这 34TB 原始数据。我可以放弃几乎所有数据,但有一些文件我认为对我来说很珍贵。)
两周前升级到稳定版后,我注意到开始有几个读取、写入和校验错误与 dm-名称-n8_2。清理并没有做到这一点,因为 zfs 开始了重新同步,但从未结束它,因为它一遍又一遍地开始。就在那时,镜像中的另一个硬盘 dm-name-n8_3 也出现了同样的错误,我开始意识到,两个 hhd 各自的控制器都快要死了。
我想,比起我做了愚蠢的事情,并不是我现在能理解的一切(矿池历史什么也没显示)。其中,我开始更换“更好”的磁盘。与此同时,我正在研究一台有缺陷的家用电器,导致断电,启动后我无法再次导入池。坏磁盘现在已被删除和替换。最终我无法再次导入池:
# zpool import -f
pool: zdata
id: 1343310357846896221
state: UNAVAIL
status: One or more devices were being resilvered.
action: The pool cannot be imported due to damaged devices or data.
config:
zdata UNAVAIL missing device
mirror-0 DEGRADED
dm-name-n8_2 UNAVAIL
dm-name-n8_3 ONLINE
mirror-1 ONLINE
n8_0 ONLINE
n8_1 ONLINE
mirror-2 DEGRADED
dm-name-n8_4 ONLINE
dm-name-n8_5 UNAVAIL
mirror-3 ONLINE
n8_7 ONLINE
dm-name-n8_6 ONLINE
# zpool import zdata -f
cannot import 'zdata': one or more devices is currently unavailable
同样与zpool导入zdata -fnF
请注意更改的设备名称。
泳池至少有一每个镜像中的设备都在线,为什么它会抱怨丢失设备?
我如何知道缺少哪个设备?有没有办法让池重新上线?我该怎么做?
(我阅读了oracle文档和freebsd手册中关于zfs的章节,学到了一些东西,但没有找到我的问题的答案。)
zdb的输出有点长,可以看出这里。
答案1
最终我找到了解决这个混乱问题的方法:我看到了不同的status
消息,具体取决于我使用哪些磁盘来再次启动池。我多次尝试使用四个相应磁盘的各种组合来导入处于降级状态的池,最后我得到了以下结果:
NAME STATE READ WRITE CKSUM
zdata DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
dm-name-n8_2 ONLINE 0 0 0 (resilvering)
11141007683912581709 UNAVAIL 0 0 0 was /dev/disk/by-id/dm-name-n8_3
mirror-1 DEGRADED 0 0 0
16620393607066428577 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_0
dm-name-n8_0 ONLINE 0 0 0
mirror-2 DEGRADED 0 0 0
replacing-0 DEGRADED 85 0 0
1051730541091272780 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_4
dm-name-n8_6 ONLINE 0 0 85 (resilvering)
dm-name-n8_4 ONLINE 0 0 0 (resilvering)
mirror-3 DEGRADED 0 0 0
dm-name-n8_5 ONLINE 0 0 0
13833275275194605312 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_6
这使我能够从损坏的磁盘上抓取几乎所有数据。损失约为 0.1%(>70000 个文件中的 134 个)。
根据我的理解,zfs 在该池的每个设备上存储配置数据,并保持它们同步。也许停电损坏了这个,或者损坏了磁盘?
无论如何,我又高兴了。感谢您的阅读和帮助!
答案2
仅供以后参考。将 I/O 缓冲区 (zfs) 放在不同 I/O 缓冲区(硬件 RAID 控制器)之上总是一个坏主意。这两个人互相忽视并且可能/将会造成各种各样的麻烦。避免这种情况的明智方法是使用网络存储设备。