Bỏ qua để đến nội dung
Search & RAG

7.16 Consistency: núm vặn và giá của chúng

Mặc định của Qdrant, nói thẳng ra:

Qdrant ưu tiên tính sẵn sàng và throughput, không ưu tiên consistency. Hai cập nhật đồng thời lên cùng một point có thể để các replica ở trạng thái khác nhau cho tới khi chúng đồng bộ lại. Đọc ngay sau khi ghi có thể trúng một replica chưa bắt kịp.

Đây không phải lỗi. Đó là điểm mà Qdrant chọn đứng trên đường đánh đổi, và nó hợp lý cho phần lớn hệ RAG. Nhưng bạn phải biết mình đang đứng ở đâu, vì triệu chứng của nó — “dữ liệu lúc có lúc không” — rất dễ bị chẩn đoán nhầm thành mất dữ liệu.

Ba núm vặn, độc lập nhau. Học chúng theo đúng ba câu hỏi mà chúng trả lời.

Núm 1 — write_consistency_factor: bao nhiêu replica phải xác nhận?

Phần tiêu đề “Núm 1 — write_consistency_factor: bao nhiêu replica phải xác nhận?”
Đặt ởcấu hình collection
Mặc định1
Miền giá trị1 → số replica của mỗi shard

Nghĩa: bao nhiêu replica phải báo đã ghi xong thì mới trả lời client là thành công.

Đánh đổi, và nó có hai chiều rõ ràng:

write_consistency_factor = 1 write_consistency_factor = 2 (với 2 replica)
────────────────────────────── ─────────────────────────────────────────
+ ghi nhanh + chịu được network partition
+ vẫn ghi được khi replica khác chết − MỘT replica chết là KHÔNG GHI ĐƯỢC nữa
− replica còn lại có thể chưa có dữ liệu

Câu cần đọc kỹ: tăng giá trị này làm giảm tính sẵn sàng của thao tác ghi. Nếu số replica đang hoạt động tụt xuống dưới ngưỡng, thao tác ghi thất bại. Đây là lựa chọn có ý thức giữa “ghi được nhưng có thể chưa đồng đều” và “hoặc ghi đúng ở nhiều nơi, hoặc không ghi”.

Núm 2 — consistency: đọc hỏi bao nhiêu replica?

Phần tiêu đề “Núm 2 — consistency: đọc hỏi bao nhiêu replica?”
Đặt ởtừng request đọc
Mặc định1
Giá trịNghĩa
số nguyên Nhỏi N replica ngẫu nhiên, trả về điểm có mặt ở tất cả chúng
quorumhỏi đa số replica, trả về điểm có mặt ở tất cả những replica được hỏi
majorityhỏi tất cả, trả về điểm có mặt ở đa số
allhỏi tất cả, trả về điểm có mặt ở tất cả

Chú ý sự khác nhau tinh vi giữa quorummajority: quorum hỏi ít hơn (rẻ hơn) nhưng đòi hỏi khắt khe trên tập nhỏ hơn; majority hỏi nhiều hơn nhưng dễ dãi hơn khi quyết định. Với đa số hệ, quorum là điểm cân bằng hợp lý khi bạn thật sự cần hơn mặc định.

Cái giá rất trực tiếp: mỗi mức cao hơn là thêm tải và thêm latency. Đọc có consistency cao không miễn phí — bạn đang bắt nhiều máy cùng làm một việc rồi so kết quả.

Vì đây là tham số theo từng request, cách dùng đúng là chọn theo đường:

Truy vấn phục vụ người dùng → mặc định (1). Nhanh. Lệch một chút không ai chết.
Kiểm tra sau khi ghi → quorum hoặc all.
Job đối soát / xuất dữ liệu → all.

Núm 3 — ordering: thao tác ghi được sắp thứ tự thế nào?

Phần tiêu đề “Núm 3 — ordering: thao tác ghi được sắp thứ tự thế nào?”
Đặt ởtừng request ghi
Mặc địnhweak
Giá trịNghĩaCái giá
weakKhông đảm bảo gì thêm; các thao tác có thể bị đảo thứ tựNhanh nhất
mediumSắp thứ tự qua một leader được bầu độngCó thể lệch nhẹ lúc đổi leader
strongSắp thứ tự qua một leader cố địnhLeader chết là không ghi được

Khi nào bạn thật sự cần medium/strong: khi hai thao tác lên cùng một point phải xảy ra đúng thứ tự. Ví dụ điển hình: cập nhật payload rồi ngay sau đó cập nhật vector, và bạn không muốn thứ tự bị đảo.

Nếu bạn chỉ nạp dữ liệu độc lập theo lô, weak là đúng và đừng đụng vào.

Cách khác, thường tốt hơn: conditional update

Phần tiêu đề “Cách khác, thường tốt hơn: conditional update”

Từ v1.16, Qdrant có cập nhật có điều kiện — kiểu khoá lạc quan (optimistic concurrency): bạn giữ một trường version trong payload, và yêu cầu thao tác chỉ áp dụng nếu giá trị hiện tại đúng bằng cái bạn đã đọc. Đặt update_mode: "update_only" để tránh vô tình chèn mới khi điều kiện không khớp.

Với nhiều tiến trình cùng ghi, conditional update thường là câu trả lời đúng hơn ordering: strong — nó không hy sinh tính sẵn sàng của cả hệ để giải quyết một vấn đề cục bộ ở vài point.

Read affinity — chữa hiện tượng “kết quả nhấp nháy”

Phần tiêu đề “Read affinity — chữa hiện tượng “kết quả nhấp nháy””

Từ v1.19. Triệu chứng: cùng một truy vấn gọi hai lần cho ra hai kết quả hơi khác nhau, vì hai lần đó rơi vào hai replica có mức đồng bộ khác nhau. Người dùng bấm F5 và thấy kết quả đổi.

Cách chữa: gửi header X-Qdrant-Route-Affinity với một định danh ổn định (ID phiên, ID người dùng). Cùng một định danh sẽ được ghim vào cùng một replica.

Đây là cách rẻ nhất để loại bỏ hiện tượng nhấp nháy: bạn không mua consistency toàn cục, bạn chỉ mua consistency theo phiên — và trong sản phẩm, đó thường đúng là thứ người dùng cảm nhận được. Định tuyến là nỗ lực tốt nhất, không phải đảm bảo cứng.

Bạn cầnĐặt gìTrả giá gì
Nạp dữ liệu nhanhmặc định hết, wait=falseĐọc ngay có thể chưa thấy
Người dùng không thấy kết quả nhấp nháyread affinityGần như không
Ghi xong đọc lại phải thấywait=true + consistency: quorumLatency
Chịu được mất một node mà không mất ghireplication_factor ≥ 2, giữ write_consistency_factor: 1Gấp đôi dung lượng
Chịu được network partitionwrite_consistency_factor ≥ 2Mất khả năng ghi khi thiếu replica
Nhiều tiến trình ghi cùng một pointconditional update (v1.16)Phải xử lý trường hợp xung đột
Thứ tự tuyệt đối trên cùng một pointordering: strongLeader chết là đứng
Phần 7 — Qdrant