Raft là gì: Thuật toán đồng thuận cho hệ thống phân tán

Thuật toán Raft là gì: Giải pháp đồng thuận dễ hiểu cho các hệ thống phi tập trung

Thuật toán Raft là gì? Đây là một giao thức đồng thuận được thiết kế để thay thế Paxos, nổi bật bằng cách tách biệt logic rõ ràng, dễ hiểu hơn nhưng vẫn đảm bảo tính an toàn và khả năng chịu lỗi. Raft cho phép một nhóm máy chủ duy trì một bản sao chung của trạng thái (state machine) và đồng ý về thứ tự các thao tác khi một số máy chủ bị lỗi.

Thuật toán được đặt tên dựa trên từ viết tắt của các từ Reliable, Replicated, Redundant, And Fault-Tolerant. Raft hiện đã được triển khai trong nhiều dự án biết đến như etcd, Consul và nhiều hệ thống lưu trữ phân tán khác.

Sơ đồ ba trạng thái của một máy chủ trong thuật toán Raft gồm follower, candidate và leader với các mũi tên chuyển trạng thái theo điều kiện

Cách hoạt động của Raft

Raft chia thời gian thành các kỳ hạn (terms). Mỗi kỳ hạn bắt đầu với một cuộc bầu chọn lãnh đạo, trong đó các máy chủ tranh cử vai trò lãnh đạo. Khi một lãnh đạo được chọn, nó chịu trách nhiệm nhận yêu cầu từ khách hàng, sao chép nhật ký (log) đến các máy chủ khác và áp dụng các thay đổi vào trạng thái chung.

1. Bầu chọn lãnh đạo

  • Mỗi máy chủ có một thời gian chờ ngẫu nhiên (election timeout) thường từ 150 tới 300 mili giây.
  • Nếu không thấy tin nhắn từ lãnh đạo trong khoảng thời gian chờ, máy chủ trở thành ứng viên (candidate), tăng term và bỏ phiếu cho chính mình, sau đó gửi tin nhắn RequestVote đến tất cả các máy chủ khác.
  • Một máy chủ sẽ bỏ phiếu cho ứng viên đầu tiên mà nó thấy trong kỳ hạn hiện tại, miễn là ứng viên có term không nhỏ hơn term của mình và nhật ký của ứng viên đầy đủ và cập nhật.
  • Nếu ứng viên nhận được hơn một nửa số phiếu, nó trở thành lãnh đạo mới trong kỳ hạn này.
  • Ngược lại, nếu không đủ phiếu hoặc có máy chủ có term cao hơn, ứng viên hủy candidacy và trở thành người theo dõi (follower), chờ lãnh đạo mới xuất hiện.
Sơ đồ nhân bản log Raft cho thấy leader gửi mục log mới tới các follower và phản hồi thành công khi hơn nửa máy chủ xác nhận

2. Nhân bản log (log replication)

Khi lãnh đạo đã được chọn, nó thực hiện hai công việc chính:

  • Nhận yêu cầu từ khách hàng và mỗi yêu cầu được thêm vào nhật ký của lãnh đạo như một mục log mới (entry).
  • Gửi tin nhắn AppendEntries đến tất cả các follower để sao chép mục log này. Mỗi tin nhắn kèm theo chỉ số và thuật ngữ của mục log trước đó để follower có thể kiểm tra tính tương thích.

Sau khi hơn nửa số máy chủ phản hồi thành công, lãnh đạo xem mục log đã được ghi và áp dụng nó vào trạng thái của mình. Quy trình này cũng đồng thời ghi tất cả các mục log trước đó.

Nếu follower phát hiện nhật ký của mình không khớp (ví dụ do lỗi mạng), nó từ chối tin nhắn và lãnh đạo sẽ ghi đè các mục log xung đột từ vị trí không khớp bằng các mục log mới của mình.

An toàn và tính chính xác

