Hãy tưởng tượng bạn gửi một bức thư quan trọng cho năm người bạn, nhưng chỉ cần ba người xác nhận đã nhận thì bạn yên tâm thư đã tới nơi. Đó chính là ý tưởng cốt lõi của quorum trong hệ thống phân tán: thay vì chờ tất cả các node phản hồi, bạn chỉ cần "đa số" đồng ý là đủ.

Công thức R + W > N nghĩa là gì?

Trong một hệ thống có N bản sao (replica), quorum yêu cầu số node tham gia ghi (W) cộng với số node tham gia đọc (R) phải lớn hơn N. Ví dụ với N = 3, bạn có thể chọn W = 2 và R = 2. Khi đó, mỗi lần đọc sẽ chắc chắn chạm vào ít nhất một node đã nhận dữ liệu mới nhất, vì tập ghi và tập đọc luôn có phần giao nhau. Đây là nền tảng của các hệ thống kiểu Dynamo như Cassandra, Riak và DynamoDB.

Sloppy quorum và hinted handoff: khi node chính bị sập

Thực tế không đơn giản như lý thuyết. Khi một node trong nhóm chịu trách nhiệm bị sập, hệ thống kiểu Dynamo sẽ dùng "sloppy quorum", tức tạm đẩy dữ liệu sang một node khác ngoài nhóm ban đầu. Node "tạm" này giữ dữ liệu kèm theo một ghi chú (hint) rằng "dữ liệu này thuộc về node X". Khi node X hồi phục, dữ liệu sẽ được chuyển trả lại, gọi là hinted handoff. Vấn đề là node tạm không phải node chính thức, nên điều kiện giao nhau R + W > N không còn được đảm bảo. Hai lần đọc liên tiếp có thể trả về hai giá trị khác nhau mà cả hai đều "hợp lệ" theo quorum.

Read repair: sửa lỗi ngay khi đọc

Để giảm thiểu sự không nhất quán, nhiều hệ thống áp dụng read repair. Mỗi lần đọc, node điều phối sẽ so sánh kết quả từ các replica. Nếu phát hiện node nào đang giữ phiên bản cũ, nó sẽ lập tức gửi phiên bản mới nhất cho node đó. Read repair giống như bạn nhờ ba người bạn đọc lại bức thư, phát hiện một người đang giữ bản cũ rồi gửi ngay bản đúng cho họ. Cơ chế này không ngăn được việc đọc sai lần đầu, nhưng đảm bảo lần đọc tiếp theo sẽ chính xác hơn.

Quorum không phải là linearizability

Đây là điểm nhiều kỹ sư dễ hiểu nhầm nhất. R + W > N đảm bảo bạn sẽ "thấy" giá trị mới nhất trong tập kết quả, nhưng không đảm bảo bạn sẽ trả về đúng giá trị đó. Nếu hai client ghi đồng thời vào cùng một key, quorum không tự giải quyết xung đột: Cassandra dùng "last write wins" theo timestamp, còn Riak dùng vector clock và trả về nhiều phiên bản để ứng dụng tự chọn. Linearizability, tức mọi thao tác đọc luôn phản ánh lần ghi gần nhất theo thời gian thực, đòi hỏi các thuật toán đồng thuận phức tạp hơn như Raft hoặc Paxos, chứ không chỉ dựa vào số lượng node.

Tunable consistency: linh hoạt theo nhu cầu

Điểm hay của mô hình quorum là bạn có thể điều chỉnh W và R tùy theo bài toán. Cần ghi nhanh? Đặt W = 1, R = N. Cần đọc nhanh? Đặt W = N, R = 1. Cần cân bằng? W = 2, R = 2 với N = 3. Cassandra cho phép cấu hình consistency level từ ONE, QUORUM đến ALL cho từng truy vấn riêng biệt, giúp lập trình viên cân nhắc giữa tốc độ và độ nhất quán theo từng trường hợp cụ thể. Đó là sức mạnh thực sự của quorum: không phải lúc nào cũng "luôn đúng" hay "luôn nhanh", mà là cho phép bạn chọn điểm cân bằng phù hợp nhất.