Lựa chọn Vector Database phù hợp cho Ubuntu 24.04
Trong môi trường Ubuntu 24.04 hiện đại, chúng ta có hai lựa chọn chính: Weaviate và Milvus.
Weaviate được viết bằng Go, nhẹ, dễ triển khai đơn nút (single-node), và tích hợp sẵn module vectorization. Nó phù hợp cho các dự án vừa và nhỏ, hoặc khi cần tốc độ deploy nhanh. Weaviate chạy rất tốt trên Docker Compose.
Milvus được viết bằng C++ và Go, tập trung vào phân tán (distributed), xử lý lượng dữ liệu khổng lồ (tỷ vector). Milvus yêu cầu nhiều tài nguyên hơn và thường chạy trên Kubernetes hoặc Docker Compose với nhiều container (etcd, minio, pulsar, milvus).
Đối với bài hướng dẫn này, chúng ta sẽ ưu tiên Weaviate để minh họa quy trình cấu hình file config và Docker Compose chi tiết, vì nó cho phép kiểm soát sâu hơn về DISK_USAGE và MEMORY_LIMIT trong một file cấu hình duy nhất, phù hợp với mục tiêu tối ưu hóa kernel ở các phần sau.
Tuy nhiên, cấu trúc logic áp dụng cho cả hai: cài đặt qua Docker Compose để cách ly môi trường, và cấu hình file .env hoặc config.yaml để điều chỉnh tài nguyên.
Cài đặt Weaviate qua Docker Compose trên Ubuntu 24.04
Bước đầu tiên là chuẩn bị thư mục làm việc và tạo file cấu hình docker-compose.yml. Chúng ta không cài đặt native binary trực tiếp để tránh xung đột thư viện hệ thống trên Ubuntu 24.04 và dễ dàng rollback.
Chúng ta sẽ tạo một cấu trúc thư mục chuẩn: /opt/weaviate để chứa code và data, đảm bảo quyền hạn và an toàn.
1. Tạo thư mục và cấu trúc file
Thực thi lệnh để tạo thư mục và cấp quyền cho user hiện tại.
sudo mkdir -p /opt/weaviate/{data,config}
sudo chown -R $USER:$USER /opt/weaviate
cd /opt/weaviate
Kết quả mong đợi: Bạn đang đứng trong thư mục /opt/weaviate và có quyền ghi vào các thư mục con data và config.
2. Tạo file docker-compose.yml
File này định nghĩa container Weaviate, ánh xạ port 8080 (REST API) và 8081 (GraphQL), đồng thời mount thư mục data để lưu trữ persistent.
Chú ý: Chúng ta sử dụng tag latest của Weaviate (hiện tại là v1.x) và bật logging format JSON để dễ parse trong các bước monitoring sau.
cat > docker-compose.yml
Kết quả mong đợi: File docker-compose.yml được tạo thành công trong /opt/weaviate.
Cấu hình file cấu hình Database (Disk Cache, Memory Limit)
Đây là bước quan trọng nhất để chuẩn bị cho các phần tối ưu Kernel sau này. Mặc định, Weaviate tự động ước lượng bộ nhớ, nhưng trong môi trường production, chúng ta cần giới hạn cứng (hard limit) để tránh OOM Killer của Linux can thiệp gây sập service.
Chúng ta sẽ tạo file .env để override các biến môi trường và file config.yaml (nếu cần cấu hình sâu hơn) hoặc sử dụng biến môi trường SETTINGS_DISK_USAGE_LIMIT và SETTINGS_MEMORY_LIMIT.
1. Tạo file .env để giới hạn tài nguyên
File này sẽ được Docker Compose đọc để set các giới hạn về RAM và Disk cho Weaviate. Giả sử server có 8GB RAM, chúng ta cấp 4GB cho Weaviate và giới hạn disk usage là 50GB.
cat > .env
Kết quả mong đợi: File .env được tạo. Số 4294967296 tương đương 4GB RAM và 53687091200 tương đương 50GB Disk.
2. Cập nhật docker-compose.yml để sử dụng .env
Cần chỉnh sửa lại file docker-compose.yml ở trên để thêm dòng env_file và đảm bảo các biến môi trường được inject chính xác vào container.
cat > docker-compose.yml
Kết quả mong đợi: File docker-compose.yml đã được cập nhật để đọc biến môi trường từ file .env.
3. Giải thích các thông số cấu hình
SETTINGS_MEMORY_LIMIT: Giới hạn tối đa bộ nhớ RAM mà Weaviate được phép sử dụng. Nếu vượt quá, Weaviate sẽ tự động thực hiện garbage collection hoặc từ chối write mới. Điều này giúp bảo vệ hệ điều hành khỏi bị crash do OOM.
SETTINGS_DISK_USAGE_LIMIT: Giới hạn dung lượng disk. Khi đạt ngưỡng này, Weaviate sẽ chuyển sang chế độ "read-only" để bảo vệ dữ liệu, ngăn disk đầy gây sập filesystem.
deploy.resources.limits: Đây là giới hạn của Docker Engine. Nó hoạt động như một lớp bảo vệ thứ hai nếu Weaviate không tuân thủ giới hạn nội bộ.
Kiểm tra kết nối và khởi động dịch vụ thành công
Sau khi đã có file cấu hình, chúng ta sẽ khởi động dịch vụ và xác minh rằng các thông số giới hạn tài nguyên đã được áp dụng đúng.
1. Khởi động Weaviate
Sử dụng lệnh docker compose up -d để chạy service ở chế độ nền (detached mode).
cd /opt/weaviate
docker compose up -d
Kết quả mong đợi: Docker thông báo "Container weaviate started" và không có lỗi về permission hay file config.
2. Kiểm tra trạng thái container và logs
Chúng ta cần kiểm tra xem container có đang chạy ổn định và Weaviate có nhận diện đúng các biến môi giới hạn không.
docker compose ps
docker compose logs weaviate --tail 50
Kết quả mong đợi: Trong logs, bạn sẽ thấy dòng log khởi động thành công: "Weaviate has started successfully". Quan trọng hơn, tìm dòng log xác nhận giới hạn: "limit memory usage to 4294967296 bytes" hoặc tương tự.
3. Xác minh kết nối API và cấu hình
Sử dụng curl để gọi API /v1/.meta để kiểm tra version và trạng thái, sau đó gọi endpoint /v1/config (nếu có) hoặc xem logs để chắc chắn các setting đã apply.
curl -s http://localhost:8080/v1/.meta | jq .
curl -s http://localhost:8080/v1/schema | jq
Kết quả mong đợi:
- Lệnh thứ nhất trả về JSON chứa version và modules đang active.
- Lệnh thứ hai trả về {} (empty schema) nếu chưa tạo collection, chứng tỏ API đang lắng nghe và hoạt động tốt.
- Không có lỗi 401 (nếu đã bật anonymous access) hay 500.
4. Kiểm tra giới hạn bộ nhớ từ bên ngoài (Docker Stats)
Để chắc chắn Docker Engine đang enforce đúng giới hạn memory đã cấu hình trong docker-compose.yml.
docker stats weaviate --no-stream
Kết quả mong đợi: Cột MEM LIMIT phải hiển thị 4.096Gi (tương ứng với 4GB đã cấu hình). Nếu hiển thị unlimited, có nghĩa là cấu hình deploy.resources chưa được áp dụng đúng (thường xảy ra nếu dùng Docker Engine cũ, nhưng trên Ubuntu 24.04 với Docker mới nhất thì hoạt động tốt).
Verify kết quả cuối cùng
Để kết thúc phần cài đặt này, thực hiện một phép thử nhỏ: tạo một collection đơn giản để đảm bảo Write/Read hoạt động và không bị chặn bởi giới hạn disk/memory ngay lập tức.
curl -X POST "http://localhost:8080/v1/schema" \
-H "Content-Type: application/json" \
-d '{
"class": "TestDocument",
"vectorIndexType": "hnsw",
"properties": [
{
"name": "content",
"dataType": ["text"]
}
]
}'
Kết quả mong đợi: Trả về 200 OK và không có lỗi. Bạn đã thành công cài đặt và cấu hình Weaviate với các giới hạn tài nguyên rõ ràng trên Ubuntu 24.04, sẵn sàng cho các bước tối ưu Kernel NUMA và Hugepages ở phần 4.
Điều hướng series:
Mục lục: Series: Tối ưu hóa Database Vector trên Ubuntu 24.04 với Linux Kernel Tuning
« Phần 2: Cấu hình Linux Kernel cơ bản cho hiệu năng I/O cao
Phần 4: Tinh chỉnh Kernel nâng cao: NUMA, CPU Pinning và Hugepages »