环境
- CentOS 6,7,8
- LVM
- 多个系统之间共享存储
问题
我们正在运行 2 个系统,它们都有安装了 RHEL 的本地磁盘,并且可以访问共享 LUN(块设备)。在该 LUN 上,我们有一个分区表、LVM 物理卷 (PV)、一个卷组(不是集群 (CLVM),而是一个普通卷组)和多个卷。这些卷使用 XFS。对于这些 XFS 文件系统之一,出现以下内容:
hostname <kern.info> kernel:XFS (dm-5): Ending clean mount
hostname <kern.alert> kernel:XFS (dm-2): Metadata corruption detected at xfs_agf_read_verify+0x70/0x120 [xfs], block 0x7d00001
hostname <kern.alert> kernel:XFS (dm-2): Unmount and run xfs_repair
hostname <kern.alert> kernel:XFS (dm-2): First 64 bytes of corrupted metadata buffer:
hostname <kern.alert> kernel:ffff881a4d5fa200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
hostname <kern.alert> kernel:ffff881a4d5fa210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
hostname <kern.alert> kernel:ffff881a4d5fa220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
hostname <kern.alert> kernel:ffff881a4d5fa230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
hostname <kern.alert> kernel:XFS (dm-2): metadata I/O error: block 0x7d00001 ("xfs_trans_read_buf_map") error 117 numblks 1
hostname <kern.notice> kernel:XFS (dm-2): xfs_do_force_shutdown(0x8) called from line 135 of file fs/xfs/xfs_bmap_util.c. Return address = 0xffffffffa017a928
hostname <kern.alert> kernel:XFS (dm-2): Corruption of in-memory data detected. Shutting down filesystem
hostname <kern.alert> kernel:XFS (dm-2): Please umount the filesystem and rectify the problem(s)
hostname <kern.warning> kernel:nr_pdflush_threads exported in /proc is scheduled for removal
hostname <kern.warning> kernel:XFS (dm-2): xfs_log_force: error -5 returned.
xfs_repair无法修复损坏,我们必须从另一个存储卷恢复 XFS 文件系统的备份。是什么缘由造成的?如何预防?
解决
应尝试进行深入调查,尝试了解发生了哪些行为。
-
当错误报告“清零数据”时,我们应该尝试找出“清零”了多少数据。为此,使用
dd调查相关卷的前 1MB 将显示整个卷是否已清零。还可以研究整个块设备的第一部分。例如:# dd if=/dev/myvg/volume of=/tmp/file bs=1M count=1 # hexdump /tmp/file | less -
应验证通用系统设置。对于所讨论的环境,使用了 2 个 RHEL 系统的非集群卷组。这意味着,必须特别注意,任何时候只有一个系统在磁盘上执行操作。对于 LVM,两个系统中只有一个应该使 VolumeGroup 联机。另外,这两个系统不应运行 lvmetad。 lvmetad 旨在缓存 LVM 数据,并在只有本地系统有权访问可见磁盘的假设下工作。
-
应调查在相关系统上执行操作的顺序。为此,可以使用 /etc/lvm/backup 和 /etc/lvm/archive 中的 LVM 操作。通过这些文件和时间戳,发目前这种特定情况下执行了以下操作:
- 第一,共享 LUN 上的 LogicalVolume 从节点 1 开始分多个步骤增加:50GB -> 50GB + X GB -> 50GB + X GB + YGB。这导致 VolumeGroup 中使用了 3 个段。
- 一段时间后,从其他节点,一样的 LogicalVolume 直接从 50GB -> 50 + X + Y GB 扩展。
- 这会将 LVM 元数据归零,由于节点 1 创建的最后 2 个段被节点 2 上执行的 lvextend 命令覆盖。
- lvmetad 使事情变得更加复杂,它缓存数据并且不思考其他系统更改 LVM 数据。
根本缘由
- 2 个系统正在访问一个共享块设备。每个系统都运行 lvmetad,它的运行假设只有本地系统可以访问该卷。
- LVM 操作 (lvextend) 是从多个节点执行的,而该操作应该只从一个节点执行。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END

















暂无评论内容