伺服器維運

RAID 0 和 RAID 1 的區別:條帶與映象,兩塊盤怎麼選

RAID 0 是條帶:資料切塊輪流寫到兩塊盤上,容量和大檔案讀寫速度接近兩塊盤之和,但任何一塊壞了整個卷都沒了。RAID 1 是映象:兩塊盤存一模一樣的資料,只能用一塊盤的容量,寫入不比單盤快,換來壞一塊盤照常執行。兩塊盤時,資料丟了能重新生成就選 RAID 0,不能丟就選 RAID 1。

作者 頂聯產品團隊發布於 6 分鐘閱讀

RAID0 和 RAID1 的區別在於資料怎麼放:RAID 0 把資料切成小塊輪流寫到兩塊盤上(條帶),兩塊盤的容量和吞吐疊加,但沒有任何冗餘,壞一塊盤整個卷的資料都丟;RAID 1 把同一份資料同時寫到兩塊盤上(映象),只能用一塊盤的容量,寫入不比單盤快,換來壞一塊盤業務照常執行。只有兩塊盤時,判斷標準只有一個:這份資料丟了能不能重新生成。能,就用 RAID 0 換速度和容量;不能,就用 RAID 1。

RAID 0 是什麼意思:條帶化,容量和速度疊加

RAID 0 把兩塊(或更多)盤組成一個卷,資料按固定大小切塊,第一塊寫盤 1,第二塊寫盤 2,第三塊又回到盤 1,每塊的大小叫條帶大小(strip,也叫 chunk)。以 256 KB 條帶為例,寫一個 1 MB 的檔案,第 1、3 塊落在盤 1,第 2、4 塊落在盤 2,兩塊盤各寫 512 KB,同時進行,耗時約為單盤的一半。

但速度不是在所有場景下都翻倍。一次 IO 比條帶小時(例如資料庫常見的 8 KB、16 KB 頁),只會落到一塊盤上,單個請求的延遲和單盤一樣;只有多個請求同時落到不同的盤上,總 IOPS 才會增加。所以 RAID 0 對大檔案順序讀寫和高併發的隨機讀寫有效,對一個接一個、單執行緒的小 IO 幾乎沒有提升。條帶大小一般用控制器預設值;以大檔案順序讀寫為主的,可以設大一些。

# 陣列卡(MegaRAID / PERC):用 252:0、252:1 兩塊盤建 RAID 0,條帶 256 KB;EID:Slt 以 storcli64 /c0 show 的輸出為準
storcli64 /c0 add vd type=raid0 drives=252:0-1 strip=256
# Linux 軟 RAID:不指定 --chunk 時,mdadm 預設條帶為 512 KB
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

在陣列卡上還常見一種“單盤 RAID 0”:控制器不支援直通(JBOD)模式時,要讓系統看到某塊盤,就把它單獨建成一個 RAID 0 虛擬盤。這樣做不是為了效能,只是讓盤能被識別,常用於 Ceph、ZFS 這類自己管理磁碟的軟體。代價是盤上帶著陣列卡的配置資訊,換盤後要在陣列卡里重新建一次;檢視 SMART 也要透過陣列卡,例如 smartctl -a -d megaraid,0 /dev/sda,最後的數字是盤在控制器上的裝置號。

RAID 1 是什麼意思:映象,用一半容量換容錯

RAID 1 讓兩塊盤組成映象,每一次寫入都同時寫到兩塊盤上,兩塊盤的內容始終一致。可用容量等於一塊盤;寫入要等兩塊盤都完成,速度和單盤差不多;讀取可以從任意一塊盤讀,多個併發讀請求能分攤到兩塊盤上,而單個檔案的順序讀多數實現只從一塊盤讀,接近單盤速度。

壞一塊盤時,陣列進入降級狀態,業務照常讀寫,只是沒有冗餘了;換上新盤後,把好盤的內容整盤複製過去,這叫重建。RAID 1 的重建是順序複製,不需要校驗計算,比 RAID 5 簡單,耗時大約是“單盤容量 ÷ 持續寫入速度”,再加上業務讀寫的干擾。

# 陣列卡
storcli64 /c0 add vd type=raid1 drives=252:0-1
# Linux 軟 RAID,用兩塊盤上的分割槽做映象
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
cat /proc/mdstat      # 新建後會先做一次全盤同步(resync),進度在這裡看

RAID 1 防的只是“一塊盤壞了”。誤刪檔案、程式寫壞資料、勒索軟體加密,都會被同步到兩塊盤上,所以 RAID 1 之外仍然要有備份。另一個容易被忽略的問題出在 SSD 上:同型號、同批次的兩塊 SSD 做映象,寫入量完全相同,磨損程度同步增長,壽命可能在相近的時間耗盡。用 smartctl -a 定期看磨損指標(NVMe 盤是 Percentage Used,SATA SSD 的屬性名因廠商而異),接近壽命時錯開時間先換掉一塊。

