Dạo gần đây mình cần ổ logic với dung lượng lớn, trong khi ổ vật lý với dung lượng lớn thì đòi hỏi chi phí cao và dung lượng càng lớn thì càng hiếm và đắt. Giải pháp đặt ra là cần kết hợp nhiều ở cứng vật lý dụng lượng nhỏ thành ổ logic với dung lượng lớn. Và vì vậy mình tìm hiểu đến RAID và mình đã chọn RAID0 để làm điều này.
Do lần đầu tìm hiểu không thể tránh khỏi sai sót nên mình quyết định nghiên cứu và thử nghiệm trên một con EC2 EC2 t2.medium (2 CPU, 4G RAM) với 1 ổ chính 28G và thêm 2 ổ phụ mỗi ổ 30G. Mình sử dụng dịch vụ EC2 tiện hơn vì nếu có vấn đề gì sai, lỗi thì mình tạo lại cũng rất nhanh.
Mình chỉ triển khai trên server thật sau khi việc thử nghiệm ít nhất 2 lần okie.
Hướng dẫn tạo RAID1
Để thực hiện việc này, tôi đã tham khảo bài viết Hướng dẫn cấu hình RAID 1 trên CentOS, tôi thực hiện theo khá okie.
Để bắt đầu thử nghiệm, tôi tạo EC2 t2.medium (2 CPU, 4G RAM) với 1 ổ chính và thêm 2 ổ phụ để thử nghiệm RAID. Kiểm tra thông tin ổ đĩa bằng lệnh:
lsblk
------------------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.9M 1 loop /snap/amazon-ssm-agent/7628
loop1 7:1 0 55.7M 1 loop /snap/core18/2812
loop2 7:2 0 63.9M 1 loop /snap/core20/2182
loop3 7:3 0 87M 1 loop /snap/lxd/27037
loop4 7:4 0 40.4M 1 loop /snap/snapd/20671
xvda 202:0 0 28G 0 disk
├─xvda1 202:1 0 27.9G 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
xvdb 202:16 0 30G 0 disk
xvdc 202:32 0 30G 0 disk
Như trên ta thấy xvda là ổ chính chứa hệ điều hành, chúng ta có 2 ổ phụ là xvdb và xvdc là hai ổ phụ cùng kích thước. Chúng ta sẽ sử dụng hai ổ phụ này để tạo RAID 1. Các bước thực hiện như sau:
* B1: Sử dụng fdisk để tạo phân vùng cho hai ổ phụ
Đầu tiên chúng ta tạo phân vùng cho ổ thứ nhất bằng lệnh dưới, nhớ chuyển sang tài khoản root để thực hiện:
# Nhập n -> p -> w
fdisk /dev/xvdb
-----------------------------
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-62914559, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559):
Created a new partition 1 of type 'Linux' and of size 30 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Làm tương tự với ổ còn lại:
fdisk /dev/xvdc
-------------------------------
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-62914559, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559):
Created a new partition 1 of type 'Linux' and of size 30 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Kiểm tra lại phân vùng:
lsblk
-------------------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.9M 1 loop /snap/amazon-ssm-agent/7628
loop1 7:1 0 55.7M 1 loop /snap/core18/2812
loop2 7:2 0 63.9M 1 loop /snap/core20/2182
loop3 7:3 0 87M 1 loop /snap/lxd/27037
loop4 7:4 0 40.4M 1 loop /snap/snapd/20671
xvda 202:0 0 28G 0 disk
├─xvda1 202:1 0 27.9G 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
xvdb 202:16 0 30G 0 disk
└─xvdb1 202:17 0 30G 0 part
xvdc 202:32 0 30G 0 disk
└─xvdc1 202:33 0 30G 0 part
* B2: Tạo ổ RAID1 từ 2 ổ phụ trên
Bây giờ chúng ta tạo ổ md1 dạng RAID1 từ hai phân vùng xvdb1 và xvdc1 vừa tạo ở trên. Lệnh như sau
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/xvd[b-c]1
---------------------------------
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array?
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@ip-172-31-85-83:~#
Sau đó ta kiểm tra lại:
lsblk
------------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.9M 1 loop /snap/amazon-ssm-agent/7628
loop1 7:1 0 55.7M 1 loop /snap/core18/2812
loop2 7:2 0 63.9M 1 loop /snap/core20/2182
loop3 7:3 0 87M 1 loop /snap/lxd/27037
loop4 7:4 0 40.4M 1 loop /snap/snapd/20671
xvda 202:0 0 28G 0 disk
├─xvda1 202:1 0 27.9G 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
xvdb 202:16 0 30G 0 disk
└─xvdb1 202:17 0 30G 0 part
└─md1 9:1 0 30G 0 raid1
xvdc 202:32 0 30G 0 disk
└─xvdc1 202:33 0 30G 0 part
└─md1 9:1 0 30G 0 raid1
Như vậy việc tạo đã thành công, giờ ta kiểm tra tiến trình sync đã hoàn thành chưa bằng lệnh:
cat /proc/mdstat
------------------------------
Personalities : [raid1]
md1 : active raid1 xvdc1[1] xvdb1[0]
31438848 blocks super 1.2 [2/2] [UU]
[===========>.........] resync = 59.8% (18813184/31438848) finish=3.3min speed=62643K/sec
unused devices: <none>
Chúng ta chờ vài phút rồi kiểm tra lại, khi nào hoàn thành bạn sẽ thấy thông tin như dưới:
cat /proc/mdstat
-------------------------------
Personalities : [raid1]
md1 : active raid1 xvdc1[1] xvdb1[0]
31438848 blocks super 1.2 [2/2] [UU]
mdadm --detail /dev/md1
-------------------------------
/dev/md1:
Version : 1.2
Creation Time : Mon Apr 15 04:11:19 2024
Raid Level : raid1
Array Size : 31438848 (29.98 GiB 32.19 GB)
Used Dev Size : 31438848 (29.98 GiB 32.19 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Apr 15 04:19:41 2024
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : ip-172-31-85-83:1 (local to host ip-172-31-85-83)
UUID : e5a05365:01be9d28:84880ace:7e734bd9
Events : 17
Number Major Minor RaidDevice State
0 202 17 0 active sync /dev/xvdb1
1 202 33 1 active sync /dev/xvdc1
* B3: Tạo file hệ thống trên Raid1
Ta sử dụng lệnh sau để tạo file hệ thống:
mkfs.ext4 /dev/md1
-------------------------------
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 7859712 4k blocks and 1966080 inodes
Filesystem UUID: 918ce0b9-5e5f-4e24-904f-f91bda0c509b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
* B4: Thực hiện mount ổ raid vào hệ thống
Chúng ta sử dụng lệnh sau để mount vào hệ thống:
mkdir /mnt/md1
mount /dev/md1 /mnt/md1
Kiểm tra lại xem mount thành công chưa:
df -h
---------------------------
Filesystem Size Used Avail Use% Mounted on
/dev/root 27G 1.6G 26G 6% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 781M 884K 780M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/xvda15 105M 6.1M 99M 6% /boot/efi
tmpfs 391M 4.0K 391M 1% /run/user/1000
/dev/md1 30G 24K 28G 1% /mnt/md1
Nếu bạn muốn hệ thống tự động mount khi reboot thì chúng ta cần sửa tệp /ect/fstab và thêm dòng sau (Cái này tôi chưa test):
/dev/md1 /mnt/md1 ext4 noatime,rw 0 0
Để theo dõi trạng thái của ổ RAID ta đánh lệnh sau:
watch -n 2 cat /proc/mdstat
Bây giờ chúng ta chuyển để thư mục /mnt/md1 và tạo thử một số dữ liệu!
Thực hiện chuyển từ RAID1 sang RAID0 mà không cần cài lại
Như trên, chúng ta đã tạo ổ RAID1 /dev/md1 từ hai phân vùng /dev/xvdb1 và /dev/xvdc1. Bây giờ chúng ta thực hiện chuyển ổ này sang RAID0.
Sau khi tìm kiếm thông tin trên mạng, đặc biệt từ bài viết Is it possible to convert RAID1 to RAID0 without system reinstalation?, tôi đã thực hiện thành công. Các bước thực hiện như sau:
* B1: Thực hiện loại bỏ 1 ổ ra khỏi RAID1
Bây giờ chúng ta loại bỏ phân vùng /dev/xvdc1 khỏi RAID1 bằng lệnh sau:
# Đầu tiên thiết lập phân vùng /dev/xvdc1
mdadm /dev/md1 --fail /dev/xvdc1
--------------------------
mdadm: set /dev/xvdc1 faulty in /dev/md1
# Loại bỏ phân vùng /dev/xvdc1 khỏi RAID1
mdadm /dev/md1 --remove /dev/xvdc1
--------------------------
mdadm: hot removed /dev/xvdc1 from /dev/md1
* B2: Chuyển từ RAID1 sang RAID0
Sử dụng lệnh sau để chuyển ổ /dev/md1 sang RAID0:
mdadm /dev/md1 --grow --level=0
* B3: Thêm phân vùng /dev/xvdc1 vào ổ /dev/md1
Thực hiện thêm ổ /dev/xvdc1 vào ổ RAID0:
mdadm --grow /dev/md1 --level=0 --raid-devices=2 --add /dev/xvdc1
Chúng ta kiểm tra bằng lệnh sau:
cat /proc/mdstat
-------------------------------
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md1 : active raid4 xvdc1[2] xvdb1[0]
31438848 blocks super 1.2 level 4, 64k chunk, algorithm 5 [3/2] [U__]
[>....................] reshape = 4.6% (1447636/31438848) finish=15.7min speed=31647K/sec
unused devices: <none>
Như trên cần thời gian ~16 phút để hoàn thành reshape, thời gian phụ thuộc lượng dữ liệu có trong ổ.
Áp dụng chuyển từ RAID1 sang RAID0 cho bài toán thực tế
Thực tế mình đang chạy BaseNode sử dụng RAID1 (Mặc định tại thời điểm server bàn giao), nên tổng dung lượng phần cứng là 7TB nhưng thực tế do dùng RAID1 nên dung lượng sử dụng thực tế chỉ có 3.5TB. Hiện tại dung lượng sử dụng gần hết nên cần chuyển sang RAID0 để sử dụng tối đa dung lượng.
Thông tin ổ hiện tại như dưới:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 3.5T 0 disk
├─nvme0n1p1 259:2 0 256M 0 part /boot/efi
├─nvme0n1p2 259:3 0 4G 0 part
│ └─md0 9:0 0 4G 0 raid1 [SWAP]
├─nvme0n1p3 259:4 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1 /boot
└─nvme0n1p4 259:5 0 3.5T 0 part
└─md2 9:2 0 3.5T 0 raid1 /
nvme1n1 259:1 0 3.5T 0 disk
├─nvme1n1p1 259:6 0 256M 0 part
├─nvme1n1p2 259:7 0 4G 0 part
│ └─md0 9:0 0 4G 0 raid1 [SWAP]
├─nvme1n1p3 259:8 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1 /boot
└─nvme1n1p4 259:9 0 3.5T 0 part
└─md2 9:2 0 3.5T 0 raid1 /
Hai disk hiện tại chia làm 4 ổ logic đều là RAID1 trong đó có 1 ổ sử dụng cho khởi động, 1 ổ cho swap và một ổ cho OS, còn lại sử dụng lưu trữ dữ liệu. Đây là điểm khác biệt lớn so với thử nghiệm ở phần trên, hai ổ thử nghiệm hoàn toàn độc lập và ko dính dáng gì tới hệ điều hành.
Và khi áp dụng các thao tác trên thì không thành công. Cuối cùng khởi động qua hệ điều hành tạm để sử dụng thì hỏng luông hệ điều hành cũ. Cuối cùng đặt phải cài đặt lại từ đầu.
Có thể bạn quan tâm: Hướng dẫn gộp 2 phân vùng RAID1 liên tiếp trên Linux / Ubuntu sử dụng dòng lệnh trên server Hetzner
Trả lời