器RAID存儲實(shí)戰(zhàn):從級別選擇到mdadm運(yùn)維指南)
提起 Linux 服務(wù)器的存儲RAID 這三個字母一定是繞不開的。從家里那臺兩塊盤的小主機(jī)到機(jī)房里動不動幾十塊盤的生產(chǎn)服務(wù)器RAID 都是一套被驗(yàn)證過無數(shù)遍的存儲技術(shù)落地方案。它要解決的核心問題其實(shí)很樸素既想讓多塊硬盤的容量加在一起、跑出更好的性能又想在某一兩塊盤突然出問題時(shí)數(shù)據(jù)不丟、服務(wù)不中斷。這篇文章就從 RAID 的級別選擇講起一直講到 mdadm 的創(chuàng)建、日常維護(hù)和故障處理適合剛接觸服務(wù)器運(yùn)維的朋友也適合那些已經(jīng)被 RAID 卡折騰過幾次、想系統(tǒng)梳理一遍的人。我寫這篇文章的底氣來自這些年實(shí)際維護(hù)過的機(jī)器從雙盤家用小機(jī)到幾十塊盤的生產(chǎn)存儲踩過的坑不少但也正因?yàn)槿绱讼旅嬷v的每一段都值得你花時(shí)間看完。1. 為什么還在用 RAID先搞清楚它到底解決什么問題1.1 RAID 不是什么黑魔法就是把多塊盤組織成一塊盤先別急著敲命令得先想明白一個問題現(xiàn)在 SSD 這么便宜單塊大容量盤也不是買不起為什么還要用 RAID真實(shí)原因是RAID 的價(jià)值不在于一塊大盤本身而在于它同時(shí)解決了兩件單塊盤做不到的事——容量疊加和故障冗余。RAID 的英文全稱是 Redundant Array of Independent Disks獨(dú)立磁盤冗余陣列。它通過一套邏輯把多塊物理硬盤統(tǒng)一管理起來對操作系統(tǒng)只暴露一個塊設(shè)備。也就是說你在 Linux 下看到的可能還是 /dev/md0 或 /dev/sda但底層數(shù)據(jù)實(shí)際分布在多塊盤上。數(shù)據(jù)按條帶、鏡像還是奇偶校驗(yàn)來分布就構(gòu)成了不同的 RAID 級別。很多新手最容易犯的錯是把 RAID 當(dāng)成備份方案。這是一個非常危險(xiǎn)的誤解。RAID 1 能扛住一塊盤故障RAID 6 能扛住兩塊盤故障但如果是誤刪文件、勒索病毒、火災(zāi)水淹RAID 一點(diǎn)辦法都沒有。RAID 的本質(zhì)是提高可用性不是數(shù)據(jù)備份。備份是另一套系統(tǒng)要做的事兩者不能互相替代。另外強(qiáng)調(diào)一點(diǎn)RAID 也并不天然提升一切性能。比如 RAID 1 在寫入時(shí)通常不會比單盤快太多RAID 5 因?yàn)橐?jì)算奇偶校驗(yàn)小文件隨機(jī)寫入反而可能比單盤還慢。所以選級別之前先搞清楚你的業(yè)務(wù)是順序讀寫多還是隨機(jī)讀寫多再往下聊。1.2 常見 RAID 級別對比0 / 1 / 5 / 6 / 10 到底怎么選先放一張我做運(yùn)維時(shí)經(jīng)常拿來參考的速查表看完再逐條解釋RAID 級別最低盤數(shù)可用容量容錯能力讀性能寫性能典型場景RAID 02總?cè)萘繜o高高臨時(shí)緩存、非關(guān)鍵數(shù)據(jù)RAID 12單盤容量允許壞 1 塊較高與單盤相當(dāng)系統(tǒng)盤、數(shù)據(jù)庫日志RAID 53(N-1) × 單盤允許壞 1 塊高中文件服務(wù)器、量大而容錯要求一般RAID 64(N-2) × 單盤允許壞 2 塊高低大容量存儲、歸檔RAID 104N/2 × 單盤每組允許壞 1 塊高高數(shù)據(jù)庫數(shù)據(jù)盤、虛擬化存儲RAID 0 把數(shù)據(jù)切成條帶輪流寫到每一塊盤上。兩塊盤合起來容量翻倍讀寫速度也接近翻倍但一塊盤壞數(shù)據(jù)就全沒了。它適合放一些丟了也無所謂的緩存數(shù)據(jù)或者能快速重建的業(yè)務(wù)數(shù)據(jù)。我不建議你把任何重要的系統(tǒng)數(shù)據(jù)放在 RAID 0 上。RAID 1 則是把同樣的數(shù)據(jù)完整寫到兩塊盤上也就是鏡像。兩塊盤的容量最終只有一塊盤可用但任意一塊盤壞掉另一塊盤還能繼續(xù)扛著。老牌生產(chǎn)環(huán)境里系統(tǒng)盤用 RAID 1 是最穩(wěn)妥的選擇。它的寫性能受限于單盤讀性能因?yàn)榭梢詢啥送瑫r(shí)讀通常會比單盤好一些。RAID 5 在數(shù)據(jù)塊之外增加了奇偶校驗(yàn)塊校驗(yàn)塊輪流分散存在各塊盤上。N 塊盤組成 RAID 5可用容量是 N-1 塊盤因?yàn)槠渲幸粔K盤的容量用來存放校驗(yàn)信息。當(dāng)一塊盤壞掉時(shí)系統(tǒng)能靠其他盤的數(shù)據(jù)和校驗(yàn)塊反推出丟失的數(shù)據(jù)但重建時(shí) CPU 和磁盤 IO 壓力都會明顯上升這段時(shí)間如果再壞一塊盤整個陣列就廢了。RAID 6 相當(dāng)于做了兩次校驗(yàn)允許同時(shí)壞兩塊盤安全性比 RAID 5 高一截代價(jià)是可用容量變成 N-2 塊盤而且寫入時(shí)要算兩次校驗(yàn)性能下降得比較明顯。需要大容量、又擔(dān)心重建期間二次故障的場景可以考慮它。RAID 10 是把鏡像和條帶結(jié)合先把盤兩兩做成鏡像再把多組鏡像做成條帶。最少需要 4 塊盤可用容量是總?cè)萘康囊话氲蒎e能力和性能都很均衡尤其適合數(shù)據(jù)庫這種對隨機(jī)寫特別敏感的場景。我自己的經(jīng)驗(yàn)是如果不差盤數(shù)據(jù)庫數(shù)據(jù)盤能上 RAID 10 就別猶豫。最后補(bǔ)一句RAID 5 和 RAID 6 對盤的容量一致性要求很高?;煊貌煌萘炕虿煌D(zhuǎn)速的盤不是不行但陣列容量按最小盤算重建也容易被慢盤拖累。有條件的話同一組陣列盡量用同批次、同型號、同容量的盤。2. 硬 RAID 還是軟 RAID機(jī)器上的盤該交給誰管2.1 硬 RAID 卡服務(wù)器上那塊獨(dú)立的陣列卡硬 RAID 意味著有一個獨(dú)立的物理設(shè)備也就是 RAID 卡它上面有自己的處理器ROC和緩存用來完成條帶化、奇偶校驗(yàn)計(jì)算和寫緩存管理。操作系統(tǒng)看到的只是一個已經(jīng)組合好的邏輯磁盤不需要知道底層細(xì)節(jié)。硬 RAID 卡的好處是性能穩(wěn)定尤其是帶電池或閃存保護(hù)的回寫緩存能在斷電時(shí)把還沒有落盤的寫入數(shù)據(jù)保護(hù)起來。生產(chǎn)服務(wù)器上很常見的 LSI / MegaRAID 系列、Broadcom 新一點(diǎn)的 95xx 系列都屬于這一類。管理這類卡時(shí)會用到廠商工具很多管理員都熟悉的 storcli 就是其中一種命令大概長這樣storcli /c0 show all storcli /c0 /eall /sall show storcli /c0 add vd typeraid1 drives252:0,252:1第一條命令看控制卡整體狀態(tài)第二條看物理盤狀態(tài)第三條創(chuàng)建 RAID 1 虛擬磁盤。硬 RAID 一旦配好在 Linux 里通常不需要額外驅(qū)動系統(tǒng)直接識別出 /dev/sda 這樣的設(shè)備。日常監(jiān)控我一般看 megaraid 相關(guān)的日志以及 storcli 輸出里的 State 字段里面出現(xiàn) Dgrd 就要警惕了。2.2 Linux 軟 RAIDmdraid的取舍軟 RAID 則是由操作系統(tǒng)用軟件來實(shí)現(xiàn)的 RAID 功能。Linux 內(nèi)核自帶的 mdraid多重設(shè)備驅(qū)動是最常見的軟 RAID 方案它不需要額外硬件直接利用 CPU 和內(nèi)存完成奇偶校驗(yàn)等計(jì)算。很多運(yùn)維看不起軟 RAID覺得軟的就是性能差。但 mdraid 這些年其實(shí)做得相當(dāng)成熟內(nèi)置的 RAID 1、RAID 5、RAID 6、RAID 10 都能支持而且管理工具 mdadm 的命令行設(shè)計(jì)得很舒服。對大多數(shù)中小型業(yè)務(wù)來說CPU 算力完全不是瓶頸真正決定性能的還是物理盤的 IO 能力。實(shí)驗(yàn)室、虛擬機(jī)環(huán)境、沒有 RAID 卡的普通服務(wù)器我都是直接用 mdraid。它的一個隱藏優(yōu)點(diǎn)是遷移性好——Linux 內(nèi)核版本差距不太大的機(jī)器之間整塊陣列可以拆下來搬到另一臺機(jī)器上重新組裝而硬 RAID 卡往往跟服務(wù)器型號綁定換平臺時(shí)兼容性容易出問題。選擇軟 RAID 前也要想清楚幾件事一是操作系統(tǒng)必須能從內(nèi)核層識別陣列所以 /boot 這種啟動分區(qū)如果放在 RAID 5 上引導(dǎo)階段可能會有額外麻煩二是 CPU 負(fù)載會略高一些但現(xiàn)代 CPU 算 RAID 5 的校驗(yàn)基本沒什么感覺三是寫緩存由系統(tǒng)內(nèi)存承擔(dān)不像硬 RAID 卡那樣有獨(dú)立斷電保護(hù)所以更要加強(qiáng) UPS 的配置。2.3 storcli 設(shè)置 RAID 模式時(shí)幾個容易忽略的細(xì)節(jié)現(xiàn)在很多新服務(wù)器出廠時(shí)RAID 卡默認(rèn)可能是 JBOD 模式也有一些是 VMD 控制器直通模式。如果你想用獨(dú)立 RAID 卡做硬 RAID就需要先進(jìn)到 BIOS 里的 RAID 卡配置界面或者用 storcli 這類工具把盤切換成 RAID capable 模式再創(chuàng)建虛擬磁盤。用 storcli 時(shí)最容易踩的坑是按錯盤符控制器。服務(wù)器通常有兩個控制器一個管前面板一個管后面板命令里如果把 /c0 寫成 /c1就可能操作到完全意想不到的磁盤組。我還有一次因?yàn)槁┘恿?write-back 策略陣列創(chuàng)建之后寫性能始終上不去后來才發(fā)現(xiàn)默認(rèn)可能是 write-through。硬 RAID 里這兩者的差別很大帶緩存的卡通常建議 write-back always 回寫策略前提是你確認(rèn)斷電保護(hù)模塊是正常的。創(chuàng)建完虛擬磁盤后別忘了在 Linux 里重新掃描設(shè)備或者干脆重啟系統(tǒng)。很多機(jī)器在 RAID 卡創(chuàng)建完 VD 后操作系統(tǒng)不會立刻感知到新磁盤必須要 rescan 或 reboot。我自己的習(xí)慣是配完陣列重啟一次看到所有盤都正確識別了再繼續(xù)做系統(tǒng)安裝這一步能省掉后面很多莫名其妙的麻煩。3. 用 mdadm 從零搭建一套軟 RAID 陣列3.1 動手前先盤好硬盤布局用 mdadm 做 RAID 之前我強(qiáng)烈建議先花幾分鐘把磁盤布局規(guī)劃清楚而不是直接對著兩塊空盤就開始敲命令。需要想清楚的有三件事用哪些盤做陣列、系統(tǒng)盤和數(shù)據(jù)盤是否分開、每塊盤的分區(qū)表怎么建。系統(tǒng)盤和數(shù)據(jù)盤盡量分開。系統(tǒng)盤單獨(dú)一塊 SSD 或一組 RAID 1 就夠用了數(shù)據(jù)盤再單獨(dú)組成 RAID 5 或 RAID 10這樣系統(tǒng)出問題時(shí)不會牽連數(shù)據(jù)陣列數(shù)據(jù)陣列重建時(shí)也不會拖垮系統(tǒng) IO。很多人圖省事把所有盤塞到一個 RAID 組里結(jié)果系統(tǒng)負(fù)載一高就互相影響。磁盤分區(qū)方面我一般習(xí)慣在整塊盤上建一個分區(qū)或者直接用整盤然后用分區(qū)作為 RAID 成員。比如 /dev/sdb 上只建一個分區(qū) /dev/sdb1類型設(shè)為 Linux RAID auto。分區(qū)的好處是將來如果和 UEFI 引導(dǎo)、LVM 結(jié)合靈活性會更高。不過實(shí)際操作中直接用整塊 /dev/sdb 的情況也很普遍尤其盤數(shù)量多的時(shí)候會省不少事。還要留意盤中是否殘留了之前的 MD 元數(shù)據(jù)和分區(qū)信息。新的空盤可能干凈但做過陣列的盤拿出來復(fù)用的時(shí)候很容易帶著舊信息導(dǎo)致 mdadm 組裝時(shí)認(rèn)錯。穩(wěn)妥起見復(fù)用舊盤時(shí)先把盤徹底清一遍wipefs -a /dev/sdb sgdisk -Z /dev/sdbwipefs -a會清掉文件系統(tǒng)、RAID 元數(shù)據(jù)和分區(qū)表簽名sgdisk -Z是清 GPT 主表。這兩步做完再開始創(chuàng)建陣列能避免 90% 以上的莫名奇怪問題。3.2 創(chuàng)建 RAID 1最穩(wěn)妥的雙盤方案我先拿 RAID 1 演示一次完整流程因?yàn)樗撬悸纷钪庇^、也最不容易出錯的級別。假設(shè)有兩塊新盤 /dev/sdb、/dev/sdc先確認(rèn)它們的容量和狀態(tài)lsblk fdisk -l /dev/sdb /dev/sdc確認(rèn)無誤后創(chuàng)建 RAID 1mdadm --create /dev/md0 --level1 --raid-devices2 /dev/sdb /dev/sdc這里可以加--metadata1.2指定元數(shù)據(jù)版本。mdadm 默認(rèn)用的就是 1.2元數(shù)據(jù)放在盤的起始位置附近現(xiàn)代系統(tǒng)都用這個版本。創(chuàng)建命令執(zhí)行后mdadm 會問你是否確認(rèn)輸入 y 回車。注意這里有一個看似嚇人的警告它提示分區(qū)表會被擦除這是正常現(xiàn)象。創(chuàng)建完成后立即查看狀態(tài)cat /proc/mdstat你會看到類似[UU]的標(biāo)記表示兩塊盤都是 healthy。但此時(shí)陣列其實(shí)還在初始同步也就是把 sdb 的數(shù)據(jù)鏡像到 sdc需要等它 100% 完成才算真正建好。同步期間系統(tǒng)可以正常使用但不要在這個節(jié)骨眼重啟服務(wù)器。接著格式化并掛載mkfs.ext4 /dev/md0 mkdir /mnt/data mount /dev/md0 /mnt/data為了開機(jī)自動掛載編輯 /etc/fstab 加一行注意用 UUID 而不是設(shè)備名因?yàn)樵O(shè)備名在重啟后可能變化。先查出陣列的 UUIDblkid /dev/md0然后類似這樣寫入 fstabUUIDxxxx-xxxx-xxxx /mnt/data ext4 defaults,noatime 0 2寫錯了 fstab 會導(dǎo)致開機(jī)卡在 mount 階段所以強(qiáng)烈建議寫完跑一下mount -a驗(yàn)證。3.3 創(chuàng)建 RAID 5 和 RAID 10容量、性能、冗余的平衡RAID 5 最少要 3 塊盤RAID 10 最少要 4 塊盤。創(chuàng)建命令也差不多只是 level 和 raid-devices 不同。我以 3 塊 2TB 盤做 RAID 5 為例mdadm --create /dev/md0 --level5 --raid-devices3 /dev/sdb /dev/sdc /dev/sdd --chunk64--chunk是條帶塊大小決定了數(shù)據(jù)如何切分。64K 是比較通用的默認(rèn)值數(shù)據(jù)庫類隨機(jī)讀寫可以用 16K~32K大視頻文件順序讀寫可以用 256K。創(chuàng)建 RAID 5 時(shí)初始同步時(shí)間明顯比 RAID 1 長因?yàn)橐?jì)算校驗(yàn)數(shù)據(jù)。你可以用--assume-clean跳過初始同步但我自己只有在暫時(shí)沒有重要數(shù)據(jù)、又想立刻投入測試的實(shí)驗(yàn)室環(huán)境才這么干生產(chǎn)環(huán)境請老老實(shí)實(shí)等同步結(jié)束。RAID 10 的創(chuàng)建命令是這樣mdadm --create /dev/md0 --level10 --raid-devices4 /dev/sdb /dev/sdc /dev/sdd /dev/sdeRAID 10 不需要指定鏡像配對mdadm 默認(rèn)會自動安排布局。如果你有特殊要求可以用--layout參數(shù)控制。默認(rèn)的布局對大多數(shù)場景都合適。RAID 10 在 RAID 10 世界里有一個非常好的特性它既借鑒了 RAID 0 的條帶性能又保留了 RAID 1 的冗余是很多生產(chǎn)環(huán)境的首選。創(chuàng)建完成后不管哪個級別都要把陣列配置寫入系統(tǒng)配置文件否則重啟后系統(tǒng)無法自動識別。這也是新手最容易漏掉的一步。3.4 配置自動組裝讓陣列重啟后還能找回來mdadm 的陣列信息默認(rèn)只存在于磁盤的元數(shù)據(jù)里系統(tǒng)啟動時(shí)需要有機(jī)制來掃描并組裝這些陣列。這個機(jī)制依賴 /etc/mdadm.conf 配置文件。生成配置很簡單mdadm --detail --scan /etc/mdadm.conf然后查看一下內(nèi)容是否包含 ARRAY 行。更穩(wěn)妥的做法是同時(shí)更新 initramfs讓系統(tǒng)在引導(dǎo)階段就能識別陣列update-initramfs -u不同的發(fā)行版命令略有差異CentOS/RHEL 系是dracut --forceDebian/Ubuntu 系是update-initramfs -u。別忘了執(zhí)行完之后重啟一次測試確認(rèn)陣列能自動組裝成 /dev/md0而不是變成 /dev/md127 這類自動命名設(shè)備。如果系統(tǒng)將陣列識別成 md127 而不是你期望的名字可以在 mdadm.conf 里給你的陣列固定一個 name或者用 UUID 關(guān)聯(lián)配置。這是我在實(shí)際運(yùn)維里至少見過十幾次的問題早點(diǎn)處理能省很多事。4. 陣列日常管理與狀態(tài)監(jiān)控4.1 查看陣列狀態(tài)的幾個關(guān)鍵命令陣列建好后不可能一直不管。我日常最常看的三個命令是cat /proc/mdstat、mdadm --detail /dev/md0和smartctl。cat /proc/mdstat是最快的狀態(tài)窗口幾行信息就能看出陣列是否健康、當(dāng)前是否在同步或者重建。如果看到[UU_U]這種帶下劃線的標(biāo)記說明有一塊盤掉線了需要立刻處理。下述這種輸出就是典型的降級狀態(tài)Personalities : [raid1] md0 : active raid1 sdc[1] sdb[0] 8381440 blocks super 1.2 [2/2] [UU]方括號里的 [UU] 表示兩塊盤都在線如果出現(xiàn)[U_]表示第二塊盤有問題。這里要養(yǎng)成習(xí)慣看到 [U_] 不要慌也不要急著拔盤先看完整日志再決定操作。mdadm --detail /dev/md0會輸出完整的陣列信息包括成員盤、設(shè)備角色、重建進(jìn)度、塊大小等。我最關(guān)心的是State: clean和Devices兩行。如果 State 里出現(xiàn) degraded就要準(zhǔn)備找替換盤了。smartctl /dev/sdb -a用于查看物理盤的健康度。RAID 層正常不等于物理盤沒有隱患SMART 里的 Reallocated_Sector_Ct、Current_Pending_Sector 這類指標(biāo)能提前暴露壞道風(fēng)險(xiǎn)。我每周末跑一次全盤 SMART 巡檢基本能避免完全沒有預(yù)兆的故障。4.2 模擬一塊盤故障降級、熱備、重建光會創(chuàng)建不代表會用最好在正式環(huán)境之前演練一遍故障恢復(fù)流程。mdadm 支持手動模擬故障mdadm --fail /dev/md0 /dev/sdb執(zhí)行后 /proc/mdstat 會顯示[U_]或[_U]表明陣列進(jìn)入降級模式。這時(shí)業(yè)務(wù)還可以繼續(xù)跑但已經(jīng)失去冗余保護(hù)需要盡快更換故障盤。先移除故障盤mdadm --remove /dev/md0 /dev/sdb然后插入新盤或者把之前備用的盤加進(jìn)來mdadm --add /dev/md0 /dev/sde系統(tǒng)會自動開始重建重建進(jìn)度可以這樣觀察watch cat /proc/mdstat重建期間陣列性能會有明顯下降尤其是 RAID 5/6奇偶校驗(yàn)計(jì)算加同步 IO 會讓整組盤都很忙。我的建議是非緊急情況下盡量選業(yè)務(wù)低峰期做換盤操作重建沒完成之前不要再碰組里的其他盤。曾有同事在重建到一半時(shí)魯莽地重啟機(jī)器結(jié)果第二塊盤也失去同步最終數(shù)據(jù)全部丟失這個教訓(xùn)實(shí)在深刻。4.3 在線擴(kuò)容與 RAID 級別遷移mdadm 支持的另一個實(shí)用功能是在線擴(kuò)容不必停機(jī)就能把更多盤加進(jìn)現(xiàn)有陣列。比如一個 RAID 5 原本 3 塊盤想擴(kuò)容到 4 塊盤mdadm --add /dev/md0 /dev/sde mdadm --grow /dev/md0 --raid-devices4擴(kuò)容過程中mdadm 會重新布局所有數(shù)據(jù)這是一個比較耗時(shí)的重排過程期間陣列性能會下降但業(yè)務(wù)不用停。擴(kuò)容完成后文件系統(tǒng)還要跟著擴(kuò)展。ext4 用resize2fs /dev/md0XFS 用xfs_growfs /mnt/data否則你會發(fā)現(xiàn)陣列容量增加了文件系統(tǒng)仍然停留在原來的大小。RAID 級別遷移也是可行的比如從 RAID 1 遷移到 RAID 5但整套流程比擴(kuò)容復(fù)雜得多而且每步操作中間陣列都處于脆弱狀態(tài)。我建議如果不是特別必要別在生產(chǎn)環(huán)境做級別遷移。相比之下備份數(shù)據(jù)、重建新陣列、再導(dǎo)回?cái)?shù)據(jù)這個方案雖然要停機(jī)但可控性高很多。4.4 定期巡檢與性能觀察陣列不是配好就能一勞永逸我習(xí)慣把巡檢形成固定周報(bào)。巡檢內(nèi)容基本就是這三塊陣列狀態(tài)、物理盤健康度、性能基線。陣列狀態(tài)檢查包括看 /proc/mdstat 是否所有成員盤都在線mdadm --detail 輸出的 State 是否為 clean以及是否有 background resync 在跑。物理盤健康度我上面說了用 smartctl 看 SMART 屬性尤其關(guān)注壞道重映射和待處理扇區(qū)數(shù)這兩個數(shù)值只要不是 0就要開始準(zhǔn)備換盤了。性能基線比較有意思。我會在陣列剛建立、數(shù)據(jù)還不多的時(shí)候記錄一組基礎(chǔ) IO 數(shù)據(jù)之后每個月跑一遍同樣的測試做對比。用的工具是 fiofio --nameraidtest --rwrandrw --size2G --numjobs4 --runtime60 --group_reporting如果發(fā)現(xiàn)同樣測試條件下延遲或吞吐下降超過 20%就有理由懷疑有盤開始出問題了即便 SMART 還沒報(bào)錯。這種提前量感在運(yùn)維里往往比事后修復(fù)更值錢。5. 常見故障與排查實(shí)戰(zhàn)5.1 重啟后陣列識別不了這是我見過最多的問題之一。重啟后lsblk里看不到 /dev/md0或者看到的設(shè)備名變成了 /dev/md127業(yè)務(wù)掛載失敗。第一個排查點(diǎn)是 /etc/mdadm.conf 里是否有對應(yīng)的 ARRAY 記錄。如果沒有用mdadm --detail --scan掃描當(dāng)前磁盤上的元數(shù)據(jù)把輸出追加到配置文件。第二個排查點(diǎn)是 initramfs 有沒有更新很多發(fā)行版在修改 mdadm.conf 后必須重新生成 initramfs否則引導(dǎo)階段內(nèi)核壓根找不到 RAID 設(shè)備。如果設(shè)備名變了還有一招手動指定名字組裝。先停止自動命名的設(shè)備再用名字重新生成mdadm --stop /dev/md127 mdadm --assemble /dev/md0 /dev/sdb /dev/sdc這個操作要求你對陣列里的成員盤有把握別把別的盤加進(jìn)來。組裝前用mdadm --examine /dev/sdb檢查盤上的元數(shù)據(jù)確認(rèn)確實(shí)是同一組陣列的成員。5.2 陣列降級了怎么辦陣列進(jìn)入 degraded 狀態(tài)后第一反應(yīng)不應(yīng)該是立刻--remove故障盤。正確的順序是先搞清楚是哪塊盤出問題以及是邏輯故障還是物理故障。mdadm --detail /dev/md0 dmesg | tail -n 20dmesg 里往往能看到 I/O error、ATA bus error 這類信息。如果只是偶發(fā)錯誤盤本身 SMART 還正??梢試L試把這塊盤重新加回陣列重建一次再觀察是否復(fù)發(fā)。如果 SMART 已經(jīng)顯示大量壞道或 pending sectors那就果斷換盤。這里要特別強(qiáng)調(diào)降級狀態(tài)持續(xù)越久風(fēng)險(xiǎn)越大。RAID 5 在降級狀態(tài)下如果第二塊盤再出問題整個陣列的數(shù)據(jù)就全完蛋了。如果手頭有熱備盤也就是創(chuàng)建陣列時(shí)通過--spare-devices1預(yù)留的空盤故障時(shí)陣列會自動用熱備盤頂替不需要人工添加。這個功能對生產(chǎn)環(huán)境非常實(shí)用但前提是熱備盤別設(shè)了太舊的型號免得重建速度跟不上。5.3 誤操作把成員盤摘了還有一種常見情況來自操作失誤本來想停掉某個 LVM結(jié)果誤把 RAID 成員盤執(zhí)行了mdadm --remove甚至直接拔了盤。這時(shí)候千萬不要自動重建先停手分析。如果只是從陣列里 remove 了盤盤上的數(shù)據(jù)實(shí)際上沒有立刻被覆蓋用mdadm --examine還能看到元數(shù)據(jù)??梢栽囍匦绿砑踊貋碛|發(fā)重建或 re-addmdadm --re-add /dev/md0 /dev/sdb--re-add只適用于盤剛被移除、且數(shù)據(jù)沒有大變動的場景。如果移除后已經(jīng)很長時(shí)間沒有寫入re-add 成功概率很高。如果陣列已經(jīng)用其他盤重建過了那舊盤加回來反而會造成問題別再折騰它了數(shù)據(jù)恢復(fù)只能靠備份。拔盤比 remove 還要復(fù)雜一些因?yàn)楸P上元數(shù)據(jù)可能還標(biāo)記為故障或 missing。這種情況我會先mdadm --stop /dev/md0再mdadm --assemble --scan讓系統(tǒng)重新識別幸運(yùn)的話能自動恢復(fù)位置。這種操作屬于經(jīng)驗(yàn)運(yùn)氣并存沒有萬全的招所以日常一定把 mdadm.conf 和陣列成員列表備份好越詳細(xì)越好。5.4 故障排查速查表為了讓你在實(shí)際出問題時(shí)能快速定位我整理了一張速查表現(xiàn)象可能原因先執(zhí)行的命令下一步/proc/mdstat 顯示 [U_]某成員盤故障或掉線mdadm --detail /dev/md0檢查 dmesg、SMART確認(rèn)是否換盤重啟后沒有 /dev/md0mdadm.conf 缺失或 initramfs 未更新mdadm --examine /dev/sd*重新生成配置并更新 initramfs重建速度極慢盤性能差或陣列被業(yè)務(wù)持續(xù)占用cat /proc/mdstat調(diào)整重建優(yōu)先級--write-behind或錯峰重試掛載時(shí)報(bào)設(shè)備不存在設(shè)備名變了或被 stop 了lsblk; mdadm --assemble --scan檢查 fstab 是否用了 UUID 掛載寫性能驟降RAID 5/6 正在同步或校驗(yàn)出錯mdadm --detail /dev/md0等待同步完成排查是否有盤降速這塊表我貼過幾次很多人照著做就能救回陣列。說到底RAID 故障不可怕可怕的是不知道當(dāng)前陣列處于什么狀態(tài)、下一步該干嘛。把基礎(chǔ)的幾招練熟練大多數(shù)問題都能在半小時(shí)內(nèi)解決。6. 幾個過來人才懂的坑與心得6.1 別在陣列里混用盤型SSD 和 HDD 混組 RAID 是我見過最不合理的做法之一。SSD 和 HDD 的 IO 能力差距太大組進(jìn)同一個 RAID 5 后整個陣列會被慢速盤拖后腿而且重建時(shí)因?yàn)閮蛇吽俣炔钐嗪苋菀壮霈F(xiàn)同步超時(shí)。同類盤混用不同容量也不行我的原則就是一個陣列只用一批產(chǎn)品、同一型號、同一容量。如果確實(shí)需要速度容量兼顧不如用兩層方案上層用 SSD 做緩存池或者 LVM 緩存下層用 HDD 做 RAID 6。這個方法代價(jià)高一些但遠(yuǎn)比混組一個怪陣列更穩(wěn)。倉庫里做大規(guī)模存儲的同事都深有體會混盤一時(shí)爽重建火葬場。6.2 RAID 不是備份這套話我逢人就想說之前也提過但這里值得再展開一點(diǎn)。RAID 1 可以在壞一塊盤時(shí)繼續(xù)跑RAID 6 可以壞兩塊盤但如果是數(shù)據(jù)庫結(jié)構(gòu)被誤刪、文件被加密勒索、機(jī)房斷電導(dǎo)致文件系統(tǒng)損壞RAID 本身一點(diǎn)都救不了你。我自己的服務(wù)器上始終保留一份異地備份RAID 陣列只是第一道防線備份才是最終兜底。再補(bǔ)一句RAID 1 上做同步備份時(shí)磁盤故障和誤刪除可以同時(shí)帶崩生產(chǎn)數(shù)據(jù)和最近的備份副本所以備份至少保持多版本起碼留幾天的歷史快照。這些話雖然老生常談但每次 RAID 事故復(fù)盤時(shí)最后都會落回到備份問題。6.3 定期做一次恢復(fù)演練我見過不少團(tuán)隊(duì)RAID 陣列配得漂漂亮亮監(jiān)控告警一應(yīng)俱全但從沒實(shí)際演練過盤壞了一塊的完整恢復(fù)流程。等到真出了事故第一反應(yīng)往往是查文檔、問群里人怎么修寶貴的恢復(fù)時(shí)間就這樣白白浪費(fèi)掉了。每個月抽一個小時(shí)在測試機(jī)或者虛擬機(jī)里模擬一次故障盤替換、陣列重新組裝成本極低收益極高。如果你愿意還可以把演練記錄整理成文檔下次團(tuán)隊(duì)接手時(shí)直接照著跑。因?yàn)?mdadm 的操作相對直觀只要你熟悉了這套流程生產(chǎn)環(huán)境真出事的時(shí)候你就有底氣說我先換盤陣列降級頂住而不是慌慌張張拔電源。我在實(shí)際運(yùn)維中體會最深的一點(diǎn)是RAID 方案本身已經(jīng)非常成熟真正的風(fēng)險(xiǎn)往往來自人的疏忽和操作不當(dāng)。每次動手前多確認(rèn)一遍盤符每次重建前先看準(zhǔn)狀態(tài)每次換盤后仔細(xì)確認(rèn)同步完成這些看似瑣碎的好習(xí)慣才是讓存儲系統(tǒng)長期穩(wěn)定運(yùn)行的關(guān)鍵。