GlusterFS là hệ thống lưu trữ phân tán mã nguồn mở, ban đầu do Gluster phát triển và hiện được Red Hat duy trì. Nó được thiết kế để đáp ứng nhu cầu lưu trữ dữ liệu quy mô lớn với khả năng mở rộng cao, hiệu suất mạnh mẽ và độ tin cậy vượt trội.
Kiến trúc cốt lõi
- Mở rộng ngang (Scale-Out): Dễ dàng tăng dung lượng và hiệu năng bằng cách thêm node lưu trữ mới. Hỗ trợ mạng tốc độ cao như 10GbE hoặc InfiniBand.
- Thuật toán Elastic Hash: Loại bỏ phụ thuộc vào máy chủ metadata, giúp tránh điểm nghẽn và lỗi đơn điểm. Dữ liệu được định vị trực tiếp qua hàm băm mà không cần truy vấn trung tâm.
- Tính sẵn sàng cao: Tự động nhân bản dữ liệu (mirror/replica), tự sửa chữa khi phát hiện bất đồng bộ — hoạt động nền, gần như không ảnh hưởng hiệu năng.
- Không gian tên thống nhất: Gộp toàn bộ không gian lưu trữ từ các node thành một "ổ đĩa ảo" duy nhất, dễ quản lý và truy cập.
- Quản lý volume linh hoạt: Có thể mở rộng/thu nhỏ volume trực tuyến, cân bằng tải giữa các node, thay đổi cấu hình mà không cần downtime.
- Giao thức chuẩn: Hỗ trợ NFS, SMB/CIFS, HTTP, FTP và cả giao thức gốc. Tương thích đầy đủ POSIX — ứng dụng cũ không cần chỉnh sửa vẫn hoạt động.
Thuật ngữ trọng tâm
- Brick: Đơn vị lưu trữ cơ sở, thường là thư mục hoặc phân vùng trên máy vật lý. Định dạng:
IP:/đường_dẫn. - Volume: Tập hợp logic của nhiều brick, là đối tượng chính để quản lý và mount.
- FUSE: Module nhân Linux cho phép tạo filesystem trong không gian người dùng — GlusterFS dựa vào đây để giao tiếp với ứng dụng.
- VFS: Lớp trừu tượng kernel giúp ứng dụng truy cập nhiều loại filesystem khác nhau.
- Glusterd: Daemon quản lý chạy trên mỗi node, xử lý tạo/xóa volume, cân bằng dữ liệu, v.v.
- Striping: Kỹ thuật chia nhỏ file thành các mảnh (stripe) rồi phân tán lên nhiều brick để tăng băng thông I/O.
Luồng hoạt động
- Ứng dụng truy cập dữ liệu qua điểm mount GlusterFS.
- Hệ thống kernel xử lý yêu cầu qua VFS.
- VFS chuyển tiếp tới FUSE → gửi dữ liệu qua
/dev/fuseđến client GlusterFS. - Client xử lý logic (băm, striping, replica...) theo cấu hình volume.
- Dữ liệu được gửi qua mạng đến server GlusterFS và ghi vào brick tương ứng.
Các loại volume
| Loại Volume | Mô tả | Ưu điểm | Nhược điểm |
|---|---|---|---|
| Phân tán (Distributed) | Dữ liệu trải đều trên nhiều brick, không sao lưu. | Dễ mở rộng, chi phí thấp | Không có redundancy → mất dữ liệu nếu brick hỏng |
| Striped | Chia file thành mảnh nhỏ, ghi song song lên nhiều brick. | Tăng tốc độ đọc/ghi | Không có redundancy |
| Replicated | Mỗi file được lưu bản sao giống hệt trên nhiều brick. | Độ tin cậy cao, chịu lỗi tốt | Tốn gấp đôi (hoặc hơn) dung lượng lưu trữ |
| Distributed Striped | Kết hợp phân tán + striping | Hiệu năng cao, dễ mở rộng | Không có redundancy |
| Distributed Replicated | Kết hợp phân tán + replica | Vừa mở rộng dễ, vừa an toàn dữ liệu | Tốn dung lượng, phức tạp hơn |
| Striped Replicated | Striping + Replica | Hiệu năng cao + an toàn | Rất tốn tài nguyên lưu trữ |
| Distributed Striped Replicated | Kết hợp cả 3: phân tán, striping, replica | Hiệu năng cực cao + khả năng chịu lỗi mạnh | Yêu cầu nhiều node, chi phí cao |
Triển khai thực tế
Môi trường thử nghiệm:
- 4 node server: node1–node4 (IP: 192.168.240.10–13)
- 1 node client: node5 (IP: 192.168.240.14)
- Mỗi server gắn 4 ổ cứng → phân vùng, format XFS, mount tại
/data/sd[b-e]1
Bước 1: Chuẩn bị hệ thống
# Tắt firewall & SELinux (tất cả node)
systemctl stop firewalld
setenforce 0
# Cấu hình hostname & hosts
hostnamectl set-hostname nodeX
echo "192.168.240.X nodeX" >> /etc/hosts
# Quét lại ổ cứng mới
for i in {0..2}; do echo "- - -" > /sys/class/scsi_host/host$i/scan; done
# Phân vùng tự động (script)
#!/bin/bash
disks=$(ls /dev/sd[b-z] 2>/dev/null | grep -o 'sd[b-z]')
for d in $disks; do
parted -s /dev/$d mklabel gpt mkpart primary xfs 0% 100%
mkfs.xfs -f /dev/${d}1
mkdir -p /data/${d}1
echo "/dev/${d}1 /data/${d}1 xfs defaults 0 0" >> /etc/fstab
done
mount -a
Bước 2: Cài đặt GlusterFS
# Tạo repo cục bộ (hoặc dùng repo chính thức)
cd /opt && unzip gfsrepo.zip
cat > /etc/yum.repos.d/glfs.repo <<EOF
[glfs]
name=Local GlusterFS Repo
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
EOF
yum clean all && yum makecache
yum install -y glusterfs-server glusterfs-fuse
systemctl enable --now glusterd
</code>
Bước 3: Thiết lập cluster
# Trên node1, thêm các node còn lại vào pool
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
# Kiểm tra trạng thái
gluster peer status
Bước 4: Tạo và mount các loại volume
# 1. Distributed Volume
gluster volume create vol_dist node1:/data/sdb1 node2:/data/sdb1 force
gluster volume start vol_dist
# 2. Striped Volume (2 stripe)
gluster volume create vol_stripe stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start vol_stripe
# 3. Replicated Volume (2 bản sao)
gluster volume create vol_rep replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start vol_rep
# 4. Distributed Striped (4 brick, 2 stripe)
gluster volume create vol_dist_stripe stripe 2 \
node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start vol_dist_stripe
# 5. Distributed Replicated (4 brick, 2 replica)
gluster volume create vol_dist_rep replica 2 \
node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start vol_dist_rep
Bước 5: Mount từ client
mkdir -p /mnt/{dist,stripe,rep,dist_stripe,dist_rep}
# Mount từng volume
mount -t glusterfs node1:/vol_dist /mnt/dist
mount -t glusterfs node1:/vol_stripe /mnt/stripe
mount -t glusterfs node1:/vol_rep /mnt/rep
mount -t glusterfs node1:/vol_dist_stripe /mnt/dist_stripe
mount -t glusterfs node1:/vol_dist_rep /mnt/dist_rep
# Mount tự động khi khởi động
echo "node1:/vol_dist /mnt/dist glusterfs defaults,_netdev 0 0" >> /etc/fstab
# ... lặp lại cho các volume còn lại
Bước 6: Kiểm thử tính chịu lỗi
# Tạo dữ liệu test
cd /mnt/dist && for i in {1..5}; do dd if=/dev/zero of=file$i bs=40M count=1; done
# Mô phỏng sự cố: tắt node2
systemctl stop glusterd # trên node2
# Kiểm tra client:
# - Distributed: mất file nằm trên node2
# - Striped/Dist-Stripe: không truy cập được (không có redundancy)
# - Replicated/Dist-Rep: vẫn hoạt động bình thường
Bước 7: Quản trị & bảo trì
# Liệt kê volume
gluster volume list
# Xem thông tin chi tiết
gluster volume info [tên_volume]
# Kiểm tra trạng thái
gluster volume status
# Dừng & xóa volume
gluster volume stop vol_name
gluster volume delete vol_name
# Cấu hình quyền truy cập
gluster volume set vol_name auth.allow 192.168.240.*
gluster volume set vol_name auth.deny 192.168.240.100