兩塊盤做 RAID 0 和 RAID 1,具體差多少

以兩塊 1.92 TB 的 SATA SSD 為例。假設單盤順序讀 500 MB/s、順序寫 450 MB/s,4K 隨機讀在高併發下 80,000 IOPS、隨機寫 30,000 IOPS,下表是理論估算,不考慮陣列卡和匯流排成為瓶頸的情況:

對比項 單盤 RAID 0 RAID 1
可用容量 1.92 TB 3.84 TB(系統里約顯示 3.49 TiB) 1.92 TB(約 1.75 TiB)
順序讀 500 MB/s 約 1,000 MB/s 單個讀取流約 500 MB/s,多個併發流可接近 1,000 MB/s
順序寫 450 MB/s 約 900 MB/s 約 450 MB/s
4K 隨機讀,高併發 80,000 IOPS 約 160,000 IOPS 接近 160,000 IOPS
4K 隨機寫,高併發 30,000 IOPS 約 60,000 IOPS 約 30,000 IOPS
4K 讀寫,單執行緒逐個請求 基準 與單盤基本相同 與單盤基本相同
壞 1 塊盤 資料丟失 兩塊盤上的資料全部丟失 照常執行,進入降級
換盤之後 從備份恢復 重建陣列,再從備份恢復 重建,業務不中斷

兩個結論:RAID 0 的優勢集中在順序讀寫和高併發寫上;RAID 1 在讀多寫少、併發高的業務上並不慢,真正吃虧的只有寫入和容量。

風險方面,RAID 0 的丟資料風險是兩塊盤疊加,任意一塊壞整卷就沒了,大約是單盤的兩倍;RAID 1 只有在第一塊盤壞了、換盤重建完成之前第二塊也壞,才會丟資料,這個視窗通常是幾小時到幾天。但同批次、同環境的兩塊盤,故障並不完全獨立,這個視窗不能當作不存在。

用 fio 測一測:你的業務吃哪種 IO

表裡的數字是估算,陣列建好後用 fio 實測更可靠。下面的命令直接對陣列裝置讀寫(陣列卡上的虛擬盤把 /dev/md0 換成系統裡對應的 /dev/sdX),寫入測試會覆蓋裝置上的資料、破壞檔案系統,只能在新建、尚未存放資料的陣列上做:

# 大塊順序寫:RAID 0 應接近單盤的兩倍,RAID 1 接近單盤
fio --name=seqwrite --filename=/dev/md0 --rw=write --bs=1M --size=10G --direct=1 --ioengine=libaio --iodepth=32
# 4K 隨機讀,佇列深度 1:兩種陣列都和單盤差不多
fio --name=rand-qd1 --filename=/dev/md0 --rw=randread --bs=4k --size=10G --direct=1 --ioengine=libaio --iodepth=1 --runtime=60 --time_based
# 4K 隨機讀,高併發:兩種陣列都能接近單盤的兩倍
fio --name=rand-qd32 --filename=/dev/md0 --rw=randread --bs=4k --size=10G --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting

更重要的是弄清現有業務的 IO 長什麼樣。在正在跑業務的伺服器上執行 iostat -x 1,看三列:rareq-sz、wareq-sz 是平均每次讀、寫的大小(KB),aqu-sz 是平均佇列深度(老版本 sysstat 對應的是 avgrq-sz 和 avgqu-sz,其中 avgrq-sz 以扇區為單位,而且讀寫不分開)。如果每次寫只有 8–16 KB、佇列深度在 1 左右,說明業務是一個接一個的小 IO,換成 RAID 0 幾乎不會變快;每次幾百 KB 以上、佇列常常排著十幾個請求的,RAID 0 才有明顯收益。

壞一塊盤之後,兩種陣列分別怎麼處理

RAID 0:陣列卡上的虛擬盤變成 Offline 或 Failed,系統裡這塊盤直接消失或者大量報 IO 錯誤;mdadm 的 RAID 0 讀寫大量報錯,整個裝置不可用。沒有任何重建的辦法,步驟只有換盤、刪掉舊虛擬盤重新建、重灌或重新掛載,再從備份或資料來源頭恢復。所以 RAID 0 上的資料必須滿足兩個條件之一:能從別處重新生成,或者有存放在這台機器之外的定期備份。

RAID 1:陣列卡上的 RAID 1 對系統來說只是一塊盤,插上新盤後控制器一般會自動開始重建。軟 RAID 要手動操作:

