Hướng dẫn cấu hình Virtual Data Optimizer (VDO) trên CentOS Stream 9: Tối ưu dung lượng lưu trữ với nén và Deduplication

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

So sánh các giải pháp tối ưu dung lượng lưu trữ trên Linux

Thiếu hụt dung lượng ổ cứng là bài toán muôn thuở khi quản trị Storage Server, máy chủ Backup hay cụm ảo hóa KVM. Để giải quyết triệt để vấn đề này ở tầng block và filesystem, dân hệ thống thường cân nhắc 3 hướng đi chính:

  • ZFS (ZFS on Linux): Cơ chế nén và deduplication của ZFS cực mạnh. Tuy nhiên, nó không nằm sẵn trong mainline kernel của RHEL/CentOS do xung đột bản quyền (CDDL vs GPL). Bạn buộc phải build module ngoài qua DKMS. Điểm trừ lớn nhất là ZFS ngốn RAM kinh khủng, thường yêu cầu từ 1GB đến 5GB RAM cho mỗi 1TB dữ liệu lưu trữ nếu bật dedup.
  • Btrfs: Khả năng nén transparent (zstd, lzo) hoạt động rất mượt. Dù vậy, deduplication trên Btrfs không chạy inline theo thời gian thực mà phải quét offline bằng công cụ ngoài như duperemove. Chưa kể, Red Hat đã ngừng hỗ trợ Btrfs trên Enterprise Linux từ nhiều năm nay.
  • Virtual Data Optimizer (VDO): Giải pháp cây nhà lá vườn do Red Hat phát triển và nhúng trực tiếp vào nhân Linux. VDO đóng vai trò như một block device ảo. Nó tự động loại bỏ block rỗng (Zero-block elimination), dedup inline qua UDS index và nén dữ liệu bằng thuật toán LZ4 ngay trước khi ghi xuống đĩa cứng.

Bảng so sánh nhanh các phương án

Bảng tổng hợp dưới đây giúp bạn dễ dàng chọn giải pháp phù hợp với hạ tầng hiện có:

Tiêu chí ZFS on Linux Btrfs (Offline Dedup) LVM-VDO (CentOS Stream 9)
Deduplication Inline, ngốn nhiều RAM Offline (quét batch theo lịch) Inline (UDS index, tiêu tốn ít RAM)
Nén dữ liệu Inline (LZ4, ZSTD) Inline (ZLIB, ZSTD, LZO) Inline (LZ4 qua CPU)
Tương thích Kernel RHEL/CentOS Cần repo bên thứ ba Không hỗ trợ chính thức Hỗ trợ native, tích hợp sẵn vào LVM2
Mức ngốn tài nguyên Rất cao (RAM & CPU) Tăng vọt lúc chạy quét Vừa phải, tùy biến được RAM cho UDS

Vì sao LVM-VDO là lựa chọn hàng đầu trên CentOS Stream 9?

Trước đây trên CentOS 7 và 8, VDO là một daemon độc lập điều khiển qua lệnh vdo và vdomgr. Bước sang RHEL 9 và CentOS Stream 9, Red Hat đã thay đổi hoàn toàn cuộc chơi. Họ khai tử gói quản lý riêng lẻ và tích hợp thẳng VDO vào bộ công cụ LVM2 (LVM-VDO).

Sự thay đổi này mang lại 3 lợi thế rất rõ:

  • Quản trị quen thuộc: Bạn dùng lại 100% các lệnh LVM hàng ngày như lvcreate, lvextend hay lvs. Không cần nhớ thêm bất kỳ CLI đặc thù nào khác.
  • Thin Provisioning linh hoạt: Bạn thoải mái overcommit dung lượng logic lớn gấp 3 đến 5 lần ổ cứng vật lý dựa trên tỷ lệ nén ước tính.
  • Cực kỳ hiệu quả cho VM và Backup: Kho chứa template máy ảo (qcow2/raw) hoặc thư mục backup hàng ngày thường trùng lặp dữ liệu từ 60% đến 85%. Với VDO, 500GB bản backup có thể chỉ chiếm vỏn vẹn 120GB trên đĩa thật.

Hướng dẫn cấu hình LVM-VDO từng bước

Giả sử server gắn thêm một ổ đĩa /dev/sdb dung lượng vật lý 50GB. Mục tiêu của chúng ta là tạo ra phân vùng ảo 150GB để lưu trữ dữ liệu.

