Software RAID trên Linux với mdadm: Hướng dẫn thực tế về cài đặt, bảo trì và khôi phục

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bối cảnh & Lý do: Khi nào và tại sao nên dùng Software RAID

Ổ cứng rồi cũng sẽ hỏng. Vấn đề không bao giờ là có hỏng hay không, mà là khi nào. Khi bạn triển khai máy chủ mà không có card Hardware RAID chuyên dụng—chẳng hạn như máy ảo cloud gắn kèm block volume, máy chủ dedicated giá rẻ (như bare metal của Hetzner hay OVH), hoặc máy chủ ảo hóa home lab—Linux Software RAID thông qua mdadm mang lại khả năng dự phòng dữ liệu cực kỳ vững chắc mà không bị phụ thuộc vào bất kỳ nhà cung cấp phần cứng nào.

Các controller phần cứng thường tạo ra một điểm lỗi đơn lẻ (single point of failure) đầy rủi ro. Nếu card proprietary MegaRAID hoặc Smart Array bị cháy, việc tìm kiếm một card thay thế y hệt hoặc khớp phiên bản firmware có thể mất nhiều ngày. Ngược lại, mdadm (Multiple Device Administrator) ghi metadata trực tiếp vào disk header. Bạn có thể rút ổ cứng từ một máy chủ đã hỏng, cắm sang bất kỳ máy Linux thông thường nào khác, và đưa mảng RAID hoạt động trở lại chỉ trong vài phút.

Lựa chọn cấp độ RAID phù hợp

Hãy đối chiếu mô hình thiết lập với các yêu cầu cụ thể về dung lượng, throughput và thời gian uptime:

  • RAID 1 (Mirroring): Yêu cầu tối thiểu 2 ổ đĩa. Mọi block dữ liệu đều được sao chiếu song song giữa các ổ. Tốc độ đọc tỉ lệ thuận theo số lượng ổ, trong khi tốc độ ghi sẽ bằng tốc độ của ổ chậm nhất. Dung lượng khả dụng chỉ đạt 50% (ví dụ: hai ổ SSD 1TB sẽ cho 1TB khả dụng). Phù hợp nhất cho ổ boot hệ điều hành, phân vùng /boot và cơ sở dữ liệu quan trọng.
  • RAID 5 (Distributed Parity): Yêu cầu tối thiểu 3 ổ đĩa. Dữ liệu và các block parity được ghi phân tán trên toàn bộ các ổ. Cho phép chịu lỗi khi hỏng đúng 1 ổ đĩa. Dung lượng khả dụng bằng (N – 1) * Dung lượng ổ, nên ba ổ 4TB sẽ cho 8TB khả dụng. Rất thích hợp cho lưu trữ dữ liệu khối lượng lớn và kho media, dù quá trình tính toán parity sẽ làm giảm hiệu năng ghi ngẫu nhiên (random write).
  • RAID 10 (Stripe of Mirrors): Yêu cầu tối thiểu 4 ổ đĩa (số lượng chẵn). Kết hợp tốc độ vượt trội của RAID 0 với khả năng chịu lỗi của RAID 1. Mang lại 50% dung lượng sử dụng. Có thể chịu được sự cố hỏng nhiều ổ đĩa cùng lúc, miễn là không có cặp mirror nào bị hỏng cả hai ổ. Đây là tiêu chuẩn vàng cho các hệ thống PostgreSQL, MySQL đòi hỏi IOPS cao và máy chủ ảo hóa.

Cài đặt: Chuẩn bị hệ thống và công cụ

Mọi bản phân phối Linux phổ biến đều đóng gói sẵn mdadm trong repository chính thức. Cài đặt thông qua package manager chuẩn của hệ thống:

# Debian / Ubuntu
sudo apt update && sudo apt install -y mdadm

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install -y mdadm

