Ubuntu Server mdadm RAID完整教學:RAID 1/10建置、MySQL/Docker效能與故障重建(2026)
在 Ubuntu Server 中,RAID 主要用來提升「資料安全性」與「I/O 效能」。本篇會用實務角度帶你理解 mdadm 軟體 RAID 的建置方式、RAID 1 / RAID 10 差異,以及 MySQL 與 Docker 為什麼會被磁碟 I/O 影響,同時補充硬體 RAID 卡差異、開機持久化設定與故障後的完整恢復流程。
Docker 在現代雲端與容器化架構中扮演重要角色,如果你還不熟悉基本概念,可以先參考 Docker 是什麼?新手完整入門教學。
文章目錄
RAID 基本觀念(RAID 1 vs RAID 10)
RAID 1 是「鏡像」,資料會同時寫入兩顆硬碟,優點是資料安全性高,但寫入效能不會明顯提升。RAID 10 則是「鏡像 + 條帶化」,能同時分散 I/O 負載,因此在資料庫與容器化環境中,通常能提供更好的整體效能與延遲表現。
在理解不同系統架構(例如虛擬化與容器化)的差異時,也可以進一步延伸參考 Docker vs VM vs Kubernetes 差異比較,幫助你更完整理解不同運行環境對效能與資源分配的影響。
RAID 1 與 RAID 10 比較| 項目 | RAID 1 | RAID 10 |
|---|---|---|
| 結構 | Mirror | Mirror + Stripe |
| 效能 | 一般 | 高(可擴展 IOPS) |
| 適合 | 網站 / 檔案 | MySQL / Docker / 高流量 |
| 容錯 | 1 顆 | 多組 mirror 容錯 |
IOPS 與 MySQL / Docker 效能影響
IOPS(每秒磁碟 I/O 次數)是影響網站速度的關鍵。MySQL 在處理查詢、交易時會大量讀寫磁碟,Docker 則會產生 log、layer 寫入與 container filesystem I/O。
當 IOPS 不足時,你會看到:網站變慢、MySQL query latency 上升、Docker container 卡頓。
RAID 10 可以透過多顆磁碟「同時處理 I/O」,因此比 RAID 1 更適合高負載環境。
mdadm 建置 RAID 實務(完整流程)
Step 1:確認磁碟
lsblk
# 查看目前系統磁碟,確認 /dev/sdb /dev/sdc 是否存在
Step 2:安裝 mdadm
sudo apt update
sudo apt install mdadm -y
# 安裝 Linux 軟體 RAID 管理工具
Step 3:建立 RAID 1
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
# RAID 1:兩顆硬碟鏡像
Step 4:建立 RAID 10
sudo mdadm --create /dev/md1 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# RAID 10:至少 4 顆硬碟(mirror + stripe)
Step 5:檢查 RAID 狀態
cat /proc/mdstat
# 查看同步 / degraded 狀態
Step 6:格式化與掛載
mkfs.ext4 /dev/md0
mkdir -p /data
mount /dev/md0 /data
# 格式化並掛載使用
/data。伺服器一旦重開機,很可能發現RAID不見了(其實資料還在,只是沒被正確組裝或掛載),這是最容易讓新手嚇一跳的坑。Step 7:把RAID設定寫入設定檔(開機自動組裝的關鍵)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
# 把目前RAID陣列的組成資訊寫進mdadm設定檔
# 並重建initramfs,讓開機流程能正確辨識並組裝這個RAID
這兩行指令缺一不可:mdadm --detail --scan會輸出目前陣列的UUID等組成資訊,寫進/etc/mdadm/mdadm.conf後,系統開機時才知道要把哪幾顆硬碟組成哪個陣列;update-initramfs -u則是把這份設定重新編入開機用的initramfs映像檔,確保開機早期階段就能正確載入。
Step 8:設定開機自動掛載(寫入 /etc/fstab)
先查詢RAID陣列的UUID:
blkid /dev/md0
把輸出的UUID複製下來,編輯 /etc/fstab 加入一行(記得依實際輸出替換UUID):
UUID=你查到的UUID /data ext4 defaults 0 2
寫入後可以用以下指令測試設定是否正確,而不用真的重開機:
sudo umount /data
sudo mount -a
df -h /data
# 如果重新掛載成功且df有顯示/data,代表fstab設定正確
Ubuntu Server、Docker 與 MySQL 效能完整比較
在實務上,Ubuntu Server 本身不會產生大量 I/O,真正影響效能的是「跑在上面的服務」,例如 Docker 與 MySQL。因此 RAID 的設計必須以服務特性來決定,而不是只看系統層。
系統層與服務層的I/O特性比較| 項目 | Ubuntu Server(系統層) | Docker Container | MySQL 資料庫 |
|---|---|---|---|
| IO 類型 | 中低(log / system) | 中高(layer / log / file write) | 極高(random read/write) |
| IO 模式 | 偏 sequential | 混合型 IO | 大量 random IO |
| RAID 1 表現 | 穩定但延遲一般 | 可能出現 IO bottleneck | TPS 容易受限 |
| RAID 10 表現 | 更穩定、延遲下降 | 明顯改善寫入與 log 延遲 | TPS 明顯提升、延遲降低 |
| 效能瓶頸 | 較少 | container density 高時 IO 卡住 | 最容易受磁碟影響 |
結論很簡單:
- 只有 Ubuntu Server → RAID 1 通常夠用
- 有 Docker → 建議 RAID 10
- 有 MySQL → 幾乎一定 RAID 10
原因是 MySQL 與 Docker 都屬於「高 random I/O workload」,磁碟 IOPS 才是真正瓶頸,而不是 CPU。
mdadm vs 硬體 RAID 卡
mdadm 是軟體 RAID,由 Linux + CPU 處理。硬體 RAID 則由 RAID 卡控制器處理,不占 CPU,但成本高。
mdadm 與硬體 RAID 比較| 比較項目 | mdadm | 硬體 RAID |
|---|---|---|
| 成本 | 低 | 高 |
| 效能 | 依 CPU(現代足夠) | 穩定高效 |
| 可移植性 | 高(Linux 可直接讀) | 低(依賴卡) |
| 維護 | 指令操作 | BIOS / 工具 |
RAID 故障診斷與完整重建流程
當 RAID 壞掉時的標準流程:
1. 先確認 RAID 是否降級
cat /proc/mdstat
# 如果看到 [U_] 或 [_U] 代表 degraded
2. 查看詳細狀態
mdadm --detail /dev/md0
# 確認哪一顆 disk 掛掉
3. 移除故障碟(如果系統仍識別)
mdadm --remove /dev/md0 /dev/sdb
# 移除壞掉硬碟
4. 更換新硬碟後加入 RAID
mdadm --add /dev/md0 /dev/sdb
# 將新硬碟加入 RAID
5. 觀察重建進度
watch cat /proc/mdstat
# 即時觀看 rebuild 進度
重點:RAID 不會自動修好,一定要「加入新硬碟 → rebuild」。
mdadm建置RAID的完整流程不是只到「格式化掛載」就結束——建立陣列後,務必把設定寫進/etc/mdadm/mdadm.conf並執行update-initramfs -u,再把掛載點加進/etc/fstab,這兩步做完才算真正完成,否則重開機後很可能發現RAID「不見了」。日常則要留意/proc/mdstat是否出現degraded狀態,一旦有硬碟故障應盡快更換並重建,避免容錯用盡導致資料遺失。
FAQ 常見問題
RAID 1 和 RAID 10 差在哪?
mdadm 是什麼?
RAID 壞掉資料會消失嗎?
MySQL 為什麼受 RAID 影響?
建立好RAID後,為什麼重開機就找不到了?
本文為 Ubuntu Server 使用 mdadm 建置軟體 RAID 的通用教學,實際指令與硬體代號請依你的環境調整;正式環境操作RAID前請先完成資料備份,並在非上線時段測試重開機是否能正確自動組裝。