cat /proc/mdstat                                    # [U_] 表示缺了一塊盤
mdadm --detail /dev/md1                             # 看哪塊盤是 faulty 或 removed
mdadm /dev/md1 --fail /dev/sdc1 --remove /dev/sdc1
# 換上新盤後,把好盤 sdb 的 GPT 分割槽表複製到新盤 sdc,再給新盤生成新的 GUID
sgdisk -R /dev/sdc /dev/sdb && sgdisk -G /dev/sdc
mdadm /dev/md1 --add /dev/sdc1
watch -n 5 cat /proc/mdstat                         # 看重建進度

軟 RAID 1 做系統盤還要多一步:載入程式要裝到兩塊盤上。Legacy(BIOS)模式下對兩塊盤分別執行 grub-install(RHEL 係為 grub2-install),否則壞的恰好是裝了引導的那塊時,系統資料完好卻開不了機;UEFI 模式下,EFI 系統分割槽不能放在預設格式(metadata 1.2)的 mdadm 陣列裡,常見做法是每塊盤各建一個 EFI 分割槽並保持內容同步。

兩塊盤怎麼選:按資料能不能重新生成

場景 建議 理由
系統盤 RAID 1 系統壞了要重灌、恢復配置,停機的代價遠高於一塊盤的容量
小型資料庫、網站、業務應用 RAID 1,另做異機備份 資料不能重新生成,寫入量不大,單盤效能夠用
編譯快取、轉碼中間檔案、下載或 CDN 快取 RAID 0 丟了可以重新生成,要的是容量和吞吐
影片剪輯、科學計算的臨時工作區 RAID 0 原始資料另有儲存,工作區要速度
Ceph、HDFS、MinIO 這類分散式儲存節點 不做 RAID,兩塊盤分別交給軟體 軟體自己在多台機器之間儲存副本,做成 RAID 0 反而讓一塊盤的故障牽連兩塊盤的資料
拿不準 RAID 1 選錯 RAID 1 只是少用一塊盤的容量,選錯 RAID 0 是丟資料

還有一個常被忽略的選項:兩塊盤都不做 RAID,各自掛載到不同目錄。容量和 RAID 0 一樣,壞一塊只丟這塊盤上的資料。業務能把資料分到兩個目錄時(比如兩個快取目錄),它比 RAID 0 穩妥,代價是單個檔案的讀寫速度不會疊加。

陣列級別要在裝系統之前定好。建好之後再改,多數情況要先備份、刪除陣列再重建;部分陣列卡支援線上遷移級別,但對盤數和容量有要求,遷移過程也很長,以控制器文件為準。

在管理系統裡怎麼落地

同樣是壞了一塊盤,RAID 0 和 RAID 1 的伺服器處理方式完全不同:前者意味著資料已經丟失、要通知客戶準備恢復,後者只需安排換盤。值班人員接到報修時,要能馬上查到這台機器裝了幾塊盤、是什麼陣列,所以陣列級別應當和硬體配置一起記錄在資產資訊裡。DCIM 機房管理系統的機櫃與資產會向伺服器下發硬體採集指令碼,CPU、記憶體、硬碟等真實配置自動入庫並保留每次採集的歷史,與人工錄入的配置同時保留,少了一塊盤、換過一塊盤都能對照出來;換下的硬碟作為部件登記返修,伺服器故障的處理過程記錄在故障管理裡。RAID 0 的機器壞盤後要重建虛擬盤時,在 IPMI 遠端管理裡開啟走 BMC 通道的控制檯,開機時進陣列卡介面重建,再掛載 ISO 重灌系統,不必派人去機房接顯示器。

常見問題

兩塊容量不同的盤能做 RAID 0 或 RAID 1 嗎?

能,但大盤多出來的容量多半浪費。陣列卡按小盤計算,RAID 0 可用容量是小盤的兩倍,RAID 1 等於小盤;Linux mdadm 的 RAID 0 能用上兩塊盤的全部容量,只是超出小盤的那部分不再條帶化,RAID 1 仍按小盤算。

RAID 1 的盤拆下來能單獨讀嗎?

軟 RAID 1 的每塊盤都是完整副本,接到另一台 Linux 機器上,mdadm 能把它組裝成降級陣列直接讀。陣列卡上的 RAID 1 盤帶有控制器的配置資訊,穩妥的做法是接到同系列陣列卡上匯入外來配置後再讀。

一塊 SSD 和一塊機械盤能做 RAID 1 嗎?

軟 RAID 可以做,多數陣列卡不允許混用介質。即使能做,寫入要等慢的那塊完成,寫速度會降到機械盤的水平;用 mdadm 時可以給機械盤加 --write-mostly 引數,讓讀請求儘量走 SSD。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88