Mỗi bộ sưu tập dữ liệu được chia thành các đoạn. Mỗi đoạn có lưu trữ vector độc lập, lưu trữ dữ liệu cần xử lý, và chỉ mục.
Dữ liệu trong các đoạn thường không chồng lấp nhau. Tuy nhiên, việc lưu trữ cùng một điểm trong các đoạn khác nhau không gây ra vấn đề vì tìm kiếm chứa cơ chế loại bỏ trùng lặp.
Các đoạn bao gồm lưu trữ vector, lưu trữ dữ liệu cần xử lý, chỉ mục vector, chỉ mục dữ liệu cần xử lý, và một bộ ánh xạ ID để lưu trữ mối quan hệ giữa ID nội và ID ngoại.
Các đoạn có thể là "có thể thêm" hoặc "không thể thêm" tùy thuộc vào loại lưu trữ và chỉ mục sử dụng. Bạn có thể tự do thêm, xóa và truy vấn dữ liệu trong các đoạn "có thể thêm", trong khi các đoạn "không thể thêm" chỉ có thể đọc và xóa dữ liệu.
Cấu hình của các đoạn trong một bộ sưu tập có thể khác nhau và độc lập với nhau, nhưng ít nhất cần có một đoạn "có thể thêm".
Lưu trữ Vector
Tùy thuộc vào nhu cầu của ứng dụng, Qdrant có thể sử dụng một trong những tùy chọn lưu trữ dữ liệu sau. Lựa chọn phải cân nhắc giữa tốc độ tìm kiếm và việc sử dụng RAM.
Lưu trữ bộ nhớ - Lưu trữ tất cả các vector trong RAM, cung cấp tốc độ cao nhất vì truy cập đĩa chỉ cần thiết khi cần lưu trữ.
Lưu trữ Memmap - Tạo không gian địa chỉ ảo liên kết với một tệp trên đĩa. Các tệp được ánh xạ không được tải trực tiếp vào RAM mà được truy cập bằng cách sử dụng bộ đệm trang. Phương pháp này cho phép sử dụng linh hoạt bộ nhớ có sẵn. Với đủ RAM, tốc độ của nó gần như nhanh như lưu trữ bộ nhớ.
Cấu hình Lưu trữ Memmap
Có hai cách để cấu hình việc sử dụng memmap (còn được biết đến là lưu trữ trên đĩa):
- Thiết lập tùy chọn
on_disk
cho vectors trong API tạo bộ sưu tập:
Chỉ áp dụng cho v1.2.0 và cao hơn
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine",
"on_disk": true
}
}
Điều này sẽ tạo một bộ sưu tập lưu trữ ngay lập tức tất cả các vector trong lưu trữ memmap. Đây là cách tiếp cận được khuyến nghị khi máy chủ Qdrant sử dụng ổ đĩa nhanh và cần xử lý các bộ sưu tập lớn.
- Thiết lập tùy chọn
memmap_threshold_kb
. Tùy chọn này thiết lập ngưỡng để chuyển đổi các đoạn sang lưu trữ memmap.
Có hai cách để triển khai điều này:
- Thiết lập ngưỡng một cách toàn cầu trong tệp cấu hình. Tên tham số là
memmap_threshold_kb
. - Thiết lập ngưỡng một cách riêng lẻ cho mỗi bộ sưu tập trong quá trình tạo hoặc cập nhật.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
}
}
Quy tắc tổng quát để thiết lập tham số ngưỡng memmap đơn giản như sau:
- Nếu kịch bản sử dụng cân đối - thiết lập ngưỡng memmap giống như
indexing_threshold
(mặc định là 20000). Trong trường hợp này, trình tối ưu hóa sẽ không thực hiện bất kỳ chạy nào nữa và sẽ tối ưu hóa tất cả các đồng thời. - Nếu tải ghi cao và RAM thấp - thiết lập ngưỡng memmap thấp hơn ngưỡng
indexing_threshold
, ví dụ 10000. Trong trường hợp này, trình tối ưu hóa sẽ chuyển đổi các đoạn sang lưu trữ memmap trước và sau đó áp dụng chỉ mục.
Ngoài ra, bạn có thể sử dụng lưu trữ memmap không chỉ cho vectors mà còn cho chỉ mục HNSW. Để bật tính năng này, hãy thiết lập tham số hnsw_config.on_disk
thành true
khi tạo bộ sưu tập.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
},
"hnsw_config": {
"on_disk": true
}
}
Lưu trữ dữ liệu vận chuyển
Qdrant hỗ trợ hai loại lưu trữ payload: Trong Bộ nhớ và Trên Ổ Đĩa.
Lưu trữ payload Trong Bộ nhớ tổ chức dữ liệu payload theo cùng cách như vectơ trong bộ nhớ. Dữ liệu payload được tải vào bộ nhớ khi dịch vụ bắt đầu, trong khi ổ đĩa và RocksDB được sử dụng chỉ cho tính liên tục. Loại lưu trữ này rất nhanh nhưng có thể đòi hỏi một lượng lớn không gian bộ nhớ để lưu trữ tất cả dữ liệu, đặc biệt nếu payload bao gồm các giá trị lớn (như tóm tắt văn bản hoặc thậm chí là hình ảnh).
Đối với giá trị payload lớn, việc sử dụng lưu trữ payload Trên Ổ Đĩa là ưu tiên. Loại lưu trữ này trực tiếp đọc và ghi payload vào RocksDB, do đó không đòi hỏi một lượng lớn bộ nhớ để lưu trữ. Tuy nhiên, hạn chế là thời gian truy cập. Nếu bạn cần truy vấn vectơ dựa trên điều kiện payload, việc kiểm tra các giá trị lưu trữ trên ổ đĩa có thể mất quá nhiều thời gian. Trong trường hợp này, chúng tôi khuyến nghị tạo chỉ mục payload cho mỗi trường được sử dụng cho điều kiện lọc để tránh việc truy cập ổ đĩa. Khi chỉ mục trường được tạo, Qdrant sẽ luôn giữ tất cả giá trị của trường được chỉ mục trong bộ nhớ, bất kể loại lưu trữ payload là gì.
Bạn có thể chỉ định loại lưu trữ payload mong muốn thông qua tập tin cấu hình hoặc bằng cách sử dụng tham số của bộ sưu tập on_disk_payload
khi tạo một bộ sưu tập.
Kiểm soát phiên bản
Để đảm bảo tính toàn vẹn dữ liệu, Qdrant thực hiện tất cả các thay đổi dữ liệu theo hai giai đoạn. Đầu tiên, dữ liệu được ghi vào Write-ahead-log (WAL), đóng gói và gán số thứ tự tuần tự cho tất cả các thao tác.
Sau khi các thay đổi được thêm vào WAL, chúng không bị mất ngay cả trong trường hợp mất điện. Sau đó, các thay đổi được đưa vào đoạn. Mỗi đoạn lưu trữ phiên bản mới nhất của các thay đổi được áp dụng cho nó, cũng như phiên bản của mỗi điểm cá nhân. Nếu số thứ tự tuần tự của một thay đổi mới nhỏ hơn phiên bản hiện tại của một điểm, bộ cập nhật sẽ bỏ qua thay đổi đó. Cơ chế này cho phép Qdrant phục hồi lưu trữ hiệu quả từ WAL trong trường hợp tắt nguồn bất thường.