Đến nội dung chính
Thư viện GKNơi khơi nguồn tò mò
Tiếng Việt

Thế tiến thoái lưỡng nan của hệ thống phân tán: Định lý CAP (CAP Theorem)

Bạn nhấn nút thanh toán trên một trang mua sắm trực tuyến, nhưng sản phẩm vừa hiển thị là “còn hàng” bỗng hết hàng. Nguyên nhân là một máy chủ khác vẫn còn lưu thông tin tồn kho cũ. Khi nhiều máy tính hoạt động như một dịch vụ duy nhất, rất khó đồng thời cam kết ba điều: dữ liệu luôn giống nhau, yêu cầu luôn được phản hồi và mạng không bao giờ bị gián đoạn. “Định lý CAP (CAP Theorem)” chính là cách diễn đạt thế tiến thoái lưỡng nan này trong một câu.

Nói đơn giản, định lý CAP là lý thuyết cho rằng “trong một hệ thống phân tán, không thể đồng thời bảo đảm cả tính nhất quán (Consistency), tính sẵn sàng (Availability) và khả năng chịu phân hoạch (Partition tolerance)”. Eric Brewer đề xuất định lý này trong bài phát biểu chính tại PODC năm 2000, và Seth Gilbert cùng Nancy Lynch đã chứng minh nó một cách hình thức vào năm 2002.

Tài liệu này trình bày một cách dễ hiểu từ bối cảnh ra đời và định nghĩa chính xác của định lý CAP đến ý nghĩa của ba chữ C·A·P, lý do không thể đồng thời đạt được cả ba, cũng như cách diễn giải định lý này trong thực tiễn.


Định lý CAP: Ba cam kết mà hệ thống phân tán phải đối mặt

Định lý CAP là gì?

Đồ họa thông tin giải thích định lý CAP qua tình huống mất liên lạc giữa hai nút hoạt động bình thường. C là tính tuyến tính hóa, còn A là thuộc tính bảo đảm mọi yêu cầu gửi đến nút hoạt động bình thường cuối cùng đều nhận được kết quả thao tác. Đây là tình huống giả định với giá trị ban đầu là 0, trong đó thao tác đọc tại nút 2 bắt đầu sau khi thao tác ghi giá trị 1 tại nút 1 đã hoàn tất. Nếu nút 2 trả về giá trị 0 đang lưu thì vi phạm C; nếu chờ đến khi xác nhận được thì không thể bảo đảm A trong suốt thời gian phân hoạch còn tiếp diễn.

Hệ thống phân tán không phải là một máy tính đơn lẻ, mà là một cấu trúc gồm nhiều nút kết nối với nhau qua mạng, trong đó việc phân chia dữ liệu ra nhiều nơi trở nên tự nhiên hơn khi quy mô tăng lên, như ở các trang mua sắm, ứng dụng nhắn tin và cơ sở dữ liệu đám mây. Vấn đề là việc liên lạc giữa các nút không phải lúc nào cũng hoàn hảo. Khi cáp bị đứt, độ trễ tăng vọt hoặc một số máy chủ không phản hồi, hiện tượng “phân hoạch (Partition)” sẽ xuất hiện.

Brewer đã gom ba thuộc tính mà hệ thống không thể đồng thời duy trì trong môi trường này thành C·A·P. Thông điệp cốt lõi rất đơn giản: khi phân hoạch mạng thực sự xảy ra, phải ưu tiên một trong hai thuộc tính: tính nhất quán hoặc tính sẵn sàng. Điều này thường được tóm tắt là “chỉ chọn hai trong ba”, nhưng cách diễn giải hiện đại xem khả năng chịu phân hoạch gần như là một điều kiện tiên quyết bắt buộc và hiểu định lý theo sự đánh đổi giữa C và A.

Những khái niệm sau sẽ hữu ích khi tìm hiểu định lý này.

  • Hệ thống phân tán (Distributed System): Cấu trúc trong đó nhiều máy tính phối hợp với nhau như một dịch vụ duy nhất.
  • Nút (Node): Từng máy chủ hoặc tiến trình tham gia vào sự phối hợp đó.
  • Sao chép (Replication): Phương thức sao chép cùng một dữ liệu sang nhiều nút.
  • Sự đánh đổi (Trade-off): Mối quan hệ trong đó việc tăng cường một thuộc tính đòi hỏi phải nhượng bộ ở thuộc tính khác.

Ý nghĩa chính xác của ba chữ C·A·P

Diễn đạt ba chữ này bằng ngôn ngữ đời thường sẽ giúp làm rõ các khái niệm.

(1) Tính nhất quán (Consistency)
Mọi nút đều nhìn thấy cùng một giá trị mới nhất tại cùng một thời điểm: đó là cam kết của tính nhất quán. Nếu lượng tồn kho ở một nơi đã được giảm xuống còn 1, thì truy vấn ngay sau đó ở nơi khác cũng phải cho kết quả là 1. C trong CAP gần với “tính nhất quán mạnh” trong lý thuyết cơ sở dữ liệu, và được phân biệt với tính nhất quán lỏng, vốn chỉ bảo đảm dữ liệu cuối cùng sẽ giống nhau.

(2) Tính sẵn sàng (Availability)
Một nút còn hoạt động thì nhất định phải phản hồi yêu cầu: đó là cam kết của tính sẵn sàng. Điều này có nghĩa là “kết quả đọc hoặc ghi được trả về” mà không gặp lỗi hay hết thời gian chờ, chứ không có nghĩa kết quả đó luôn mới nhất. Trả lời dù chậm và từ chối hoàn toàn là hai lựa chọn khác nhau.

