mdadm RAID5 隨機讀取錯誤。死盤?
首先長篇大論:
我在 Debian 9 上有一個帶有 mdadm 的 RAID5。該 Raid 有 5 個磁碟,每個 4TB 大小。其中 4 台是 HGST Deskstar NAS,後來出現的一台是東芝 N300 NAS。
在過去的幾天裡,我注意到該 Raid 中出現了一些讀取錯誤。例如,我有一個 10GB 的多部分 rar 存檔。當我嘗試提取時,某些部分出現 CRC 錯誤。如果我第二次嘗試,我會在其他部分得到這些錯誤。Torrents 和下載後的重新破解也會發生這種情況。
重新啟動後,我的 BIOS 發現 SATA 埠 3 上的 HGST 驅動器的 SMART 狀態不好。smartctl 對我說存在 DMA CRC 錯誤,但聲稱驅動器正常。
稍後再次重新啟動,我再也看不到 smart 中的 crc 錯誤了。但現在我得到了這個輸出
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.9.0-4-amd64] (local build) Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART overall-health self-assessment test result: FAILED! Drive failure expected in less than 24 hours. SAVE ALL DATA. Failed Attributes: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 5 Reallocated_Sector_Ct 0x0033 001 001 005 Pre-fail Always FAILING_NOW 1989
由於 HGST 不再適用於正常價格,我購買了另一台東芝 N300 來替換 HGST。兩者都標記為 4TB。我試圖製作一個完全相同大小的分區,但沒有奏效。分區程序聲稱我的數字太大(我用字節和扇區嘗試過)。所以我只是讓分區盡可能大。但是現在看起來大小一樣,我有點困惑。
sdc是舊的,sdh是新的
Disk /dev/sdc: 3,7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: gpt Disk identifier: 4CAD956D-E627-42D4-B6BB-53F48DF8AABC Device Start End Sectors Size Type /dev/sdc1 2048 7814028976 7814026929 3,7T Linux RAID Disk /dev/sdh: 3,7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 3A173902-47DE-4C96-8360-BE5DBED1EAD3 Device Start End Sectors Size Type /dev/sdh1 2048 7814037134 7814035087 3,7T Linux filesystem
目前我已將新的磁碟添加為備用磁碟。RAID 仍在使用舊驅動器。我仍然有一些讀取錯誤,尤其是在大文件上。
這是我的 RAID 目前的樣子:
/dev/md/0: Version : 1.2 Creation Time : Sun Dec 17 22:03:20 2017 Raid Level : raid5 Array Size : 15627528192 (14903.57 GiB 16002.59 GB) Used Dev Size : 3906882048 (3725.89 GiB 4000.65 GB) Raid Devices : 5 Total Devices : 6 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sat Jan 5 09:48:49 2019 State : clean Active Devices : 5 Working Devices : 6 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Name : SERVER:0 (local to host SERVER) UUID : 16ee60d0:f055dedf:7bd40adc:f3415deb Events : 25839 Number Major Minor RaidDevice State 0 8 49 0 active sync /dev/sdd1 1 8 33 1 active sync /dev/sdc1 3 8 1 2 active sync /dev/sda1 4 8 17 3 active sync /dev/sdb1 5 8 80 4 active sync /dev/sdf 6 8 113 - spare /dev/sdh1
而磁碟結構是這樣的
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 3,7T 0 disk └─sda1 8:1 0 3,7T 0 part └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume sdb 8:16 0 3,7T 0 disk └─sdb1 8:17 0 3,7T 0 part └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume sdc 8:32 0 3,7T 0 disk └─sdc1 8:33 0 3,7T 0 part └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume sdd 8:48 0 3,7T 0 disk └─sdd1 8:49 0 3,7T 0 part └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume sdf 8:80 1 3,7T 0 disk └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume sdh 8:112 1 3,7T 0 disk └─sdh1 8:113 1 3,7T 0 part └─md0 9:0 0 14,6T 0 raid5 └─storageRaid 253:4 0 14,6T 0 crypt └─vg_raid-raidVolume 253:5 0 14,6T 0 lvm /media/raidVolume
我有點困惑,備用磁碟(sdh)已經在加密卷中。
問題:
mdadm 在什麼條件下會說磁碟發生故障?
隨機讀取錯誤可以來自一個損壞的磁碟嗎?
當磁碟發送錯誤數據時,不會檢測到 raid 嗎?
當備用磁碟的大小不完全相同時,手動將磁碟標記為故障是否危險?
在我看來,MD raid 在淘汰磁碟方面過於保守。我總是在 syslog/dmesg 中觀察 ATA 異常(我設置 rsyslog 來通知我這些異常)。
我必須說我很驚訝您在應用程序級別遇到錯誤。RAID5 應該使用奇偶校驗資訊來檢測錯誤(編輯,顯然,它沒有;僅在驗證期間)。話雖如此,磁碟是否是原因,它是壞的。近 2000 個重新分配的扇區真的很糟糕。
分區可以更大,否則您也無法將它們添加為備用,但為了確保一切正常,您可以使用 fdisk、sfdisk 和 gdisk 複製分區表。你有 GPT,所以讓我們使用它的備份功能。如果這樣做
gdisk /dev/sdX
,您可以使用b
將分區表備份到磁碟。然後,在新磁碟上gdisk /dev/sdY
,您可以使用r
恢復選項,然後l
載入備份。然後你應該有一個相同的分區,所有mdadm --manage --add
命令都應該工作。(您需要在更改分區表之前從陣列中取出新磁碟)我實際上傾向於將這些備份分區表保留在伺服器上。它可以快速更換磁碟。
最後一條建議:不要使用 RAID5。具有如此巨大磁碟的 RAID5 很不穩定。您應該能夠添加磁碟並動態遷移到 RAID6。不知道我怎麼想的,但你可以穀歌一下。