Liệt kê các block device đang kết nối để đảm bảo các ổ đĩa mục tiêu đều chưa được mount và hiển thị đầy đủ. Trong hướng dẫn này, chúng ta sử dụng bốn ổ đĩa 1TB giống hệt nhau: /dev/sdb, /dev/sdc, /dev/sdd và /dev/sde.

lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

Các bảng phân vùng cũ hoặc superblock của filesystem còn sót lại có thể gây lỗi khi khởi tạo mảng RAID. Hãy xóa sạch chúng trước khi tiến hành:

sudo wipefs -a /dev/sdb /dev/sdc /dev/sdd /dev/sde

Cấu hình: Khởi tạo mảng RAID và xử lý Filesystem

1. Tạo mảng RAID 1 (2 ổ đĩa)

Để tạo mảng mirror gán vào thiết bị /dev/md0 sử dụng hai ổ đĩa:

sudo mdadm --create --verbose /dev/md0 \
  --level=1 \
  --raid-devices=2 \
  /dev/sdb /dev/sdc

2. Tạo mảng RAID 5 (3 ổ đĩa)

Để khởi tạo parity phân tán trên ba ổ đĩa:

sudo mdadm --create --verbose /dev/md5 \
  --level=5 \
  --raid-devices=3 \
  /dev/sdb /dev/sdc /dev/sdd

3. Tạo mảng RAID 10 (4 ổ đĩa)

Dành cho các workload yêu cầu throughput cao và độ trễ thấp:

sudo mdadm --create --verbose /dev/md10 \
  --level=10 \
  --raid-devices=4 \
  /dev/sdb /dev/sdc /dev/sdd /dev/sde

Tạo Filesystem và thiết lập Mount tự động cố định

Sau khi mảng RAID được dựng xong, hãy thao tác với thiết bị ảo /dev/mdX tương tự như bất kỳ ổ đĩa thông thường nào:

sudo mkfs.ext4 -F /dev/md0
sudo mkdir -p /mnt/raid_storage
sudo mount /dev/md0 /mnt/raid_storage

Nếu không có file cấu hình rõ ràng, kernel có thể tự ý gán tên thiết bị ngẫu nhiên khi khởi động lại (chẳng hạn như /dev/md127). Hãy lưu cấu trúc mảng RAID vào mdadm.conf và build lại ramdisk ban đầu để môi trường root nhận diện chính xác ngay từ giai đoạn boot sớm:

# Lưu cấu hình mảng RAID hiện tại
sudo mkdir -p /etc/mdadm
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

# Cập nhật initramfs để lưu lại thay đổi
sudo update-initramfs -u  # Debian / Ubuntu
# sudo dracut -f           # RHEL / CentOS / Rocky Linux

Việc mount theo tên kernel (/dev/md0) trong /etc/fstab rất dễ phát sinh lỗi. Luôn tra cứu mã UUID duy nhất của filesystem:

sudo blkid -s UUID -o value /dev/md0

Sau đó thêm dòng sau vào /etc/fstab bằng UUID vừa lấy được (ví dụ: e2f8c5b1-36a4-4df1-8e9a-24128f654b03):

UUID=e2f8c5b1-36a4-4df1-8e9a-24128f654b03 /mnt/raid_storage ext4 defaults,nofail 0 2

Kiểm tra & Giám sát: Kiểm tra sức khỏe và thay thế ổ đĩa lỗi

Kiểm tra trạng thái mảng RAID và tiến trình Rebuild

Để kiểm tra các mảng đang hoạt động và theo dõi tiến trình đồng bộ ngầm theo thời gian thực:

cat /proc/mdstat

Để xem thông tin chi tiết về từng ổ đĩa, RAID personality và timestamp của superblock, hãy truy vấn trực tiếp mảng:

sudo mdadm --detail /dev/md0

Kiểm tra trường State—mảng khỏe mạnh sẽ báo clean hoặc active. Nếu hiển thị degraded, hãy kiểm tra danh sách ổ đĩa ở bên dưới để xác định chính xác ổ nào đã gặp sự cố.