(3) Khả năng chịu phân hoạch (Partition tolerance)
Ngay cả khi liên lạc giữa các nút bị gián đoạn, hệ thống vẫn tiếp tục hoạt động mà không dừng lại: đó là cam kết của khả năng chịu phân hoạch. Trên Internet và trong các trung tâm dữ liệu thực tế, phân hoạch không phải hiện tượng hiếm gặp, nên phần lớn dịch vụ quy mô lớn khó có thể từ bỏ P.

Để dễ hình dung, hãy giả sử quầy giao dịch tại hai chi nhánh ngân hàng chỉ kết nối với nhau qua đường dây điện thoại. Nếu cả hai quầy vẫn cho phép rút tiền riêng rẽ (tính sẵn sàng) ngay khi đường dây bị ngắt (phân hoạch), số dư có thể không khớp nhau (tổn hại tính nhất quán). Nếu dừng giao dịch để giữ số dư khớp nhau (duy trì tính nhất quán), khách hàng sẽ bị từ chối phục vụ (tổn hại tính sẵn sàng).


Vì sao không thể đồng thời có cả ba?

Khi mạng bị phân hoạch, các nhóm nút không thể kiểm tra trạng thái mới nhất của nhau. Khi đó, về cơ bản có hai hướng lựa chọn.

(1) Khi chọn CP
Để duy trì tính nhất quán, không được cho phép ghi khi chưa biết trạng thái phía bên kia. Vì vậy, một số yêu cầu sẽ bị từ chối hoặc phải chờ. Dữ liệu vẫn đúng, nhưng vào thời điểm đó, dịch vụ có thể trông như “không phản hồi”. Các cơ sở dữ liệu truyền thống dựa trên đồng thuận hoặc các hệ thống đề cao tính nhất quán mạnh thường gần với hướng này hơn.

(2) Khi chọn AP
Để duy trì tính sẵn sàng, mỗi nút vẫn phản hồi dù chỉ dựa trên thông tin mình có. Dịch vụ tiếp tục hoạt động, nhưng có thể hiển thị các giá trị khác nhau cho đến khi phân hoạch được giải quyết. Hướng này thường đi kèm chiến lược “nhất quán cuối cùng (Eventual Consistency)”, trong đó dữ liệu được đưa về thống nhất sau đó thông qua đồng bộ hóa và giải quyết xung đột.

Thuật ngữ “hệ thống CA” cũng xuất hiện trong sách giáo khoa, nhưng gần với một mô hình lý tưởng hóa dựa trên giả định về môi trường tuyệt đối không xảy ra phân hoạch hơn. Dù có thể đạt được gần đúng trên một thiết bị đơn lẻ hoặc một cụm cục bộ rất ổn định, vẫn khó bỏ qua P khi phân tán trên diện rộng. Vì vậy, câu hỏi trong thực tiễn thường gần với “Khi phân hoạch xảy ra, nên nhượng bộ thuộc tính nào giữa C và A, và nhượng bộ đến mức nào?”hơn là “Nên bỏ thuộc tính nào trong C·A·P?”.


Nên diễn giải CAP như thế nào trong thực tiễn?

Định lý CAP đem lại một góc nhìn sâu sắc, nhưng không phải là nhãn phân loại dùng được cho mọi trường hợp. Chính Brewer cũng từng nhìn lại trong một bài viết sau đó rằng khẩu hiệu “2 trong 3” đã gây hiểu nhầm. Với các hệ thống hiện đại, cần kết hợp thêm những góc nhìn bổ sung sau.

  • Vấn đề về mức độ: Tính nhất quán và tính sẵn sàng không phải công tắc bật tắt, mà tạo thành một phổ liên tục. Những cách kết hợp như nới lỏng tính nhất quán khi đọc nhưng duy trì tính nhất quán mạnh khi ghi rất phổ biến.
  • Mối quan hệ với độ trễ: PACELC do Daniel Abadi hệ thống hóa cho rằng ngay cả khi không có phân hoạch (Else), vẫn tồn tại sự lựa chọn giữa độ trễ (Latency) và tính nhất quán.
  • Ưu tiên theo nghiệp vụ: Các luồng liên quan đến tiền bạc như thanh toán và tồn kho thường nghiêng về C, còn các luồng chấp nhận được một chút chênh lệch thời gian như bảng tin và lượt xem thường nghiêng về A.

Thay vì kết thúc bằng một nhãn ngắn gọn như “hệ thống của chúng tôi là CP/AP”, người thiết kế cần mô tả cụ thể thao tác nào bảo đảm điều gì trong tình huống nào. CAP không phải quy luật loại bỏ các lựa chọn, mà là tấm bản đồ giúp nhận diện trước những giới hạn của môi trường phân tán.

Định lý CAP không phải lời cảnh báo rằng “không có hệ thống phân tán hoàn hảo”. Đó là lời mời gọi: hãy thừa nhận các giới hạn, rồi thiết kế sự thỏa hiệp phù hợp với hoạt động kinh doanh. Giả định trước tình huống mạng gặp trục trặc và xác định sẵn sẽ bảo vệ tính nhất quán hay tính sẵn sàng chính là bước đầu tiên để thiết kế một hệ thống phân tán ổn định.