Tổng quan về kiến trúc RAID
RAID (Redundant Array of Independent Disks) là giải pháp kết hợp nhiều thiết bị lưu trữ vật lý thành một khối logic, nhằm tối ưu hiệu năng I/O hoặc đảm bảo tính toàn vẹn dữ liệu. Các chuẩn phổ biến trong doanh nghiệp bao gồm:
- Level 0: Kỹ thuật phân dải (striping). Dữ liệu được cắt nhỏ và ghi song song lên nhiều đĩa. Tốc độ đọc/ghi tăng đáng kể nhưng không có cơ chế dự phòng.
- Level 1: Kỹ thuật gương (mirroring). Mỗi khối dữ liệu được sao chép y nguyên lên ít nhất 2 đĩa. Độ an toàn cao, tốc độ đọc được cải thiện, nhưng dung lượng hữu ích chỉ bằng 50%.
- Level 5: Kết hợp phân dải và mã chẵn lẻ (parity). Parity được phân phối luân phiên trên các đĩa. Cho phép hỏng 1 đĩa mà không mất dữ liệu. Hiệu suất ghi giảm nhẹ do phải tính toán parity.
- Level 10: Kiến trúc lồng ghép. Trước tiên tạo các cặp RAID 1, sau đó kết hợp chúng thành mảng RAID 0. Cân bằng được tốc độ và độ tin cậy, thường dùng cho cơ sở dữ liệu quan trọng.
Chuẩn bị môi trường giả lập
Để minh họa quy trình, ta sử dụng một đĩa trống /dev/vdb (20 GB). Đầu tiên, định dạng bảng phân vùng sang chuẩn GPT và chia nhỏ thành nhiều phân vùng 1 GB để mô phỏng các đĩa vật lý độc lập.
[root@node ~]# parted /dev/vdb mklabel gpt
[root@node ~]# partprobe /dev/vdb
Sau đó, sử dụng fdisk để tạo các phân vùng cần thiết. Quá trình này được thực hiện tương tác, nhưng ta có thể tóm tắt các lệnh tạo phân vùng 1 GB liên tiếp:
[root@node ~]# fdisk /dev/vdb
# Lặp lại lệnh 'n' để tạo phân vùng, nhập kích thước '+1G' cho từng phân vùng từ 1 đến 12.
# Sau khi hoàn tất, lưu cấu hình bằng lệnh 'w'.
Xác nhận danh sách phân vùng đã được kernel nhận diện:
[root@node ~]# lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 252:16 0 20G 0 disk
├─vdb1 252:17 0 1G 0 part
├─vdb2 252:18 0 1G 0 part
├─vdb3 252:19 0 1G 0 part
├─vdb4 252:20 0 1G 0 part
├─vdb5 252:21 0 1G 0 part
├─vdb6 252:22 0 1G 0 part
├─vdb7 252:23 0 1G 0 part
├─vdb8 252:24 0 1G 0 part
├─vdb9 252:25 0 1G 0 part
├─vdb10 252:26 0 1G 0 part
├─vdb11 252:27 0 1G 0 part
└─vdb12 252:28 0 1G 0 part
Triển khai RAID 0 (Striping)
RAID 0 yêu cầu tối thiểu 2 phân vùng. Ta sử dụng vdb1 và vdb2 để tạo mảng /dev/md0.
[root@node ~]# mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/vdb1 /dev/vdb2
Kiểm tra trạng thái mảng và định dạng hệ thống tệp XFS:
[root@node ~]# mdadm --detail /dev/md0
[root@node ~]# mkfs.xfs -f /dev/md0
Tạo thư mục挂载 điểm và cấu hình khởi động tự động:
[root@node ~]# mkdir -p /data/striping
[root@node ~]# echo "/dev/md0 /data/striping xfs defaults 0 0" >> /etc/fstab
[root@node ~]# mount -a
Triển khai RAID 1 (Mirroring)
Sử dụng vdb3 và vdb4 để xây dựng mảng gương /dev/md1. Cơ chế này sẽ sao chép toàn bộ dữ liệu đồng thời lên cả hai phân vùng.
[root@node ~]# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/vdb3 /dev/vdb4
[root@node ~]# mkfs.xfs -f /dev/md1
[root@node ~]# mkdir -p /data/mirror
[root@node ~]# echo "/dev/md1 /data/mirror xfs defaults 0 0" >> /etc/fstab
[root@node ~]# mount -a
Triển khai RAID 5 (Parity) và mô phỏng sự cố
RAID 5 yêu cầu tối thiểu 3 đĩa dữ liệu. Ở đây, ta dùng vdb5, vdb6, vdb7 làm đĩa chủ, và vdb8 làm đĩa dự phòng nóng (spare). Khi một đĩa chủ bị lỗi, kernel sẽ tự động kích hoạt đĩa spare để rebuild mảng.
[root@node ~]# mdadm --create --verbose /dev/md5 --level=5 --raid-devices=3 /dev/vdb5 /dev/vdb6 /dev/vdb7 --spare-devices=1 /dev/vdb8
Định dạng và gắn mount tương tự các bước trước:
[root@node ~]# mkfs.xfs -f /dev/md5
[root@node ~]# mkdir -p /data/parity
[root@node ~]# echo "/dev/md5 /data/parity xfs defaults 0 0" >> /etc/fstab
[root@node ~]# mount -a
Mô phỏng hỏng đĩa và phục hồi:
Giả sử vdb5 gặp sự cố vật lý. Ta báo cáo lỗi với mdadm:
[root@node ~]# mdadm /dev/md5 --fail /dev/vdb5
Kiểm tra trạng thái, ta sẽ thấy hệ thống tự động chuyển vdb8 sang trạng thái rebuilding để khôi phục dữ liệu. Sau khi hoàn tất, đĩa lỗi cần được loại bỏ khỏi cấu hình:
[root@node ~]# mdadm /dev/md5 --remove /dev/vdb5
Khi thay thế đĩa vật lý mới hoặc sửa chữa xong, gắn lại phân vùng vào mảng với vai trò dự phòng:
[root@node ~]# mdadm /dev/md5 --add /dev/vdb5
Triển khai RAID 10 (Nested Array)
RAID 10 không hỗ trợ tạo trực tiếp bằng một lệnh đơn giản trong các phiên bản kernel cũ. Quy trình chuẩn là tạo 2 mảng RAID 1 độc lập, sau đó gộp chúng thành RAID 0. Sử dụng vdb9 đến vdb12.
Bước 1: Tạo hai cặp gương /dev/md10a và /dev/md10b
[root@node ~]# mdadm --create --verbose /dev/md10a --level=1 --raid-devices=2 /dev/vdb9 /dev/vdb10
[root@node ~]# mdadm --create --verbose /dev/md10b --level=1 --raid-devices=2 /dev/vdb11 /dev/vdb12
Bước 2: Gộp hai mảng trên thành RAID 0
[root@node ~]# mdadm --create --verbose /dev/md10 --level=0 --raid-devices=2 /dev/md10a /dev/md10b
Định dạng bằng ext4 (phù hợp cho workload có nhiều tệp nhỏ) và hoàn tất cấu hình:
[root@node ~]# mkfs.ext4 -F /dev/md10
[root@node ~]# mkdir -p /data/nested
[root@node ~]# echo "/dev/md10 /data/nested ext4 defaults 0 0" >> /etc/fstab
[root@node ~]# mount -a
Xác nhận cấu trúc phân cấp đã hoạt động đúng:
[root@node ~]# lsblk -o NAME,TYPE,MOUNTPOINT,FSTYPE | grep -E "vdb|md"
vdb1 part
└─md0 raid0
└─/data/striping xfs
vdb2 part
└─md0 raid0
└─/data/striping xfs
vdb3 part
└─md1 raid1
└─/data/mirror xfs
vdb4 part
└─md1 raid1
└─/data/mirror xfs
vdb5 part
└─md5 raid5
└─/data/parity xfs
vdb6 part
└─md5 raid5
└─/data/parity xfs
vdb7 part
└─md5 raid5
└─/data/parity xfs
vdb8 part
└─md5 raid5
└─/data/parity xfs
vdb9 part
└─md10a raid1
└─md10 raid0
└─/data/nested ext4
vdb10 part
└─md10a raid1
└─md10 raid0
└─/data/nested ext4
vdb11 part
└─md10b raid1
└─md10 raid0
└─/data/nested ext4
vdb12 part
└─md10b raid1
└─md10 raid0
└─/data/nested ext4