Triển khai Dịch vụ Lưu trữ S3 Dung Lượng Giới Hạn với ZFS và MinIO
🧠 Giới thiệu
Dịch vụ lưu trữ S3 (như Amazon S3, Wasabi, Backblaze B2...) thường không giới hạn dung lượng lưu trữ upfront, mà tính tiền theo số GB sử dụng, số lần request, băng thông tải xuống, v.v. Tuy nhiên, nếu muốn tự triển khai một dịch vụ S3 để bán cho khách hàng với gói dung lượng cố định (5GB, 10GB, 20GB...), chúng ta cần cơ chế giới hạn dung lượng (quota).
MinIO là một giải pháp S3-compatible open source, nhưng không hỗ trợ quota native per bucket/user. Tuy nhiên, nếu kết hợp với ZFS – một hệ thống file mạnh mẽ hỗ trợ quota, snapshot, compression – chúng ta hoàn toàn có thể triển khai mô hình này với 1 server duy nhất, hiệu quả và đơn giản.
✅ Kiến trúc tổng thể
+-----------------+ +-------------------------+ +--------------------+
| Khách hàng A | <--->| Nginx reverse proxy | <----> | MinIO Server |
+-----------------+ +-------------------------+ | (S3-compatible) |
| +--------------------+
v
+-----------------------------+
| Dataset ZFS: hddpool/a-bucket |
| Quota: 10GB |
+-----------------------------+
🛠 Bước 1: Tạo ZFS pool và dataset
Giả sử có một server với 24 ổ cứng HDD 14TB, chúng ta có thể tạo ZFS pool như sau:
# Tạo pool
zpool create hddpool raidz2 /dev/sd[b-y]
# Tạo dataset riêng cho khách hàng A
zfs create hddpool/a-bucket
# Gán quota 10GB cho dataset
zfs set quota=10G hddpool/a-bucket
🔌 Bước 2: Triển khai MinIO sử dụng dataset này
Chạy MinIO với backend là thư mục tương ứng với dataset ZFS đã gắn quota:
export MINIO_ACCESS_KEY=auser
export MINIO_SECRET_KEY=asecret
minio server /hddpool/a-bucket
🌐 Bước 3: Reverse proxy với Nginx
Cài đặt nginx để đưa S3 endpoint ra ngoài qua domain a.s3.stacklab.vn.
server {
listen 443 ssl;
server_name a.s3.stacklab.vn;
ssl_certificate /etc/letsencrypt/live/stacklab.vn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stacklab.vn/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9000;
}
}
📊 Kiểm tra dung lượng đã dùng
Kiểm tra dung lượng đã dùng của khách hàng rất đơn giản qua ZFS:
zfs list -o name,used,quota,available hddpool/a-bucket
Ví dụ kết quả:
NAME USED QUOTA AVAIL
hddpool/a-bucket 2.3G 10G 7.7G
🔁 Thay đổi quota (resize)
Tăng/giảm quota linh hoạt:
# Tăng quota lên 20G
zfs set quota=20G hddpool/a-bucket
# Giảm quota (chỉ được nếu USED < quota mới)
zfs set quota=5G hddpool/a-bucket
🔥 Ưu điểm của mô hình này
| Tính năng | Có không? |
|---|---|
| Tương thích S3 chuẩn | ✅ (MinIO) |
| Giới hạn dung lượng từng user | ✅ (ZFS) |
| Quản lý tách biệt từng khách | ✅ (1 dataset/user) |
| Monitoring dễ dàng | ✅ |
| Backup/snapshot dễ | ✅ |
| Tự host, không phụ thuộc cloud | ✅ |
🧠 Kết luận
Mặc dù MinIO không có quota native, nhưng khi kết hợp với ZFS — chúng ta có thể triển khai một dịch vụ S3 nhỏ gọn, giới hạn dung lượng theo từng khách hàng, dễ quản lý và cực kỳ hiệu quả.
Giải pháp này đặc biệt phù hợp nếu:
- Có một server nhiều ổ đĩa (24 HDD chẳng hạn)
- Muốn bán dịch vụ lưu trữ backup S3 với dung lượng cố định
- Không muốn triển khai hệ thống phức tạp như Ceph
📎 Gợi ý nâng cao
- Sử dụng
rclone,awscli, hoặcs3cmdđể kiểm tra S3 từ phía khách. - Tự động hoá tạo dataset + quota + tài khoản MinIO qua script bash.
- Triển khai dashboard hiển thị dung lượng used/quota bằng ZFS API.