Tăng tốc tiến trình Sync ban đầu và Resync

Theo mặc định, Linux kernel sẽ giới hạn tốc độ resync chạy nền (thường chặn ở mức tối thiểu 1.000 KB/s đến tối đa 200.000 KB/s) để tránh chiếm dụng I/O của ứng dụng người dùng. Với mảng RAID 5 gồm 4 ổ 8TB, giới hạn mặc định có thể kéo dài thời gian resync lên hơn 30 giờ. Trên máy chủ thử nghiệm với các mảng NVMe và SATA, việc điều chỉnh các ngưỡng sysctl này đã rút ngắn thời gian rebuild từ 14 giờ xuống chỉ còn dưới 3 giờ:

# Tăng giới hạn thông lượng rebuild: tối thiểu 50 MB/s và tối đa 500 MB/s
echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_min
echo 500000 | sudo tee /proc/sys/dev/raid/speed_limit_max

# Tăng stripe cache size cho RAID 5/6 (mặc định là 256 page; nâng lên 4096 hoặc 8192)
echo 8192 | sudo tee /sys/block/md5/md/stripe_cache_size

Quy trình thay thế ổ đĩa lỗi an toàn

Khi dmesg ghi nhận lỗi I/O hoặc /proc/mdstat đánh dấu ổ đĩa với ký hiệu (F), hãy thực hiện các bước sau để thay thế ổ đĩa vật lý mà không làm gián đoạn hệ thống lưu trữ.

  1. Đánh dấu ổ đĩa bị lỗi: Nếu ổ đĩa liên tục báo lỗi nhưng chưa tách hẳn khỏi hệ thống, thông báo cho kernel ngừng điều hướng I/O đến ổ này:

    sudo mdadm --manage /dev/md0 --fail /dev/sdb
  2. Gỡ ổ đĩa khỏi mảng RAID: Hủy liên kết ổ đĩa lỗi khỏi software stack:

    sudo mdadm --manage /dev/md0 --remove /dev/sdb
  3. Thay thế phần cứng vật lý: Rút thay khay nóng (hot-swap) hoặc tắt máy nếu backplane không hỗ trợ hot-plug. Đảm bảo ổ mới có dung lượng ít nhất bằng ổ cũ—chỉ cần thiếu một sector duy nhất, mdadm cũng sẽ từ chối nhận ổ.
  4. Thêm ổ mới vào mảng: Sau khi Linux nhận diện ổ đĩa mới (xác minh định danh bằng lsblk), đưa ổ vào mảng đang bị degraded:

    sudo mdadm --manage /dev/md0 --add /dev/sdb
  5. Theo dõi tiến trình rebuild: Kernel sẽ tự động kích hoạt quá trình đồng bộ hóa dữ liệu. Theo dõi thanh tiến trình, thời gian hoàn thành dự kiến và tốc độ ghi:

    watch -n 2 cat /proc/mdstat

Tự động gửi cảnh báo qua Email khi mảng bị xuống cấp

Những sự cố phần cứng âm thầm sẽ dẫn đến mất dữ liệu hoàn toàn nếu ổ đĩa thứ hai lăn ra hỏng trước khi bạn kịp phát hiện ổ đầu tiên. Hãy cấu hình daemon giám sát của mdadm để gửi email cảnh báo ngay lập tức về hộp thư vận hành khi mảng bị degraded. Chỉnh sửa /etc/mdadm/mdadm.conf:

MAILADDR [email protected]

Gửi thông báo thử nghiệm (dry-run) để đảm bảo mail transfer agent cục bộ (như Postfix hoặc msmtp) đang hoạt động chuẩn xác:

sudo mdadm --monitor --scan --test --oneshot

Kiểm tra hộp thư. Sau khi email thử nghiệm gửi về thành công, khởi động và kích hoạt daemon systemd để hệ thống tự động kiểm tra sức khỏe liên tục:

sudo systemctl enable --now mdmonitor
Share: