ติดตั้ง Software RAID ด้วย mdadm บน VPS Linux
RAID (Redundant Array of Independent Disks) คือการนำ disk หลายลูกมาทำงานร่วมกัน ไม่ว่าจะเพื่อความเร็ว (RAID 0) ความปลอดภัยของข้อมูล (RAID 1) หรือทั้งสองอย่าง (RAID 5, 10) บน Linux เราสามารถสร้าง Software RAID ได้ฟรีผ่าน mdadm โดยไม่ต้องมี hardware RAID controller
VPS ที่มี disk หลายลูกหรือ block storage หลายก้อนสามารถใช้ mdadm สร้าง RAID ได้ทันที ผมใช้ RAID 1 บน production server มาหลายปีแล้ว — ครั้งหนึ่ง disk ตัวหนึ่งเสียตอนกลางดึก server ยังทำงานได้ปกติและ rebuild ตัวเองในชั่วข้ามคืน
เปรียบเทียบ RAID Level
| RAID | จำนวน Disk ขั้นต่ำ | ความเร็ว | ป้องกัน disk เสีย | ใช้ space |
|---|---|---|---|---|
| RAID 0 | 2 | อ่าน/เขียน เร็วขึ้น 2x | ไม่มี — disk เสียใบเดียวข้อมูลหาย | 100% |
| RAID 1 | 2 | อ่านเร็วขึ้น, เขียนช้าลงเล็กน้อย | disk เสียได้ n-1 ลูก | 50% |
| RAID 5 | 3 | อ่านเร็ว, เขียนปานกลาง | disk เสียได้ 1 ลูก | (n-1)/n |
| RAID 6 | 4 | อ่านเร็ว, เขียนช้ากว่า RAID 5 | disk เสียได้ 2 ลูก | (n-2)/n |
| RAID 10 | 4 | เร็วที่สุด | disk เสียได้ 1 ลูกต่อ mirror pair | 50% |
ติดตั้ง mdadm
# Ubuntu / Debian
apt update && apt install -y mdadm
# CentOS / AlmaLinux / Rocky
dnf install -y mdadm
# ตรวจสอบ
mdadm --version
สร้าง RAID 1 (Mirror)
RAID 1 เหมาะที่สุดสำหรับ data disk บน VPS — เขียนข้อมูลลงทั้งสอง disk พร้อมกัน ถ้า disk ตัวหนึ่งเสียข้อมูลยังอยู่ครบบน disk อีกตัว:
ขั้นที่ 1 — เตรียม disk
# ดู disk ที่มี
lsblk
# ล้าง superblock เก่า (ถ้ามี)
mdadm --zero-superblock /dev/sdb /dev/sdc
# ล้าง partition table
wipefs -a /dev/sdb
wipefs -a /dev/sdc
ขั้นที่ 2 — สร้าง RAID 1 array
# สร้าง RAID 1 จาก /dev/sdb และ /dev/sdc
# --level=1 คือ RAID 1, --raid-devices=2 คือจำนวน disk
mdadm --create /dev/md0 \
--level=1 \
--raid-devices=2 \
/dev/sdb /dev/sdc
# ยืนยัน (กด y)
# ตรวจสอบสถานะ
cat /proc/mdstat
ขั้นที่ 3 — Format และ Mount
# Format เป็น ext4
mkfs.ext4 /dev/md0
# สร้าง mount point
mkdir -p /data
# Mount
mount /dev/md0 /data
# บันทึก mdadm config (สำคัญมาก — ต้องทำเพื่อ boot)
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# อัปเดต initramfs
update-initramfs -u
# เพิ่มใน /etc/fstab
echo '/dev/md0 /data ext4 defaults,nofail 0 2' >> /etc/fstab
nofail ใน fstab เพื่อให้ระบบ boot ได้แม้ RAID จะมีปัญหา แทนที่จะค้างที่ emergency shellสร้าง RAID 5 (Striping with Parity)
RAID 5 ต้องการ disk อย่างน้อย 3 ลูก ใช้ space ได้ถึง (n-1)/n เช่น 3 disk ขนาด 1TB ได้ space จริง 2TB:
# สร้าง RAID 5 จาก 3 disk
mdadm --create /dev/md1 \
--level=5 \
--raid-devices=3 \
/dev/sdb /dev/sdc /dev/sdd
# ตรวจสอบ (จะเห็น resync กำลังทำงาน)
watch cat /proc/mdstat
เพิ่ม disk สำรอง (Hot Spare)
Hot spare คือ disk ที่รออยู่เฉยๆ จะ rebuild อัตโนมัติทันทีที่ disk ในอาร์เรย์เสีย:
# เพิ่ม hot spare เข้า RAID 1
mdadm --add /dev/md0 /dev/sdd
# ดูสถานะ spare
mdadm --detail /dev/md0
จำลองและ Rebuild disk ที่เสีย
# ทำเครื่องหมาย disk ว่า faulty (จำลองกรณี disk เสีย)
mdadm --manage /dev/md0 --fail /dev/sdb
# ลบ disk ที่เสียออก
mdadm --manage /dev/md0 --remove /dev/sdb
# ดูสถานะ (จะเห็น [_U] หมายถึง degraded)
cat /proc/mdstat
# เพิ่ม disk ใหม่/ซ่อมแซม (rebuild เริ่มอัตโนมัติ)
mdadm --manage /dev/md0 --add /dev/sdb
# ติดตาม rebuild progress
watch -n5 cat /proc/mdstat
ตั้งค่า Email แจ้งเตือนเมื่อ RAID มีปัญหา
# แก้ไข /etc/mdadm/mdadm.conf
# เพิ่มบรรทัดนี้
MAILADDR [email protected]
# เปิด mdmonitor service
systemctl enable --now mdmonitor
# ทดสอบการแจ้งเตือน
mdadm --monitor --test /dev/md0
ตรวจสอบว่า RAID ทำงานถูกต้อง
# ดูสถานะทุก array
cat /proc/mdstat
# ดูรายละเอียด array เฉพาะ
mdadm --detail /dev/md0
# ดูข้อมูล superblock ของ disk
mdadm --examine /dev/sdb
# ดูทุก array พร้อมกัน
mdadm --detail --scan
# ตรวจสอบว่า mount อยู่
df -hT /data
# ดู RAID event log
journalctl -u mdmonitor --since "1 hour ago"
/proc/mdstat หาก state แสดง [UU] หมายถึงทุก disk ทำงานปกติ [_U] หมายถึง degraded — disk ตัวแรกเสีย ต้องแก้ไขทันทีแก้ปัญหาที่พบบ่อย
Error: "mdadm: Cannot open /dev/sdb: Device or resource busy"
Disk ถูกใช้งานอยู่หรือมี superblock RAID เดิมค้างอยู่
# ดูว่ามี mount อยู่ไหม
lsof /dev/sdb
umount /dev/sdb 2>/dev/null
# ล้าง superblock RAID เดิม
mdadm --zero-superblock /dev/sdb
# ล้าง partition signature
wipefs -a /dev/sdb
# ลองใหม่
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
Error: Array ไม่ assemble หลัง reboot
mdadm.conf ไม่ถูกสร้างหรือ initramfs ไม่ได้รับการอัปเดต
# Assemble manually
mdadm --assemble --scan
# หรือระบุ device โดยตรง
mdadm --assemble /dev/md0 /dev/sdb /dev/sdc
# บันทึก config ใหม่
mdadm --detail --scan > /etc/mdadm/mdadm.conf
# อัปเดต initramfs
update-initramfs -u # Debian/Ubuntu
dracut --force # CentOS/RHEL
Error: "mdadm: /dev/md0 appears to contain an ext2fs file system"
เกิดเมื่อ mdadm ถามว่าแน่ใจจะสร้าง array บน device ที่มี filesystem อยู่แล้ว
# ใช้ --force เพื่อ override (ข้อมูลจะหายทั้งหมด)
mdadm --create --force /dev/md0 \
--level=1 --raid-devices=2 \
/dev/sdb /dev/sdc
RAID Degraded และ rebuild ช้ามาก
ค่า speed_limit ต่ำมาก ปรับให้ rebuild เร็วขึ้น (ระวัง I/O spike)
# ดูค่า speed limit ปัจจุบัน
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max
# เพิ่ม rebuild speed (KB/s)
echo 50000 > /proc/sys/dev/raid/speed_limit_min
echo 200000 > /proc/sys/dev/raid/speed_limit_max
# ทำถาวรใน /etc/sysctl.conf
echo 'dev.raid.speed_limit_min = 50000' >> /etc/sysctl.conf
echo 'dev.raid.speed_limit_max = 200000' >> /etc/sysctl.conf
Error: "no devices found for /dev/md0" หลัง kernel update
Initramfs ไม่มี mdadm config ใหม่
# Boot เข้า rescue mode แล้วรัน
mdadm --detail --scan > /etc/mdadm/mdadm.conf
update-initramfs -u
reboot
คำถามที่พบบ่อย
Software RAID ต่างจาก Hardware RAID อย่างไร?
Hardware RAID ใช้ controller card แยกต่างหากทำการคำนวณ parity ไม่กิน CPU server ส่วน Software RAID ใช้ CPU ของ server เองผ่าน kernel module ข้อดีคือฟรี, ย้าย disk ไปเครื่องอื่นได้ทันที, ไม่ต้องพึ่ง driver proprietary บน Linux ปัจจุบัน Software RAID ผ่าน mdadm มี performance ใกล้เคียง hardware RAID มากในงาน sequential I/O
ใช้ RAID 1 กับ VPS cloud storage ได้ไหม?
ได้ แต่ต้องพิจารณาว่า cloud storage ส่วนใหญ่มี redundancy อยู่แล้วระดับ infrastructure (เช่น Ceph หรือ SAN) การทำ RAID 1 ซ้ำอาจไม่จำเป็นสำหรับ availability แต่ยังมีประโยชน์สำหรับ read performance เพราะ RAID 1 อ่านจาก disk ได้ทั้งสองตัวพร้อมกัน
RAID ทดแทน backup ได้ไหม?
ไม่ได้ RAID ป้องกัน disk failure เท่านั้น ถ้าไฟล์ถูกลบ, database corrupt, หรือ ransomware เข้ารหัสไฟล์ RAID จะ mirror ความเสียหายนั้นไปทุก disk ทันที ต้องมีทั้ง RAID และ backup แยกกัน ดูเพิ่มที่ กลยุทธ์ Backup VPS