Raft được chứng minh toán học là an toàn dưới mô hình lỗi máy chủ dừng (crash-stop), tức là giả định máy chủ không thể hành động bất thường khi lỗi mà không thể gửi tin nhắn sai (Byzantine). Các tính chất then chốt bao gồm:

  • An toàn انتخاب lãnh đạo: mỗi kỳ hạn chỉ có tối đa một lãnh đạo được chọn.
  • Thành viên log: nếu hai mục log có cùng chỉ số và cùng thuật ngữ, thì tất cả các mục log trước đó cũng giống nhau.
  • Tính chất chỉ-đọc của lãnh đạo: lãnh đạo trong một kỳ hạn không bao giờ ghi đè hoặc xóa các mục log đã cam kết trong nhật ký của mình.
  • An toàn thành viên log: nếu một mục log được áp dụng vào trạng thái của một máy chủ, thì cùng mục log sẽ cũng tồn tại ở cùng vị trí trong nhật ký của mọi máy chủ khác và sẽ cuối cùng được áp dụng vào trạng thái của chúng.

So sánh Raft với Paxos

Tiêu chí Paxos Raft
Khó hiểu Cao – logic phức tạp Thấp – được thiết kế để dạy và học dễ
Bước quyết định Hai giai đoạn (prepare/accept) Một giai đoạn (AppendEntries) – đơn giản hơn
Thời gian chờ ngẫu nhiên Có (để tránh livelock) Có (election timeout – tránh bầu chọn bị chia đôi)
Triển khai thực tế Ít Nhiều (etcd, Consul, TiKV)

Mặc dù Paxos còn được dùng trong một số hệ thống cũ, Raft ngày càng được ưu chọn vì độ đơn giản và tài liệu hướng dẫn rõ ràng, giúp đội ngũ phát triển triển khai và bảo trì dễ dàng hơn.

Ứng dụng thực tế

Raft được triển khai trong nhiều hệ thống quan trọng:

  • etcd: khoá giá trị phân tán dùng làm nền tảng cho Kubernetes để lưu trạng thái cluster.
  • Consul: dịch vụ tìm kiếm và cấu hình phân tán, bao gồm health check và service discovery.
  • Cơ sở dữ liệu phân tán: nhiều DB NewSQL như TiKV dùng Raft để sao chép dữ liệu giữa các node.

Ngoài ra, Raft còn được dùng trong các hệ thống điều khiển công nghiệp, mạng lưới cảm biến và bất kỳ nơi nào cần đảm bảo tính nhất quán trong môi trường có thể xảy ra lỗi phần cứng.

Nguồn tham khảo

Kết luận

Thuật toán Raft giải quyết bài toán đồng thuận bằng cách đặt emphasis vào khả năng hiểu và triển khai thực tế. Thay vì logic trộn lẫn như Paxos, Raft chia vấn đề thành các bước rõ ràng: bầu chọn lãnh đạo, nhân bản log và an toàn thành viên. Nhờ vậy, dù là nhà phát triển mới cũng có thể nắm vững và áp dụng vào dự án của mình trong thời gian ngắn. Với sự phổ biến ngày càng tăng trong hạ tầng điện toán đám mây và vi xử lý, Raft tiếp tục là lựa chọn hàng đầu cho những ai cần một giải pháp đồng thuận đáng tin cậy, dễ hiểu và có thể mở rộng.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Sơ đồ khối OLAP cube ba chiều minh họa cách tổ chức dữ liệu phân tích trong DuckDB

DuckDB là gì: Cơ sở dữ liệu phân tích nhúng cho lập trình viên

DuckDB là hệ thống quản lý CSDL quan hệ định hướng cột (column-oriented RDBMS) mã nguồn mở, được thiết kế để tối ưu hiệu năng cho các truy vấn phức…

Xem thêm

GraphQL là gì? Ngôn ngữ truy vấn API linh hoạt cho lập trình viên

GraphQL là gì? GraphQL là một ngôn ngữ truy vấn và thao tác dữ liệu cho API, cho phép khách hàng xác định chính xác cấu trúc dữ liệu họ…

Xem thêm

io_uring là gì: API I/O bất đồng bộ hiệu năng cao của nhân Linux

io_uring là giao diện lập trình ứng dụng (API) I/O bất đồng bộ dành riêng cho nhân Linux, cho phép tiến trình gửi hàng loạt yêu cầu đọc ghi mà…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất