Cấu hình Sharding (Đa Partition) để phân tán dữ liệu lớn
Bước 1: Định nghĩa cấu hình Sharding trong file Schema để Weaviate tự động chia nhỏ dữ liệu thành các partition riêng biệt.
Mục đích: Khi dữ liệu vượt quá khả năng xử lý của một node đơn lẻ, Weaviate sẽ phân tán dữ liệu vào nhiều partition. Điều này giúp tăng thông lượng (throughput) khi đọc/ghi và giảm tải cho mỗi partition.
Kết quả mong đợi: Khi thực hiện query, bạn có thể chỉ định partition cụ thể hoặc để Weaviate tự chọn, dữ liệu được lưu trữ phân tán nhưng vẫn truy xuất liền mạch.
Trước khi cập nhật schema, hãy xác định số lượng partition mong muốn. Với dữ liệu lớn, số lượng partition nên chia cho số lượng node trong cluster.
curl -X PUT "http://localhost:8080/v1/schema/MyCollection" \
-H "Content-Type: application/json" \
-d '{
"class": "MyCollection",
"vectorIndexType": "hnsw",
"vectorIndexConfig": {
"efConstruction": 128,
"maxConnections": 64
},
"shardingConfig": {
"virtualPerPhysical": 128,
"desiredCount": 4
},
"properties": [
{
"name": "title",
"dataType": ["text"]
},
{
"name": "content",
"dataType": ["text"]
}
]
}'
Kết quả: Weaviate sẽ tự động tạo 4 physical shards (partition) cho collection "MyCollection". Dữ liệu mới được phân phối đều vào các shard này dựa trên hash của key.
Verify kết quả Sharding
Thực hiện lệnh sau để kiểm tra trạng thái của các shard đã được tạo.
curl -X GET "http://localhost:8080/v1/schema/MyCollection"
Quan sát phần "shardingState" trong phản hồi JSON. Bạn sẽ thấy danh sách các shard với trạng thái "READY" và phân bố dữ liệu.
Điều chỉnh tham số Vector Indexing (HNSW, Flat) theo Use-case
Cấu hình HNSW cho dữ liệu lớn cần tốc độ cao
Bước 1: Cập nhật cấu hình chỉ mục (Index) của collection hiện tại để tối ưu cho tìm kiếm xấp xỉ (Approximate Nearest Neighbor - ANN).
Mục đích: HNSW (Hierarchical Navigable Small World) là thuật toán mặc định của Weaviate, tối ưu cho dữ liệu lớn (triệu vector). Tuy nhiên, các tham số `efConstruction` và `maxConnections` cần điều chỉnh theo RAM và yêu cầu độ chính xác.
Kết quả mong đợi: Tăng `efConstruction` giúp tăng độ chính xác khi index (chậm hơn khi ghi), tăng `maxConnections` giúp tăng độ chính xác khi query (tốn hơn RAM).
Chạy lệnh curl để cập nhật cấu hình index cho collection đã tồn tại hoặc khi tạo mới. Dưới đây là cấu hình tối ưu cho cân bằng giữa tốc độ và độ chính xác.
curl -X PATCH "http://localhost:8080/v1/schema/MyCollection" \
-H "Content-Type: application/json" \
-d '{
"vectorIndexConfig": {
"efConstruction": 256,
"maxConnections": 64,
"cleanupIntervalSeconds": 300
}
}'
Kết quả: Weaviate sẽ áp dụng cấu hình mới cho các vector được thêm vào sau. Các vector cũ sẽ không bị re-index tự động, cần thực hiện rebuild nếu muốn thay đổi toàn bộ.
Cấu hình Flat Index cho dữ liệu nhỏ cần độ chính xác tuyệt đối
Bước 2: Chuyển đổi sang Flat Index nếu bộ dữ liệu nhỏ (dưới 100k vector) và yêu cầu kết quả chính xác 100% (Brute-force).
Mục đích: Flat Index không sử dụng thuật toán xấp xỉ, nó so sánh từng vector. Nó chậm hơn khi query trên dữ liệu lớn nhưng đảm bảo kết quả chính xác tuyệt đối.
Kết quả mong đợi: Query trả về kết quả chính xác nhất, nhưng thời gian phản hồi tăng tuyến tính với số lượng vector.
Thực hiện lệnh PATCH để đổi loại chỉ mục sang "flat". Lưu ý: Việc đổi loại index trên dữ liệu hiện có sẽ làm mất dữ liệu vector cũ, bạn cần import lại hoặc chấp nhận mất vector cũ.
curl -X PATCH "http://localhost:8080/v1/schema/MyCollection" \
-H "Content-Type: application/json" \
-d '{
"vectorIndexType": "flat",
"vectorIndexConfig": {}
}'
Kết quả: Collection "MyCollection" chuyển sang sử dụng Flat Index. Query vector sẽ thực hiện quét toàn bộ (brute-force).
Verify kết quả Indexing
Thực hiện một query tìm kiếm vector để kiểm tra tốc độ và độ chính xác.
curl -X POST "http://localhost:8080/v1/objects/MyCollection/search" \
-H "Content-Type: application/json" \
-d '{
"vector": [0.1, 0.2, 0.3, ...],
"limit": 10,
"distance": 0.5
}'
Quan sát thời gian phản hồi (latency) và số lượng kết quả trả về. So sánh với cấu hình trước đó để đánh giá hiệu năng.
Triển khai Weaviate Backup module để lưu trữ dữ liệu
Cấu hình Backend lưu trữ Backup (S3/Local)
Bước 1: Cấu hình backend lưu trữ cho module backup trong file `docker-compose.yml` hoặc biến môi trường của Weaviate.
Mục đích: Backup module cần một nơi để lưu file snapshot (thường là S3, GCS, hoặc Local Disk). Ở đây ta dùng Local Disk để đơn giản hóa cho môi trường test, sau đó có thể đổi sang S3 cho Production.
Kết quả mong đợi: Weaviate có thể tạo và khôi phục backup từ đường dẫn đã cấu hình.
Cập nhật file `docker-compose.yml` tại đường dẫn `/home/ubuntu/weaviate/docker-compose.yml`. Thêm biến môi trường `BACKUP_CONFIG` và mount volume để lưu backup.
version: "3.8"
services:
weaviate:
image: semitechnologies/weaviate:1.24.0
ports:
- "8080:8080"
- "50051:50051"
volumes:
- weaviate_data:/var/lib/weaviate
- ./backups:/var/lib/weaviate/backups
environment:
- QUERY_DEFAULTS_LIMIT=25
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
- PERSISTENCE_DATA_PATH=/var/lib/weaviate
- DEFAULT_VECTORIZER_MODULE=None
- BACKUP_CONFIG_FILE=/var/lib/weaviate/backups/backup-config.yaml
- BACKUP_BACKEND_TYPE=local
- BACKUP_BACKEND_PATH=/var/lib/weaviate/backups
- CLUSTER_HOSTNAME=node1
volumes:
weaviate_data:
backups:
driver: local
driver_opts:
type: none
o: bind
device: ./backups
Kết quả: Container Weaviate khởi động với quyền truy cập vào thư mục `./backups` để lưu trữ các file backup.
Tạo file cấu hình Backup
Bước 2: Tạo file cấu hình backup để chỉ định chính xác collection nào cần backup và tham số nén.
Mục đích: File cấu hình này giúp Weaviate biết cách đóng gói dữ liệu (chọn collection, loại index, mức độ nén) trước khi lưu.
Kết quả mong đợi: File `backup-config.yaml` được tạo và Weaviate nhận diện được cấu hình.
Tạo file tại `/home/ubuntu/weaviate/backups/backup-config.yaml` với nội dung sau:
version: 1
collections:
- name: MyCollection
include:
- index: vector
- index: inverted
- index: bm25
compression: lz4
Kết quả: File cấu hình đã sẵn sàng để module Backup sử dụng khi thực hiện lệnh tạo backup.
Thực hiện lệnh Backup và Restore
Bước 3: Sử dụng API Backup để tạo snapshot và khôi phục dữ liệu.
Mục đích: Kiểm tra tính toàn vẹn của dữ liệu bằng cách tạo backup và thử khôi phục lại.
Kết quả mong đợi: Backup được tạo thành công với trạng thái "SUCCESS" và có thể restore lại dữ liệu.
Thực hiện lệnh tạo backup với tên `backup-2024-06-01`.
curl -X POST "http://localhost:8080/v1/backups/MyCollection/backup-2024-06-01" \
-H "Content-Type: application/json" \
-d '{
"backend": "local",
"path": "backup-2024-06-01",
"shards": ["_default"]
}'
Kết quả: API trả về trạng thái "CREATE_IN_PROGRESS", sau đó chuyển sang "SUCCESS". Bạn có thể kiểm tra thư mục `./backups` để thấy file `.tar` được tạo.
Để kiểm tra trạng thái backup sau khi tạo:
curl -X GET "http://localhost:8080/v1/backups/MyCollection/backup-2024-06-01"
Kết quả: JSON trả về hiển thị trạng thái "SUCCESS" và đường dẫn file backup.
Thực hiện lệnh khôi phục (Restore) từ backup vừa tạo (Lưu ý: Restore sẽ ghi đè dữ liệu hiện tại của collection).
curl -X POST "http://localhost:8080/v1/backups/MyCollection/backup-2024-06-01/restore" \
-H "Content-Type: application/json" \
-d '{
"backend": "local",
"path": "backup-2024-06-01",
"shards": ["_default"]
}'
Kết quả: Trạng thái chuyển sang "RESTORE_IN_PROGRESS" và cuối cùng là "SUCCESS". Dữ liệu trong collection "MyCollection" đã được phục hồi từ điểm thời gian backup.
Verify kết quả Backup
Query dữ liệu sau khi restore để đảm bảo số lượng object và vector giống hệt lúc backup.
curl -X GET "http://localhost:8080/v1/schema/MyCollection" | jq '.shardingState'
So sánh số lượng object trong mỗi shard với lúc trước khi restore.
Giám sát tài nguyên (CPU/RAM) và điều chỉnh giới hạn container
Cài đặt Prometheus và Grafana (Tùy chọn nhưng khuyến nghị)
Bước 1: Kích hoạt endpoint metrics của Weaviate và cấu hình scraping.
Mục đích: Weaviate có sẵn endpoint `/metrics` chuẩn Prometheus. Việc này giúp theo dõi hiệu năng thời gian thực (CPU usage, Memory usage, Query latency, Vector index size).
Kết quả mong đợi: Có thể truy cập địa chỉ `http://localhost:8080/metrics` để lấy dữ liệu giám sát.
Truy cập trực tiếp endpoint metrics của Weaviate để xem các metric hiện có.
curl -s http://localhost:8080/metrics | grep weaviate_query_duration_seconds
Kết quả: Trả về các dòng metric ghi lại thời gian thực hiện query, giúp phân tích độ trễ.
Điều chỉnh giới hạn RAM và CPU trong Docker Compose
Bước 2: Cập nhật file `docker-compose.yml` để đặt giới hạn tài nguyên (Resource Limits) cho container Weaviate.
Mục đích: Ngăn chặn Weaviate tiêu thụ hết RAM của máy chủ vật lý (host), gây sập hệ điều hành. Đặt giới hạn giúp OOM Killer của Linux hoạt động an toàn hơn hoặc container tự restart.
Kết quả mong đợi: Container Weaviate không được phép dùng quá lượng RAM và CPU đã định sẵn.
Cập nhật phần `deploy` hoặc `resources` trong file `/home/ubuntu/weaviate/docker-compose.yml`. Dưới đây là cấu hình giới hạn 4GB RAM và 2 CPU cores.
version: "3.8"
services:
weaviate:
image: semitechnologies/weaviate:1.24.0
# ... các config cũ giữ nguyên ...
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
# ... các config cũ giữ nguyên ...
Kết quả: Docker sẽ enforce giới hạn này. Nếu Weaviate cố dùng quá 4GB RAM, nó sẽ bị kill (OOMKilled) hoặc bị throttle CPU.
Khởi động lại dịch vụ để áp dụng cấu hình mới.
docker compose down
docker compose up -d
Kết quả: Container khởi động lại với các giới hạn tài nguyên mới.
Giám sát tài nguyên trực tiếp trên Host
Bước 3: Sử dụng lệnh `docker stats` để theo dõi sử dụng tài nguyên của container Weaviate trong thời gian thực.
Mục đích: Kiểm tra xem container có đang hoạt động trong giới hạn đã đặt hay không và phát hiện rò rỉ bộ nhớ.
Kết quả mong đợi: Hiển thị bảng thống kê CPU%, MEM USAGE, NET I/O của container.
Chạy lệnh theo dõi liên tục trên terminal của Ubuntu.
docker stats --no-stream weaviate-weaviate-1
Kết quả: In ra một dòng tóm tắt. Để theo dõi liên tục, bỏ tham số `--no-stream`. Quan sát cột `MEM USAGE / LIMIT` để đảm bảo không vượt quá 4GB.
Verify kết quả Giám sát
Thực hiện một query nặng (nhiều vector, nhiều shard) và quan sát `docker stats` đồng thời với `curl`.
watch -n 1 'docker stats --no-stream weaviate-weaviate-1 | grep weaviate'
Quan sát sự thay đổi của CPU% và MEM USAGE khi query chạy. Nếu CPU vượt quá 200% (tương đương 2 cores) hoặc RAM vượt quá 4GB, hệ thống sẽ tự động giới hạn hoặc kill container.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Weaviate và Ubuntu 24.04
« Phần 5: Cấu hình bảo mật: Xác thực, OAuth2 và HTTPS
Phần 7: Xử lý sự cố thường gặp và mẹo nâng cao cho Production »