我按照 Github 的出色描述设置了 ZFS-HA(参见此处)。经过广泛的测试后,我使用 RAIDZ3 中的 5x12 磁盘将设置推广到生产环境,该磁盘使用 HBA 控制器连接到两个节点。直到昨晚两个存储池中的一个突然出现“池元数据已损坏”故障时,这一直运行得很顺利。在一个scrub
跑。在这一点上,我只能推测是什么原因造成的,两个池都在起搏器中设置了 SCSI 防护,并且在我投入生产之前测试的所有故障场景中,磁盘预留都可以完美地工作。最近发生的唯一重大事件是在没有 UPS 支持的情况下两次完全停电(阅读:电源从一个时刻到下一个时刻都消失了)。但是,腐败的真正原因也可能完全不同。
现在的情况是我不能再import
使用游泳池了(请参阅zpool import
本问题末尾的输出)。到目前为止,我所有拯救游泳池的意图都失败了:
# zpool import -f tank
cannot import 'tank': one or more devices is currently unavailable
# zpool import -F tank
cannot import 'tank': one or more devices is currently unavailable
这让我有点困惑,因为它并没有真正说唯一的选择是销毁池(这将是对致命损坏的池的预期响应)。
# zpool clear -F tank
cannot open 'tank': no such pool
我还手动删除了所有 SCSI 预留,例如:
# DEVICE=35000c5008472696f
# sg_persist --in --no-inquiry --read-reservation --device=/dev/mapper/$DEVICE
# sg_persist --in --no-inquiry --read-key --device=/dev/mapper/$DEVICE
# sg_persist --out --no-inquiry --register --param-sark=0x80d0001 --device=/dev/mapper/$DEVICE
# sg_persist --out --no-inquiry --clear --param-rk=0x80d0001 --device=/dev/mapper/$DEVICE
# sg_persist --in --no-inquiry --read-reservation --device=/dev/mapper/$DEVICE
我进一步尝试从磁盘架上移除 A/C,以清除可能保留在办公桌上的任何临时信息。
坦率地说,我缺乏选择。我的清单上唯一剩下的就是-X
选项zpool import
- 在所有其他措施都失败后我会尝试。
所以我的问题是,你之前有没有遇到过这样的事情——更重要的是——你找到解决这个问题的方法了吗?如果您有任何建议,我将不胜感激。
=========
泳池布局/配置:
pool: tank
id: 1858269358818362832
state: FAULTED
status: The pool metadata is corrupted.
action: The pool cannot be imported due to damaged devices or data.
The pool may be active on another system, but can be imported using
the '-f' flag.
see: http://zfsonlinux.org/msg/ZFS-8000-72
config:
tank FAULTED corrupted data
raidz3-0 FAULTED corrupted data
35000c5008472696f ONLINE
35000c5008472765f ONLINE
35000c500986607bf ONLINE
35000c5008472687f ONLINE
35000c500847272ef ONLINE
35000c50084727ce7 ONLINE
35000c50084729723 ONLINE
35000c500847298cf ONLINE
35000c50084728f6b ONLINE
35000c50084726753 ONLINE
35000c50085dd15bb ONLINE
35000c50084726e87 ONLINE
raidz3-1 FAULTED corrupted data
35000c50084a8a163 ONLINE
35000c50084e80807 ONLINE
35000c5008472940f ONLINE
35000c50084a8f373 ONLINE
35000c500847266a3 ONLINE
35000c50084726307 ONLINE
35000c50084726897 ONLINE
35000c5008472908f ONLINE
35000c50084727083 ONLINE
35000c50084727c8b ONLINE
35000c500847284e3 ONLINE
35000c5008472670b ONLINE
raidz3-2 FAULTED corrupted data
35000c50084a884eb ONLINE
35000c500847262bb ONLINE
35000c50084eb9f43 ONLINE
35000c50085030a4b ONLINE
35000c50084eb238f ONLINE
35000c50084eb6873 ONLINE
35000c50084728baf ONLINE
35000c50084eb4c83 ONLINE
35000c50084727443 ONLINE
35000c50084a8405b ONLINE
35000c5008472868f ONLINE
35000c50084727c6f ONLINE
raidz3-3 FAULTED corrupted data
35000c50084eaa467 ONLINE
35000c50084e7d99b ONLINE
35000c50084eb55e3 ONLINE
35000c500847271d7 ONLINE
35000c50084726cef ONLINE
35000c50084726763 ONLINE
35000c50084727713 ONLINE
35000c50084728127 ONLINE
35000c50084ed0457 ONLINE
35000c50084e5eefb ONLINE
35000c50084ecae2f ONLINE
35000c50085522177 ONLINE
raidz3-4 FAULTED corrupted data
35000c500855223c7 ONLINE
35000c50085521a07 ONLINE
35000c50085595dff ONLINE
35000c500855948a3 ONLINE
35000c50084f98757 ONLINE
35000c50084f981eb ONLINE
35000c50084f8b0d7 ONLINE
35000c50084f8d7f7 ONLINE
35000c5008539d9a7 ONLINE
35000c5008552148b ONLINE
35000c50085521457 ONLINE
35000c500855212b3 ONLINE
编辑:
服务器是 2 个 Dell PowerEdge R630,控制器是 Broardcom SAS HBA 的 DELL OEM 版本(应该类似于 SAS 9300-8e),并且该池中的所有 60 个磁盘都是 Seagate ST6000NM0034。机箱是广达 MESOS M4600H。
编辑2:
操作系统是 CentOS 7
ZFS 是 zfs-0.7.3-1.el7_4.x86_64
最后我求助于
-X
使用import
. 这通过以 2GB/s 的速度读取大约 36 小时来锻炼所有磁盘。之后,没有给出错误消息,文件系统已安装并且现在可以再次完全访问。到目前为止,没有检测到数据不一致(zfs scrub
仍在运行)。感谢你的回复。但是,对于未来的读者,我想从手册页传递有关该选项的警告
-X
:此选项可能对您的池的健康极为有害,只能作为最后的手段使用。似乎上游在这里没有太多选择(这是来自Oracle Solaris ZFS 故障排除和池恢复文档,说明这
zpool import -F
是您真正拥有的唯一选择,除了聘请 ZFS 专家,该专家将实际调查元数据是如何损坏的) :而且我认为 OpenZFS 联盟并没有带来太多改变这种情况的东西。而这确实是一个悲伤的消息。
PS 这与池达到其状态的原因无关,但您不认为创建 10 个磁盘范围的阵列本身就是问题吗?即使有 2 个以上的备用磁盘。冷数据等等,你懂的。
硬件细节是什么?服务器、磁盘、机箱和控制器的品牌和型号。
我会禁用所有 HA 功能并专注于在一个系统上工作。
将一个节点置于待机状态:
pcs cluster standby
或者只是禁用起搏器。在您将要处理的节点上手动导入池:
zpool import tank -d /dev/mapper/
并观察结果。另外,你这样做
dmesg
之后会看到什么?