環(huán)境
- CentOS 6,7,8
- LVM
- 多個系統(tǒng)之間共享存儲
問題
我們正在運行 2 個系統(tǒng),它們都有安裝了 RHEL 的本地磁盤,并且可以訪問共享 LUN(塊設(shè)備)。在該 LUN 上,我們有一個分區(qū)表、LVM 物理卷 (PV)、一個卷組(不是集群 (CLVM),而是一個普通卷組)和多個卷。這些卷使用 XFS。對于這些 XFS 文件系統(tǒng)之一,出現(xiàn)以下內(nèi)容:
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無法修復(fù)損壞,我們必須從另一個存儲卷恢復(fù) XFS 文件系統(tǒng)的備份。是什么原因造成的?如何預(yù)防?
解決
應(yīng)嘗試進行深入調(diào)查,試圖了解發(fā)生了哪些行為。
-
當(dāng)錯誤報告“清零數(shù)據(jù)”時,我們應(yīng)該嘗試找出“清零”了多少數(shù)據(jù)。為此,使用
dd調(diào)查相關(guān)卷的前 1MB 將顯示整個卷是否已清零。還可以研究整個塊設(shè)備的第一部分。例如:# dd if=/dev/myvg/volume of=/tmp/file bs=1M count=1 # hexdump /tmp/file | less 應(yīng)驗證通用系統(tǒng)設(shè)置。對于所討論的環(huán)境,使用了 2 個 RHEL 系統(tǒng)的非集群卷組。這意味著,必須特別注意,任何時候只有一個系統(tǒng)在磁盤上執(zhí)行操作。對于 LVM,兩個系統(tǒng)中只有一個應(yīng)該使 VolumeGroup 聯(lián)機。另外,這兩個系統(tǒng)不應(yīng)運行 lvmetad。 lvmetad 旨在緩存 LVM 數(shù)據(jù),并在只有本地系統(tǒng)有權(quán)訪問可見磁盤的假設(shè)下工作。
-
應(yīng)調(diào)查在相關(guān)系統(tǒng)上執(zhí)行操作的順序。為此,可以使用 /etc/lvm/backup 和 /etc/lvm/archive 中的 LVM 操作。通過這些文件和時間戳,發(fā)現(xiàn)在這種特定情況下執(zhí)行了以下操作:
- 首先,共享 LUN 上的 LogicalVolume 從節(jié)點 1 開始分多個步驟增加:50GB -> 50GB + X GB -> 50GB + X GB + YGB。這導(dǎo)致 VolumeGroup 中使用了 3 個段。
- 一段時間后,從其他節(jié)點,相同的 LogicalVolume 直接從 50GB -> 50 + X + Y GB 擴展。
- 這會將 LVM 元數(shù)據(jù)歸零,因為節(jié)點 1 創(chuàng)建的最后 2 個段被節(jié)點 2 上執(zhí)行的 lvextend 命令覆蓋。
- lvmetad 使事情變得更加復(fù)雜,它緩存數(shù)據(jù)并且不考慮其他系統(tǒng)更改 LVM 數(shù)據(jù)。
根本原因
- 2 個系統(tǒng)正在訪問一個共享塊設(shè)備。每個系統(tǒng)都運行 lvmetad,它的運行假設(shè)只有本地系統(tǒng)可以訪問該卷。
- LVM 操作 (lvextend) 是從多個節(jié)點執(zhí)行的,而該操作應(yīng)該只從一個節(jié)點執(zhí)行。