Bước 1: Cài đặt gói bổ trợ và nạp module kernel

Cài đặt các gói LVM và driver VDO trực tiếp từ repo mặc định của CentOS 9:

sudo dnf install -y lvm2 kmod-kvdo vdo

# Nạp module kernel kvdo
sudo modprobe kvdo
lsmod | grep kvdo

Bước 2: Khởi tạo Physical Volume và Volume Group

Tạo Physical Volume trên /dev/sdb rồi gộp vào Volume Group có tên vg_storage:

# Khởi tạo PV
sudo pvcreate /dev/sdb

# Khởi tạo VG
sudo vgcreate vg_storage /dev/sdb

Bước 3: Tạo VDO Pool và Logical Volume

Dùng lệnh lvcreate kèm tham số --type vdo. Ví dụ: Cắt 40GB đĩa vật lý làm pool xử lý dedup/nén, đồng thời cấp phát 150GB dung lượng ảo (Virtual Size) cho hệ thống:

sudo lvcreate --type vdo \
  -n vdo_volume \
  -L 40G \
  -V 150G \
  --vdo-pool vdo_pool \
  vg_storage

Giải thích các tham số quan trọng:

  • -L 40G: Dung lượng thực tế trích từ Volume Group để lưu trữ data và bảng index.
  • -V 150G: Kích thước ảo (Virtual Size) mà hệ điều hành nhìn thấy.
  • --vdo-pool vdo_pool: Tên pool ngầm phụ trách việc nén và deduplication.
  • -n vdo_volume: Logical Volume cuối cùng dùng để format filesystem.

Bước 4: Format Filesystem và Mount

Format volume bằng XFS. Nhớ thêm cờ -K để bỏ qua thao tác TRIM toàn bộ block trống, giúp format tức thì mà không làm phình metadata:

# Format filesystem XFS với tùy chọn -K
sudo mkfs.xfs -K /dev/vg_storage/vdo_volume

# Tạo mount point và mount thử nghiệm
sudo mkdir -p /data_vdo
sudo mount /dev/vg_storage/vdo_volume /data_vdo

Để hệ thống tự mount khi reboot, hãy thêm dòng sau vào /etc/fstab:

echo '/dev/vg_storage/vdo_volume /data_vdo xfs defaults 0 0' | sudo tee -a /etc/fstab

Bước 5: Đánh giá tỷ lệ nén và chống trùng lặp thực tế

Để xem mức tiết kiệm dung lượng, bạn dùng công cụ vdostats:

sudo vdostats --human-readable

Đầu ra thực tế sau khi copy thử 5 bản clone máy ảo Ubuntu 22.04 (mỗi máy 10GB):

Device                    Size      Used Available Use% Space saving%
vg_storage-vdo_pool-vpool 40.0G      9.8G     30.2G  24%           79%

Tổng dung lượng file gốc ghi vào là 50GB, nhưng dung lượng vật lý thực tế bị chiếm dụng chưa tới 10GB. Tỷ lệ tiết kiệm (Space saving%) đạt gần 80%.

Kinh nghiệm vận hành và Best Practices

  • Luôn giám sát dung lượng đĩa vật lý: Overprovisioning là con dao hai lưỡi. Nếu ổ đĩa vật lý đầy 100%, volume VDO sẽ tự động chuyển sang chế độ read-only để bảo vệ dữ liệu. Bạn nên kiểm tra định kỳ bằng lệnh lvs -a -o +vdo_operating_mode,vdo_compression,vdo_deduplication hoặc setup alert trên Prometheus khi dung lượng pool vượt quá 85%.
  • Tối ưu RAM với Sparse Index: Mặc định UDS index dùng dạng dense (tốn khoảng 1GB RAM để index 1TB storage). Nếu máy chủ ít RAM, bạn có thể truyền thêm cờ --vdo-pool-args '--uds-memory-size=sparse' để giảm 80% lượng RAM tiêu thụ, chỉ giữ lại footprint khoảng 250MB.
  • Không đưa file đã nén vào VDO: Các định dạng nén sẵn như .tar.gz, .zip, video mp4 hoặc cơ sở dữ liệu đã mã hóa không thể nén hay dedup thêm. Ghi các file này vào VDO chỉ gây lãng phí chu kỳ xử lý của CPU.
Share: