
1. RAID是什么為什么搞服務器的都繞不開它1.1 從一個真實的裝機現場說起前兩天幫朋友調試一臺新到的服務器開機自檢一過我就直接按了啟動快捷鍵進RAID卡配置界面。站在旁邊的兄弟有點懵問了一句這玩意不是裝完系統再弄嗎這其實是很多剛接觸服務器運維的人最容易踩的坑。RAID獨立磁盤冗余陣列Redundant Array of Independent Disks是服務器在安裝操作系統之前就要規劃好的底層存儲方案不是系統裝完之后的軟件設置。你可以把它理解成給多塊物理硬盤組隊的過程——每塊盤負責一部分工作有的管速度有的管備份有的管校驗。組隊方式不同最終表現出來的性能、容量和數據安全性也完全不同。我見過太多因為RAID沒規劃好而出事的情況有人圖省事把四塊盤全組成了RAID0結果一塊盤掛了整個服務器的數據全部歸零哭都沒地方哭也有人明明有八塊盤卻保守地兩兩組成RAID1空間利用率直接砍半性能和容量都虧了。所以搞清楚每種RAID級別到底在干什么是搞服務器運維的基本功。這篇文章我把RAID0、RAID1、RAID5、RAID6、RAID10、RAID01以及軟RAID和硬RAID全部掰開揉碎講一遍后面還會附上我實際配置服務器的完整流程和踩坑記錄爭取讓看完的朋友能直接上手操作。1.2 RAID到底做了什么三個核心動作RAID的核心動作說穿了就三件事條帶化、鏡像、校驗。條帶化是把數據切成小塊分別寫到不同的硬盤上。這個過程類似你把一本書拆成十幾個章節分給十幾個人同時翻譯總速度自然快了很多。RAID0就是純條帶化把所有盤綁在一起提速但沒有任何額外保護。鏡像則是把同一份數據同時寫到兩塊盤上。一塊盤壞了另一塊還有完整副本相當于給數據上了個雙保險。RAID1的基礎就是鏡像。校驗是生成額外的校驗信息當某塊盤損壞時系統可以依靠其他盤上的數據加校驗信息用算法反推出丟失的數據從而實現數據恢復。理解這三個動作后面再看RAID級別就輕松了。因為RAID0、1、5、6這些級別本質上就是這三個動作的不同組合和側重。1.3 必須搞清楚的幾個底層概念條帶深度Stripe Depth每次寫入單個磁盤的數據塊大小常見的有64KB、128KB、256KB。條帶深度設置得小適合大量小文件隨機讀寫設置得大適合大文件順序讀寫。默認值通常是128KB或256KB。熱備盤Hot Spare陣列里專門留一塊空閑硬盤平時不參與讀寫一旦有成員盤損壞它自動頂替上去進行重建減少了人工干預的時間。重建Rebuild陣列中某塊盤出問題后系統根據其他盤的數據和校驗信息把缺失的數據重新計算并寫入新盤的過程。這個過程會占用大量IO資源耗時比較長期間陣列性能會明顯下降。寫懲罰Write Penalty帶校驗的RAID級別RAID5、RAID6在寫入數據時需要額外的讀改寫操作造成實際寫入效率低于理論值。RAID5的寫懲罰是4次IORAID6是6次IO這也是它們在隨機寫入場景下性能不如RAID10的原因之一。搞清楚這些概念之后你再看下面各RAID級別的比較思路會清晰非常多。2. RAID級別逐一拆解RAID0、1、5、6、10、01怎么選2.1 RAID0只追求速度數據裸奔RAID0是最簡單也是最瘋狂的級別它把兩塊或更多硬盤組合成一個更大的邏輯卷所有數據條帶化分布到每塊盤上。優點讀寫性能最強總帶寬基本等于所有磁盤帶寬之和順序讀寫提升非常明顯。空間利用率100%N塊盤就能用N塊盤的總容量。缺點完全沒有冗余能力。任意一塊盤損壞整個陣列的數據全部丟失。可靠性等于所有磁盤可靠性的乘積盤越多整體可靠性越低。8塊盤的RAID0年故障率差不多是單盤故障率的8倍。適用場景臨時性的性能測試環境、游戲緩存服務器、對數據不敏感且追求極致速度的場景。生產環境我強烈不建議用RAID0尤其是數據庫、代碼倉庫這類地方。2.2 RAID1雙倍保險代價是容量減半RAID1至少需要兩塊盤數據同時寫入兩塊盤形成一對孿生兄弟。兩塊盤的內容完全一致任何一塊都能獨立支撐讀取。優點寫入性能略低于單盤因為要寫兩份但讀取性能可以提升因為兩塊盤可以同時響應不同的讀請求。容錯能力強允許一塊盤完全損壞而不丟數據換上新的空盤后系統自動重建。技術簡單重建速度快沒有校驗計算的開銷。缺點空間利用率只有50%。比如兩塊4TB的盤做RAID1實際可用還是4TB而不是8TB。擴容不方便升級容量時經常要成對更換硬盤。適用場景操作系統盤、關鍵配置目錄、中小型數據庫日志文件等。很多服務器默認把系統盤做成兩個SSD的RAID1就是這個道理——系統盤損壞頂多影響系統啟動但重建非常方便而且容量需求不大浪費不了多少空間。2.3 RAID5性價比之王RAID5至少需要三塊盤既做條帶化又產生一份分布式校驗信息。校驗信息不是集中在某一塊盤上而是輪流分散在各塊盤中這樣沒有哪塊盤會變成專門的校驗盤成為瓶頸。優點空間利用率是N-1/N三塊4TB盤實際可用約8TB比RAID1節省了一半空間成本。讀取性能接近RAID0的條帶化效果。允許一塊盤損壞數據不丟換上熱備盤或新盤后自動重建。缺點寫入性能受制于校驗計算隨機寫入場景下存在寫懲罰性能比RAID10弱。只允許壞一塊盤。如果重建過程中又有第二塊盤損壞數據會全丟。尤其要注意大容量盤的RAID5重建時間很長期間風險較高。控制器CPU會額外消耗在XOR校驗計算上低端陣列卡做RAID5會明顯感覺性能受限。適用場景文件服務器、視頻存儲、大部分中小型業務系統。RAID5是應用最廣泛的級別綜合了性能、容量和安全性。2.4 RAID6允許壞兩塊盤RAID6可以看成是RAID5的升級版至少需要四塊盤產生了雙重分布式校驗。即使同時損壞兩塊盤數據依然安全。優點容錯能力強允許同時壞兩塊盤。在大容量硬盤時代單盤8TB、12TB甚至更高RAID6比RAID5安全得多。因為大容量盤重建時間動輒十幾個小時甚至幾天期間再壞一塊的概率不可忽視。缺點空間利用率只有N-2/N四塊4TB盤實際可用只有8TB容量虧了一半。寫入性能進一步下降寫懲罰達到6次IO隨機寫入場景下性能明顯偏低。控制器開銷比RAID5更大。適用場景大容量存儲服務器、備份服務器、視頻監控存儲、NAS系統。我做過一個20盤位的存儲服務器單盤16TB最后選了RAID6加兩塊熱備盤雖然可用容量少了些但求個安心。2.5 RAID10與RAID01這對“雙胞胎”千萬別搞混RAID10和RAID01表面看都是鏡像條帶的組合但順序不同安全性差別很大。RAID10先鏡像再條帶把N塊盤先兩兩組成RAID1鏡像對再把多組鏡像對用RAID0條帶化組合起來。至少需要4塊盤。RAID01先條帶再鏡像把N塊盤先整體組成RAID0條帶集再把兩個條帶集做鏡像。至少需要4塊盤。為什么我強烈推薦RAID10而不是RAID01看故障模型RAID10中假設4塊盤A、B、C、DA和B做鏡像C和D做鏡像。如果A盤壞了B盤還頂著只要C和D這組沒問題整體還能工作。最壞情況下只要不是同一鏡像組內的兩塊盤同時壞陣列都能存活。比如壞A和壞C各壞一個鏡像組的一塊陣列仍能正常工作。RAID01就慘了假設A、B組成條帶集1C、D組成條帶集2兩個條帶集做鏡像。如果A壞了整個條帶集1相當于廢了雖然鏡像集2還在數據沒丟但你已經失去了所有冗余。如果B此時再壞條帶集1里的另一塊整個陣列就徹底完蛋。也就是說RAID01中同一時刻壞兩塊盤只要有一塊落在同一個條帶集里陣列就掛了。這個概率比RAID10高不少。所以RAID10的實際表現就是簡單、可靠、性能好。它沒有校驗計算寫懲罰是2次IO先寫鏡像再寫條帶相比RAID6的6次IO快得多。壞盤重建時也不用做復雜的異或運算直接從鏡像盤復制數據就行。適用場景對性能和可靠性要求都高的場景比如數據庫服務器、虛擬化宿主機、高并發業務系統。缺點是空間利用率還是50%成本高。2.6 一張表把六種級別說清楚RAID級別最少盤數容錯能力空間利用率讀取性能寫入性能典型場景RAID02無100%極高極高臨時緩存、游戲服務RAID121塊盤50%較高中等系統盤、日志盤RAID531塊盤(N-1)/N高中低文件服務、業務系統RAID642塊盤(N-2)/N高低大容量存儲、備份RAID104每組壞1塊50%高高數據庫、虛擬化RAID014同組故障即崩50%高高不建議使用這里額外說一句RAID01這玩意兒現在基本從主流服務器上絕跡了新規劃的存儲方案沒人會主動選它。如果在老設備上碰到建議盡早遷移到RAID10。3. 軟RAID、硬RAID、板載RAID到底有什么區別3.1 硬RAID獨立陣列卡說了算硬RAID是指用專用的RAID控制器卡陣列卡來完成所有條帶化、鏡像、校驗計算。陣列卡上有獨立的處理器ROC芯片和緩存常見的有LSI/Broadcom的SAS 9361、9460還有國產廠商的一些方案。硬RAID的優勢很明顯不占用CPU資源所有異或校驗計算都由陣列卡自己完成服務器CPU只管業務計算。帶緩存陣列卡上的緩存常見512MB、1GB、2GB帶電池或電容保護可以大大提升寫入性能。開啟寫緩存之后RAID5、RAID6的寫入性能能提升很多。兼容性好操作系統看到的是一個邏輯卷不需要額外關心底層RAID結構裝驅動也更簡單。掉電保護好的陣列卡配了BBU備用電池單元或超級電容突然斷電時緩存里還沒落盤的數據不會丟。硬RAID的缺點就是貴。好一點的陣列卡大幾千上萬對于預算敏感的場合可能有點肉疼。3.2 軟RAID操作系統說了算軟RAID是純靠操作系統實現的RAID功能沒有專屬的硬件處理器。Linux里用mdadmWindows里用動態磁盤存儲空間都屬于軟RAID。優點非常直觀零硬件成本用現有CPU和內存就能實現。跨平臺靈活遇到機器故障把硬盤拔下來插到另一臺差不多的機器上只要操作系統能識別陣列就能重新組裝。配置靈活可以在線擴展、在線遷移部分操作甚至不用停機。缺點也明顯占用CPU和內存校驗計算全走CPU在高負載的隨機寫入場景下CPU占用能飆升到20%~30%甚至更多。性能上限低沒有專用的緩存機制寫性能上不去。尤其RAID5/RAID6軟RAID的寫入表現通常要比硬RAID差一截。依賴操作系統系統本身壞了或者啟動引導壞了陣列就沒法掛載數據也拿不出來。這就形成了一個尷尬局面——RAID本來是為了保護數據結果軟RAID自己還依賴系統狀態。不過對個人開發者或小型實驗室來說軟RAID其實還挺實用。我自己在實驗室的一臺Linux機器上就跑了一個軟RAID5三塊閑置的1TB機械盤存點測試數據完全夠用。3.3 板載RAID看著像硬其實是半軟很多服務器主板上自帶了一個準RAID功能廠商叫法五花八門SATA RAID、Intel RSTe、LSI MegaRAID等等。它用的是主板芯片組的特定功能外觀和界面看起來像硬RAID但異或校驗計算實際上還是走CPU沒有獨立緩存性能介于真硬RAID和純粹軟RAID之間。業內一般叫它fake RAID。這種板載RAID我覺得很尷尬它不具備硬RAID的性能優勢卻保留了硬RAID的兼容性劣勢比如換到另一臺沒有同款芯片組的主板上陣列可能無法識別。我一般不推薦在重要生產環境里依賴板載RAID。如果預算確實緊張實在要用重點留意主機硬件故障后的恢復方案。3.4 選型建議什么時候用哪種場景推薦方案理由生產環境、數據庫、虛擬化硬RAID獨立陣列卡性能穩、CPU占用低、掉電保護文件存儲、備份服務器硬RAID或板載RAID容量大、順序讀寫為主對隨機IO要求不高個人NAS、測試環境軟RAID成本最低管理靈活臨時測試、開發機任何方案都行數據丟了也不可惜重點是跑通流程我看到不少朋友在組裝NAS的時候用主板自帶的SATA RAID做RAID5結果某天主板壞了硬盤拆下來插到別的機器上直接不認陣列數據差點全部報廢。后來換了方案改用TrueNAS的軟RAIDZFS雖然占了些CPU但數據可遷移性高多了。4. 服務器RAID配置實操從開機到裝系統4.1 進入RAID配置界面的姿勢不同品牌的服務器進入RAID配置界面的快捷鍵不同這里把我日常用到的列出來方便查閱服務器品牌進入方式備注聯想/ThinkServer開機按F1進BIOS后找RAID控制器配置浪潮含R4900 G6等開機按CtrlC或F2根據陣列卡型號常見按CtrlCDell PowerEdgeT420、R740等開機按F2進System Setup然后選RAID配置HPE原惠普企業版開機按F9陣列卡界面還有單獨的CtrlR超微/DIY平臺開機按CtrlR或CtrlH取決于板載陣列卡型號4.2 創建RAID陣列的完整流程以一臺浪潮R4900 G6為例開機出現Logo時按CtrlC進入LSI陣列卡配置界面這里以常見的LSI/Broadcom界面為例。第一步先確認硬盤狀態。在主界面能看到所有物理磁盤確認新硬盤都正常識別狀態顯示為Ready或Unconfigured Good。如果有硬盤顯示Foreign或Failed先處理狀態問題避免后續建陣列的時候帶病工作。第二步進入Virtual Drive Management或Configuration Wizard選擇New Configuration開始全新配置。這里要注意如果是新機器就選New Configuration如果是已有陣列需要重建要選Clear Configuration或Add Configuration千萬別選錯不然會把已有數據全清了。第三步選擇要加入陣列的物理磁盤。按空格鍵選中會看到磁盤前面的圖標變化變成高亮或在ID前出現星號。第四步選擇RAID級別。系統會根據選中的磁盤數量自動推薦可用的級別。比如選中四塊盤你可以選RAID0、RAID1、RAID5、RAID6、RAID10等。第五步設置條帶大小Stripe Size、寫策略、讀策略和緩存策略。這是最容易忽略的一步我建議按以下默認值設置大部分場景都合適條帶大小256KB混合工作負載或128KB數據庫場景讀策略Read Ahead預讀對順序讀取有幫助寫策略Write Back回寫開啟后性能大幅提升緩存策略Direct IO繞過緩存減少緩存干擾第六步確認陣列信息后保存并初始化。初始化過程根據磁盤容量大小耗時不定幾塊2TB的盤一般幾分鐘到十幾分鐘。初始化完成后新的邏輯卷就能在操作系統安裝環境中看到了。4.3 安裝系統時加載RAID驅動不少朋友在做服務器磁盤陣列怎么做的時候卡在裝系統找不到硬盤這一步。比如之前有個朋友問過TS80X服務器RAID裝Windows 2008的問題典型現象就是Windows安裝程序進行到選擇磁盤時列表里空空如也。原因基本只有一個Windows沒帶你這個陣列卡的驅動。解決辦法是在這個界面點加載驅動程序把從廠商官網下載好的陣列卡驅動放進去。驅動一般是zip壓縮包或者exe自解壓文件要在另一臺電腦上解壓后拷貝到U盤里面找后綴名為.inf或.sys的文件。從Windows 8/Server 2012開始微軟系統自帶的通用存儲驅動已經能識別大部分主流LSI陣列卡了所以很少再遇到裝系統找不到盤的問題。但如果裝更老的Windows Server 2003、2008幾乎100%要手動加載驅動。Dell PowerEdge T420這類老服務器的用戶去Dell官網按服務標簽搜索陣列卡驅動就能找到下載時要注意選對操作系統版本和32/64位架構。Linux下情況好一些內核現在基本都集成了主流陣列卡驅動。但有些冷門的陣列卡或者新推出的卡可能要裝廠商提供的kmod包操作前先確認一下內核版本和驅動兼容性。4.4 查看當前RAID狀態的方法裝好系統之后怎么確認當前機器的RAID級別和狀態這里分享兩個最常用的方法。第一種是命令行。Windows下可以用廠商提供的管理工具比如LSI的MSMMegaRAID Storage ManagerDell的OpenManage Server Administrator。Linux下可以用storcli、sas3ircu等命令行工具。以storcli為例storcli /c0 show這條命令會顯示控制器基本信息和已配置的邏輯卷。查看具體虛擬磁盤的RAID級別storcli /c0 /vall show結果里能直接看到RAID Level字段比如RAID5、RAID6、RAID10等。第二種是去陣列卡管理界面。Dell R740這類機器可以在iDRAC的Web管理界面里查看虛擬磁盤狀態能直觀看到RAID級別、磁盤健康度、重建進度等信息。如果是本地界面開機按F2進入系統設置再選RAID Controller相關菜單也能查看。平時巡檢時我會特別留意State那一列正常是Optimal或Online如果看到Degraded或Rebuild狀態說明陣列出了問題需要馬上處理。5. 實際運維中踩過的坑與排查實錄5.1 RAID降級了怎么辦有一次值班半夜接到告警某臺數據庫服務器的RAID5陣列降級。登錄服務器查看發現是第三塊盤狀態變成了Failed。這種時候第一反應不是馬上把故障盤拔掉而是先確認陣列卡上的緩存狀態和整體運行情況再按順序處理。處理步驟我建議這樣確認陣列卡寫緩存策略如果是Write Back注意是否有BBU電池保護。電池失效或掉電情況下系統可能會自動切換到Write Through寫入性能大減這是正常保護邏輯不是陣列卡壞了。備份關鍵數據尤其是數據庫這類業務數據最好在降級狀態下先做一次完整備份以防重建過程中發生二次故障。確認新硬盤型號匹配至少容量不能小于故障盤最好是同型號同固件版本。停止業務或選擇業務低谷期進行重建因為重建過程會瘋狂讀盤寫盤IO占用極高業務高峰期操作容易拖垮整個存儲系統。拔掉故障盤插入新盤。如果配置了熱備盤系統會自動開始重建無需人工操作。查看重建進度storcli或管理界面都能看到百分比。最后說個血淚教訓以前圖便宜用過一批二手硬盤做RAID5壞了一塊心疼數據重建到80%的時候又壞了一塊整個陣列直接崩了。后來重建完成后立刻加了一塊熱備盤把2塊盤的RAID5升成了3塊盤加1熱備心里踏實多了。5.2 硬盤故障后的正確處理流程很多人問我硬盤報警燈亮了能不能直接拔我的回答是先確認這塊盤是不是真的故障再決定動不動它。有些硬盤只是出現SMART警告比如產生了大量壞道重映射但還沒有完全掛掉。這時候直接熱拔反而可能加速損壞而且在某些陣列卡上容易觸發更嚴重的問題。正確做法是先用管理工具看磁盤狀態如果是Predictive Failure預測性故障可以嘗試在線換盤如果是Failed直接換。另外特別提醒一點千萬不要把盤位順序插錯。物理盤在陣列卡里的編號是固定的必須對應到正確的盤位。我見過有人維護時把兩塊盤順序弄反開機后陣列直接崩了損失慘重。維護前一定在硬盤托架上做好標簽標清楚盤位號、序列號、容量、創建時間。5.3 驅動與系統安裝的經典問題這些年被問得最多的一個問題就是為什么我裝Windows Server 2008的時候找不到陣列卡驅動這里面的坑挺多的我總結一下常見的幾種情況。第一種驅動版本和系統架構不匹配。Windows 2008有32位和64位之分驅動也分x86和x64選錯了裝進去系統照樣不認。下載時一定看清。第二種驅動沒解壓干凈。很多驅動包是個自解壓exe要求先在一個Windows機器上運行解壓然后把解壓出來的整個文件夾拷到U盤。如果你只拷了原始exe加載驅動的時候系統根本找不到.inf文件。第三種陣列卡型號太新老系統不支持。這是最麻煩的。有些全新的陣列卡根本不提供Windows Server 2008的驅動官方只支持2012或2016以上。這時候要么放棄裝老系統要么降級陣列卡固件或換驅動兼容性更好的陣列卡。Linux那邊相對簡單但也不要掉以輕心。CentOS 7自帶老的mpt3sas驅動可能帶不動最新款陣列卡。解決辦法是裝系統時用modprobe.blacklistmpt3sas這一類的參數禁用舊驅動然后在安裝過程中手動加載廠商提供的驅動盤。具體操作會因發行版不同有差異建議查一下官方文檔。5.4 幾個容易忽略的細節最后分享幾個我平時特別留意的細節這些在教科書里真不一定找得到。第一RAID陣列卡緩存電池要定期測試不然哪天真的掉電了緩存里的數據全丟比磁盤壞了還慘。我在維護計劃里每季度安排一次電池校準。第二別把所有雞蛋放一個籃子里。RAID只是解決了磁盤故障不解決服務器整機故障、機房斷電、系統中毒、誤刪除這些問題。RAID之外還要有異地備份、快照、容災方案立體防護才算是真的安全。第三新陣列組建完成后第一時間做一次讀寫壓力和穩定性測試。別急著把業務數據灌進去先用fio或dd跑幾個小時看看有沒有報錯尤其是混用新舊硬盤的時候提前暴露問題比事后出故障強多了。第四記錄好陣列配置信息。RAID級別、條帶大小、磁盤順序、出廠序列號、陣列卡型號和固件版本這些信息做成表格貼在服務器機箱上或者記在運維文檔里。以后做遷移、故障恢復能省非常多時間。我個人在實際操作中最大的體會是RAID選型這事真不能等到機器買回來再糾結。規劃服務器硬件的時候先想清楚業務是什么類型的負載、數據有多重要、預算能支撐多少塊盤把這些想清楚了再回頭選RAID級別就順理成章了。新配的服務器我強烈建議系統盤用兩個性能好點的SSD組RAID1數據盤根據業務量選RAID5或RAID10再加一塊熱備盤。這套組合在絕大多數中小型場景下都能做到性能、容量和安全性的平衡。如果你現在手頭正好有一臺服務器要做RAID希望這篇文章能幫你少走點彎路。配置過程其實不復雜真正難的是遇到故障時保持冷靜、按流程處理這個只能靠平時多演練多積累。祝你的陣列永遠Optimal。