Software-Raid

Linux 軟體 RAID6:3 個驅動器離線 - 如何強制線上?

  • November 5, 2012

這類似於從 Raid6 mdadm 中掉出的 3 個驅動器 - 重建?除非它不是由於電纜故障。相反,第三個驅動器在重建另一個驅動器期間離線。

驅動器出現故障:

kernel: end_request: I/O error, dev sdc, sector 293732432
kernel: md/raid:md0: read error not correctable (sector 293734224 on sdc).

重新啟動這兩個扇區及其周圍的扇區後都很好。這讓我相信錯誤是間歇性的,因此設備只是花費了太長時間來錯誤糾正扇區並重新映射它。

我希望 RAID 失敗後沒有數據寫入。因此,我希望如果我可以線上啟動最後一個失敗的設備,那麼 RAID 是好的並且 xfs_filesystem 是好的,也許有一些最近失去的文件。

備份 RAID 中的磁碟需要 24 小時,所以我希望該解決方案在第一次就可以工作。

因此,我設置了一個測試場景:

export PRE=3

parallel dd if=/dev/zero  of=/tmp/raid${PRE}{} bs=1k count=1000k ::: 1  2  3  4  5
parallel mknod /dev/loop${PRE}{} b 7 ${PRE}{} \; losetup /dev/loop${PRE}{} /tmp/raid${PRE}{} ::: 1  2  3  4  5
mdadm --create /dev/md$PRE -c 4096 --level=6 --raid-devices=5  /dev/loop${PRE}[12345]
cat /proc/mdstat
mkfs.xfs -f /dev/md$PRE
mkdir -p /mnt/disk2
umount -l /mnt/disk2
mount /dev/md$PRE /mnt/disk2
seq 1000 | parallel -j1 mkdir -p /mnt/disk2/{}\;cp /bin/* /mnt/disk2/{}\;sleep 0.5 &
mdadm --fail /dev/md$PRE /dev/loop${PRE}3 /dev/loop${PRE}4
cat /proc/mdstat

# Assume reboot so no process is using the dir
kill %1; sync &
kill %1; sync &

# Force fail one too many
mdadm --fail /dev/md$PRE /dev/loop${PRE}1
parallel --tag -k mdadm -E ::: /dev/loop${PRE}? | grep Upda
# loop 2,5 are newest. loop1 almost newest => force add loop1

下一步是添加 loop1 - 這就是我卡住的地方。

之後進行 xfs 一致性檢查。

如果可行,請檢查該解決方案是否也適用於真實設備(例如 4 個 USB 記憶棒)。

魔法似乎是mdadm -A --force然後只給已知良好的設備+最後一個失敗的設備。對於測試場景,這將是:

mdadm -A --force /dev/md$PRE /dev/loop${PRE}[125]

這將啟動 RAID 設備。xfs_check告訴您掛載磁碟以重播日誌:

mount /dev/md$PRE /mnt/disk2

此時不要使用該目錄:在測試場景中我至少有一次 xfs 抱怨和崩潰。所以與其:

umount /mnt/disk2

進而:

xfs_check /dev/md$PRE

在 50 TB 的文件系統上,這需要 20 分鐘。奇怪的是,大部分時間是 CPU 時間而不是等待磁碟 I/O。它使用了大約 100 GB RAM。

現在文件系統再次可用:

mount /dev/md$PRE /mnt/disk2

直到最後一切都sync還可以。只有在最後一次同步之後寫的東西是易碎的。

添加一些備件並進行重建。

明天現有磁碟的複製完成後,我將測試上述內容。如果它有效,那麼上面就是一個答案。否則將開始對原始集合進行新的複制,歡迎提出新的想法(但請在測試場景中進行測試)。

==

現在已添加備件並開始重建。每 1000 個文件都被複製到文件系統上的一個目錄中,這不會導致日誌出現問題。所以看起來文件系統沒問題。使用者是否錯過了一些文件還有待觀察。

==

到目前為止,沒有使用者報告失去的文件,所以它似乎工作。

引用自:https://serverfault.com/questions/443763