Tổng quan
RAID (Redundant Array of Independent/Inexpensive Disks) không chỉ đơn thuần là gom nhiều ổ đĩa lại thành một thiết bị lưu trữ lớn hơn, mà còn cần đến metadata RAID để hệ điều hành và công cụ (ví dụ: mdadm
) biết cách sắp xếp, quản lý dữ liệu.
Metadata RAID đóng vai trò như bản đồ – nó ghi lại cấu hình mảng (RAID level, chunk size, layout, data offset, …). Nhờ metadata này, khi hệ thống khởi động lại hoặc khi cần phục hồi dữ liệu, công cụ RAID có thể tái dựng chính xác cách dữ liệu được striping/parity trên từng đĩa.
Trong bài viết này, ta sẽ tìm hiểu:
- Metadata RAID chứa những thông tin gì.
- RAID mapping dữ liệu ra sao (chunk, offset, parity).
- Luồng dữ liệu khi file được ghi từ client xuống RAID.
- Vì sao RAID cần metadata và cách nó khác với metadata của filesystem (ext4, xfs,…).
Metadata RAID chứa gì?
RAID (đặc biệt là RAID0) không có bản đồ ánh xạ (mapping table) 1:1 vị trí dữ liệu giống như file system. Tuy nhiên, RAID metadata vẫn có nhiệm vụ rất quan trọng.
Cụ thể với RAID0 và metadata version 1.2 (mặc định hiện nay), metadata thường chứa các thông tin sau:
Trường | Ý nghĩa |
---|---|
Magic Number | Định danh “tôi là RAID” (0xa92b4efc ) |
Version | Thường là 1.2 (nằm ở offset 0x2000 = 8 sector = 4 KiB sau đầu ổ) |
UUID của Array | Để xác định các ổ nào cùng thuộc 1 array |
Name | Tên array, ví dụ node77:0 |
RAID Level | RAID0, RAID1, RAID5,… |
Số lượng disk | Tổng số đĩa trong array |
Vị trí hiện tại (Device Role) | Đĩa này là disk 0 hay disk 1 |
Chunk size | Chunk size là bao nhiêu |
Data Offset | Dữ liệu thật bắt đầu từ đâu (thường là 3 MiB) |
Superblock Offset | Metadata này nằm ở đâu (thường là 8 sector = 4 KiB) |
Array State | AA (active-active), A. (mất 1 disk),… |
RAID0 không cần mapping?
RAID0 không lưu bản đồ vị trí dữ liệu như file system, vì:
- RAID0 striping theo quy tắc cố định cứ mỗi
chunk size
, dữ liệu được phân đều sang ổ kế tiếp. - Chỉ cần biết: offset, chunk size, thứ tự ổ là có thể tính toán lại chính xác dữ liệu nằm ở đâu.
Ví dụ: nếu chunk = 64K, thứ tự ổ là sdb-sdc, thì:
- Stripe 1 → sdb offset 3 MiB
- Stripe 2 → sdc offset 3 MiB
- Stripe 3 → sdb offset 3 MiB + 64K
- Stripe 4 → sdc offset 3 MiB + 64K
- … và cứ thế.
Do đó:
- RAID0 có metadata, nhưng nó chỉ chứa thông tin cấu hình – không phải bản đồ dữ liệu.
- Chính điều này khiến RAID0 dễ khôi phục bằng brute-force nếu metadata bị xóa – nhưng nếu chunk size hoặc order sai, dữ liệu vẫn sẽ lộn xộn không mount được.
Sơ đồ metadata RAID0 (v1.2)
Disk (ví dụ /dev/sdb hoặc /dev/sdc)
┌──────────────────────────────┐
│ Sector 0 │
│ ... │
│ (trống hoặc có boot sector) │
├──────────────────────────────┤
│ Sector 8 (4 KiB offset) │
│ → **RAID Superblock** │
│ - Magic: 0xa92b4efc │
│ - Version: 1.2 │
│ - UUID, Name │
│ - RAID Level: 0 │
│ - Chunk Size: 64K │
│ - Number of devices: 2 │
│ - Device Role: 0 hoặc 1 │
│ - Data Offset: 6144 sectors │
├──────────────────────────────┤
│ Sector 9 → Sector 6143 │
│ - (unused / padding) │
├──────────────────────────────┤
│ Sector 6144 (3 MiB offset) │
│ → **Bắt đầu dữ liệu RAID** │
│ - Stripe 1, 3, 5, … (tùy đĩa)│
└──────────────────────────────┘
Vậy khi client đọc/ghi file thì RAID làm gì?
RAID không xử lý file-level. File system (như ext4, xfs…) mới làm việc đó.
Cụ thể:
- Client ghi file → File system phân tích thành block 4K
- File system quyết định:
- Ghi block nào vào sector nào (ví dụ block 0 → sector 6144)
- Linux RAID driver (md) dùng:
- Chunk size
- Thứ tự ổ
- Offset (3 MiB)
→ để quyết định block 4K này nằm ổ nào, tại vị trí nào.
Ví dụ:
- Chunk size: 64K
- Ghi block 0 → offset 0 → thuộc chunk 0 → ghi lên disk 0
- Ghi block 16 (64K sau) → chunk 1 → ghi lên disk 1
- Ghi block 32 → chunk 2 → quay lại disk 0
RAID không cần biết đó là file gì, chỉ chia dữ liệu đều theo quy tắc cố định.
Dưới đây là sơ đồ luồng dữ liệu từ khi client ghi file cho đến khi dữ liệu được ghi lên disk qua RAID0
Luồng Ghi File → RAID0 (Chunk = 64K, Block = 4K)
┌────────────┐
│ Client │
│ ghi file │
└────┬───────┘
│
▼
┌────────────┐
│ FileSystem│ ← ví dụ: ext4
│ (chia file │
│ thành 4K │
│ blocks) │
└────┬───────┘
│
▼
┌────────────┐
│ MD RAID │
│ (RAID0) │
│ - Chunk=64K│
│ - Offset=3M│
└────┬───────┘
│
▼
┌────────────┬────────────┐
│ Disk 0 │ Disk 1 │
│ (/dev/sdb) │ (/dev/sdc) │
├────────────┼────────────┤
│ Chunk 0 │ │ ← block 0..15 (64K)
│ │ Chunk 1 │ ← block 16..31 (64K)
│ Chunk 2 │ │ ← block 32..47 (64K)
│ │ Chunk 3 │ ← block 48..63 (64K)
│ ... │ ... │
└────────────┴────────────┘
- Client chỉ gọi
write(file)
→ không biết bên dưới dùng RAID gì. - File system chia file thành nhiều block 4K.
- RAID0 gom block 4K thành từng chunk 64K rồi phân phối xen kẽ qua các disk.
- RAID0 không lưu tên file, đường dẫn, inode… – đó là việc của file system.
- Offset 3 MiB là nơi bắt đầu dữ liệu thật trên từng disk (metadata RAID nằm trước đó).
Cách hoạt động thực tế:
- Filesystem (ext4, xfs, v.v.):
- Ghi nhớ từng file nằm ở “block logic” nào (ví dụ: block 12345).
- Khi user cần đọc file, filesystem sẽ dịch block logic → vị trí vật lý trong RAID device
/dev/mdX
.
- RAID 0 (mdadm):
- Nhận yêu cầu đọc block từ filesystem (ví dụ: đọc block tại offset 5 MiB).
- Tự tính ra:
- Chunk nào
- Disk nào
- Offset trên disk là bao nhiêu
Tóm tắt:
RAID không cần lưu map file → disk vì filesystem lo việc đó.
RAID chỉ cần biết: offset bao nhiêu thì chia đều cho các disk theo chunk, luân phiên là xong.
Ví dụ minh họa:
- Bạn mở file
/etc/passwd
- Filesystem biết file này nằm từ block logic 1000 → 1003
- Nó yêu cầu RAID đọc block 1000
- RAID tính:
- Block 1000 → Offset trong RAID device
- Offset đó rơi vào chunk trên
/dev/sdb
hay/dev/sdc
- Đọc đúng chỗ, trả dữ liệu lên.
Dưới đây là sơ đồ tổng quát mô tả cách truy xuất dữ liệu trong RAID 0 không cần bản đồ map 1:1, nhờ vào sự phối hợp giữa filesystem và RAID logic:
Sơ đồ hoạt động tìm file trong RAID 0
[Ứng dụng người dùng]
│
▼
[Filesystem (ext4/xfs/...)]
- Biết file nằm ở block logic nào
- Ví dụ: block 1234
│
▼
[RAID 0 device /dev/mdX]
- Tính toán:
chunk_size = 64KB
RAID offset = block 1234 × 4KB = 4936KB
→ chunk thứ 77 = floor(4936 / 64) = 77
→ Disk = chunk 77 % 2 = 1 (disk2)
→ Offset trong disk = floor(77 / 2) × 64KB
│
▼
[Disk thực (e.g. /dev/sdc)]
- Đọc từ offset đã tính
│
▼
[Trả dữ liệu lên user space]
- Filesystem lưu “inode table” → quản lý file → block logic.
- RAID chỉ cần biết offset nằm chunk nào, phân phối sang disk nào theo thứ tự round-robin.
- Không cần map 1:1, vì toàn bộ quy trình là toán học dựa trên chunk size và số disk.
Kết luận
Metadata RAID là thành phần quan trọng để RAID có thể hoạt động đúng. Nó không lưu dữ liệu người dùng, nhưng lưu công thức để phân bổ dữ liệu trên các ổ đĩa.
- Nếu metadata bị mất hoặc sai, dữ liệu vẫn còn trên disk nhưng rất khó để đọc lại vì không biết mapping ban đầu.
- RAID không ánh xạ file 1:1 xuống disk – mà chỉ striping theo chunk, còn file system mới quản lý file và inode.
- Khi phục hồi, việc biết đúng Data Offset, Chunk Size, Layout, Order là yếu tố quyết định để tái dựng mảng thành công.
Nắm rõ cơ chế metadata và mapping giúp ta hiểu sâu hơn về cách RAID hoạt động, đồng thời dễ dàng hơn trong việc xử lý sự cố, phục hồi dữ liệu hay thiết kế hệ thống lưu trữ an toàn.