Khởi tạo và Cấu hình MinIO cho Lưu trữ Vector
Milvus sử dụng MinIO để lưu trữ các file dữ liệu vector (binlog, segment data) dưới dạng object storage. Nếu không cấu hình bucket trước, Milvus sẽ gặp lỗi khi cố gắng ghi dữ liệu vào MinIO.
Tạo thư mục lưu trữ dữ liệu vật lý (persistent storage) trên host để MinIO gắn vào, đảm bảo dữ liệu không mất khi container bị xóa hoặc restart.
sudo mkdir -p /var/lib/minio/data
sudo mkdir -p /var/lib/minio/config
sudo chown -R 1000:1000 /var/lib/minio
Kết quả mong đợi: Thư mục được tạo và quyền sở hữu thuộc về user 1000 (user mặc định của MinIO container).
Sử dụng MinIO Client (mc) để đăng nhập vào MinIO container đang chạy và tạo bucket tên là "root". Đây là bucket mặc định mà Milvus Standalone yêu cầu.
docker exec -it milvus-minio mc alias set myminio http://localhost:9000 minioadmin minio123 --api S3v4
docker exec -it milvus-minio mc mb myminio/root
docker exec -it milvus-minio mc mb myminio/backup
Kết quả mong đợi: Xuất hiện thông báo "Bucket created successfully" cho cả bucket "root" và "backup".
Verify kết quả bằng cách liệt kê danh sách bucket trong MinIO để xác nhận bucket đã tồn tại.
docker exec -it milvus-minio mc ls myminio
Kết quả mong đợi: Danh sách hiển thị bucket "root" và "backup" cùng thời gian tạo.
Cấu hình Etcd Cluster đảm bảo tính nhất quán Metadata
Etcd lưu trữ toàn bộ metadata của Milvus (schema collection, index, state của cluster). Cần đảm bảo dữ liệu Etcd được lưu vào thư mục cố định trên host để tránh mất cấu hình khi container bị restart.
Tạo thư mục lưu trữ dữ liệu cho Etcd trên host. Milvus Standalone thường chỉ cần một node Etcd, nhưng cấu trúc thư mục phải rõ ràng để backup sau này.
sudo mkdir -p /var/lib/etcd/data
sudo chown -R 1000:1000 /var/lib/etcd
Kết quả mong đợi: Thư mục được tạo, quyền sở hữu đúng để container Etcd có thể ghi dữ liệu.
Cập nhật file docker-compose.yaml để bind mount thư mục trên host vào container Etcd. Điều này giúp dữ liệu metadata được lưu bền vững trên disk của host thay vì trong layer của container.
Thêm dòng volumes vào service `etcd` trong file docker-compose.yaml (giả định file nằm ở `/opt/milvus/docker-compose.yaml`).
volumes:
- /var/lib/etcd/data:/var/lib/etcd
Kết quả mong đợi: Sau khi chạy `docker-compose up -d`, thư mục `/var/lib/etcd/data` trên host sẽ chứa các file dữ liệu của Etcd (members, wal, snap).
Verify kết quả bằng cách kiểm tra xem dữ liệu đã được ghi vào thư mục host chưa và kiểm tra trạng thái Etcd.
ls -R /var/lib/etcd/data
docker exec -it milvus-etcd etcdctl endpoint health
Kết quả mong đợi: Thư mục host có các file dữ liệu; lệnh health trả về "healthy".
Thiết lập Persistent Volume cho Data và Logs
Ngoài MinIO và Etcd, Milvus cũng cần lưu trữ logs và các file tạm thời (data directory). Cần cấu hình bind mount cho các thư mục này để đảm bảo tính liên tục khi container restart.
Tạo thư mục lưu trữ logs và data cho các component Milvus (mixer, data node, index node) trên host.
sudo mkdir -p /var/lib/milvus/logs
sudo mkdir -p /var/lib/milvus/data
sudo chown -R 1000:1000 /var/lib/milvus
Kết quả mong đợi: Các thư mục được tạo sẵn sàng để gắn mount.
Cập nhật docker-compose.yaml để gắn mount các thư mục này vào container tương ứng. Đây là bước quan trọng để logs không bị mất và data node có thể cache dữ liệu vào disk host.
Thêm volumes vào service `milvus-standalone` (hoặc các service riêng biệt nếu tách) trong file docker-compose.yaml.
volumes:
- /var/lib/milvus/logs:/var/lib/milvus/logs
- /var/lib/milvus/data:/var/lib/milvus/data
Kết quả mong đợi: Khi restart container, logs cũ vẫn còn và dữ liệu cache không bị reset hoàn toàn.
Verify kết quả bằng cách chạy một query đơn giản tạo collection, sau đó restart container và kiểm tra xem collection có còn không.
docker-compose restart milvus-standalone
docker exec -it milvus-standalone milvus_cli --host 127.0.0.1 --port 19530 --cmd "show collections"
Kết quả mong đợi: Lệnh show collections vẫn trả về danh sách collection đã tạo trước khi restart.
Cấu hình chính sách Backup dữ liệu Vector cơ bản
Để phòng ngừa mất dữ liệu, cần thiết lập quy trình backup thủ công vào bucket "backup" đã tạo trên MinIO. Milvus có sẵn công cụ `milvus_backup` hoặc có thể backup raw data từ MinIO.
Sử dụng MinIO Client (mc) để sao chép toàn bộ bucket "root" (nơi chứa dữ liệu vector) sang bucket "backup" với prefix ngày tháng. Đây là phương pháp backup ở mức object storage, nhanh và ít ảnh hưởng hiệu năng.
BACKUP_PREFIX="backup-$(date +%Y%m%d-%H%M%S)"
docker exec -it milvus-minio mc cp --recursive myminio/root/ myminio/backup/$BACKUP_PREFIX/
Kết quả mong đợi: Xuất hiện thông báo "x copied" cho tất cả các object trong bucket root sang bucket backup.
Verify kết quả bằng cách liệt kê bucket backup để xem backup vừa tạo đã xuất hiện.
docker exec -it milvus-minio mc ls myminio/backup
Kết quả mong đợi: Danh sách hiển thị thư mục backup với tên ngày tháng vừa tạo.
Kiểm tra khả năng khôi phục dữ liệu sau khi tắt server
Thực hiện bài kiểm tra Disaster Recovery (DR) giả lập bằng cách xóa toàn bộ dữ liệu của MinIO và Etcd, sau đó khôi phục lại từ backup đã tạo để đảm bảo quy trình hoạt động.
Dừng toàn bộ các service Milvus và xóa dữ liệu hiện tại trên host để giả lập tình huống mất dữ liệu hoàn toàn.
docker-compose down
sudo rm -rf /var/lib/minio/data/*
sudo rm -rf /var/lib/etcd/data/*
Kết quả mong đợi: Các thư mục dữ liệu trên host trống hoàn toàn.
Khởi động lại MinIO và Etcd trước để chúng sẵn sàng nhận dữ liệu. Sau đó, sử dụng MinIO Client để copy dữ liệu từ bucket "backup" về bucket "root".
docker-compose up -d milvus-minio milvus-etcd
sleep 10
LATEST_BACKUP=$(docker exec -it milvus-minio mc ls myminio/backup | tail -n 1 | awk '{print $3}')
docker exec -it milvus-minio mc cp --recursive myminio/backup/$LATEST_BACKUP/ myminio/root/
Kết quả mong đợi: Dữ liệu vector đã được copy từ backup về bucket root.
Khởi động lại toàn bộ stack Milvus và kiểm tra xem các collection có quay lại không.
docker-compose up -d
docker exec -it milvus-standalone milvus_cli --host 127.0.0.1 --port 19530 --cmd "show collections"
Kết quả mong đợi: Lệnh show collections trả về danh sách collection tương tự như trước khi xóa, chứng tỏ dữ liệu đã được khôi phục thành công.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Milvus và Ubuntu 24.04
« Phần 3: Khởi tạo Milvus Standalone từ Docker Compose
Phần 5: Kết nối và thao tác cơ bản với Milvus qua Python SDK »