Linux中國

在 Linux 下使用 RAID(八):當軟體 RAID 故障時如何恢復和重建數據

恢復並重建故障的軟體 RAID - 第8部分

在本文中,我們將討論當一個磁碟發生故障時如何重建軟體 RAID 陣列並且不會丟失數據。為方便起見,我們僅考慮RAID 1 的配置 - 但其方法和概念適用於所有情況。

RAID 測試方案

在進一步討論之前,請確保你已經配置好了 RAID 1 陣列,可以按照本系列第3部分提供的方法:在 Linux 中如何創建 RAID 1(鏡像)

在目前的情況下,僅有的變化是:

  1. 使用不同版本 CentOS(v7),而不是前面文章中的(v6.5)。
  2. 磁碟容量發生改變, /dev/sdb 和 /dev/sdc(各8GB)。

此外,如果 SELinux 設置為 enforcing 模式,你需要將相應的標籤添加到掛載 RAID 設備的目錄中。否則,當你試圖掛載時,你會碰到這樣的警告信息:

SELinux RAID Mount Error

啟用 SELinux 時 RAID 掛載錯誤

通過以下命令來解決:

# restorecon -R /mnt/raid1

配置 RAID 監控

存儲設備損壞的原因很多(儘管固態硬碟大大減少了這種情況發生的可能性),但不管是什麼原因,可以肯定問題隨時可能發生,你需要準備好替換髮生故障的部分,並確保數據的可用性和完整性。

首先建議是。雖然你可以查看 /proc/mdstat 來檢查 RAID 的狀態,但有一個更好的和節省時間的方法,使用監控 + 掃描模式運行 mdadm,它將警報通過電子郵件發送到一個預定義的收件人。

要這樣設置,在 /etc/mdadm.conf 添加以下行:

MAILADDR user@<domain or localhost>

我自己的設置如下:

MAILADDR gacanepa@localhost

RAID Monitoring Email Alerts

監控 RAID 並使用電子郵件進行報警

要讓 mdadm 運行在監控 + 掃描模式中,以 root 用戶添加以下 crontab 條目:

@reboot /sbin/mdadm --monitor --scan --oneshot

默認情況下,mdadm 每隔60秒會檢查 RAID 陣列,如果發現問題將發出警報。你可以通過添加 --delay 選項到crontab 條目上面,後面跟上秒數,來修改默認行為(例如,--delay 1800意味著30分鐘)。

最後,確保你已經安裝了一個郵件用戶代理(MUA),如mutt 或 mailx。否則,你將不會收到任何警報。

在一分鐘內,我們就會看到 mdadm 發送的警報。

模擬和更換髮生故障的 RAID 存儲設備

為了給 RAID 陣列中的存儲設備模擬一個故障,我們將使用 --manage--set-faulty 選項,如下所示:

# mdadm --manage --set-faulty /dev/md0 /dev/sdc1  

這將導致 /dev/sdc1 被標記為 faulty,我們可以在 /proc/mdstat 看到:

Stimulate Issue with RAID Storage

在 RAID 存儲設備上模擬問題

更重要的是,讓我們看看是不是收到了同樣的警報郵件:

Email Alert on Failed RAID Device

RAID 設備故障時發送郵件警報

在這種情況下,你需要從軟體 RAID 陣列中刪除該設備:

# mdadm /dev/md0 --remove /dev/sdc1

然後,你可以直接從機器中取出,並將其使用備用設備來取代(/dev/sdd 中類型為 fd 的分區是以前創建的):

# mdadm --manage /dev/md0 --add /dev/sdd1

幸運的是,該系統會使用我們剛才添加的磁碟自動重建陣列。我們可以通過標記 /dev/sdb1 為 faulty 來進行測試,從陣列中取出後,並確認 tecmint.txt 文件仍然在 /mnt/raid1 是可訪問的:

# mdadm --detail /dev/md0
# mount | grep raid1
# ls -l /mnt/raid1 | grep tecmint
# cat /mnt/raid1/tecmint.txt

Confirm Rebuilding RAID Array

確認 RAID 重建

上面圖片清楚的顯示,添加 /dev/sdd1 到陣列中來替代 /dev/sdc1,數據的重建是系統自動完成的,不需要干預。

雖然要求不是很嚴格,有一個備用設備是個好主意,這樣更換故障的設備就可以在瞬間完成了。要做到這一點,先讓我們重新添加 /dev/sdb1 和 /dev/sdc1:

# mdadm --manage /dev/md0 --add /dev/sdb1
# mdadm --manage /dev/md0 --add /dev/sdc1

Replace Failed Raid Device

取代故障的 Raid 設備

從冗餘丟失中恢複數據

如前所述,當一個磁碟發生故障時, mdadm 將自動重建數據。但是,如果陣列中的2個磁碟都故障時會發生什麼?讓我們來模擬這種情況,通過標記 /dev/sdb1 和 /dev/sdd1 為 faulty:

# umount /mnt/raid1
# mdadm --manage --set-faulty /dev/md0 /dev/sdb1
# mdadm --stop /dev/md0
# mdadm --manage --set-faulty /dev/md0 /dev/sdd1

此時嘗試以同樣的方式重新創建陣列就(或使用 --assume-clean 選項)可能會導致數據丟失,因此不到萬不得已不要使用。

讓我們試著從 /dev/sdb1 恢複數據,例如,在一個類似的磁碟分區(/dev/sde1 - 注意,這需要你執行前在/dev/sde 上創建一個 fd 類型的分區)上使用 ddrescue

# ddrescue -r 2 /dev/sdb1 /dev/sde1

Recovering Raid Array

恢復 Raid 陣列

請注意,到現在為止,我們還沒有觸及 /dev/sdb 和 /dev/sdd,它們的分區是 RAID 陣列的一部分。

現在,讓我們使用 /dev/sde1 和 /dev/sdf1 來重建陣列:

# mdadm --create /dev/md0 --level=mirror --raid-devices=2 /dev/sd[e-f]1

請注意,在真實的情況下,你需要使用與原來的陣列中相同的設備名稱,即設備失效後替換的磁碟的名稱應該是 /dev/sdb1 和 /dev/sdc1。

在本文中,我選擇了使用額外的設備來重新創建全新的磁碟陣列,是為了避免與原來的故障磁碟混淆。

當被問及是否繼續寫入陣列時,鍵入 Y,然後按 Enter。陣列被啟動,你也可以查看它的進展:

# watch -n 1 cat /proc/mdstat

當這個過程完成後,你就應該能夠訪問 RAID 的數據:

Confirm Raid Content

確認 Raid 數據

總結

在本文中,我們回顧了從 RAID 故障和冗餘丟失中恢複數據。但是,你要記住,這種技術是一種存儲解決方案,不能取代備份。

本文中介紹的方法適用於所有 RAID 中,其中的概念我將在本系列的最後一篇(RAID 管理)中涵蓋它。

如果你對本文有任何疑問,隨時給我們以評論的形式說明。我們期待傾聽閣下的心聲!

via: http://www.tecmint.com/recover-data-and-rebuild-failed-software-raid/

作者:Gabriel Cánepa 譯者:strugglingyouth 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國