Giải thuật phân tán: Giải thích thuật toán đồng thuận Raft một cách dễ hiểu qua ví dụ trực quan
Bài toán đồng thuận Consensus trong hệ thống phân tán Làm thế nào để 5 máy chủ độc lập nằm ở các trung tâm dữ liệu khác nhau cùng thống nhất được một trạng thái dữ liệu duy nhất, ngay cả khi 2 trong …
☰ Mục lục bài viết (5 phần) Mở / Đóng mục lục
Bài toán đồng thuận (Consensus) trong hệ thống phân tán#
Làm thế nào để 5 máy chủ độc lập (nằm ở các trung tâm dữ liệu khác nhau) cùng thống nhất được một trạng thái dữ liệu duy nhất, ngay cả khi 2 trong số 5 máy bị sập nguồn hoặc đường truyền cáp quang biển bị đứt?
Trước đây, thuật toán Paxos được coi là tiêu chuẩn nhưng quá khó hiểu và cực kỳ phức tạp để hiện thực hóa bằng code.
Vào năm 2014, Raft Consensus Algorithm ra đời với mục tiêu tối thượng: Dễ hiểu và dễ áp dụng thực tế. Ngày nay, Raft đứng sau các hệ thống phân tán khổng lồ như etcd (trái tim của Kubernetes), Kafka KRaft, TiDB, và CockroachDB.
3 Trạng thái của một Node trong Raft#
Mỗi máy chủ trong cụm Raft luôn ở 1 trong 3 trạng thái:
- Follower (Người theo dõi): Lắng nghe lệnh từ Leader. Nếu quá thời gian (Election Timeout) không nghe thấy tín hiệu sống (Heartbeat) từ Leader $\rightarrow$ Tự ứng cử làm Candidate.
- Candidate (Ứng cử viên): Gửi yêu cầu bầu cử (
RequestVote) tới các node khác. Nếu giành được đa số phiếu ($\ge 3/5$ phiếu) $\rightarrow$ Đắc cử làm Leader. - Leader (Thủ lĩnh): Node duy nhất tiếp nhận mọi yêu cầu ghi từ client, ghi vào log của mình và phát tán (
AppendEntries) tới các Follower.
Cơ chế Bầu cử Leader (Leader Election) bằng Randomized Timeout#
Điểm thông minh nhất của Raft là: Thời gian chờ bầu cử của mỗi node được chọn ngẫu nhiên từ 150ms đến 300ms. Nhờ có sự chênh lệch ngẫu nhiên này, hầu như luôn luôn có một node tỉnh dậy trước, gửi phiếu xin bầu cử và đắc cử ngay lập tức, loại bỏ nguy cơ bị chia rẽ phiếu bầu (Split Vote)!
Nhật ký phân tán (Log Replication)#
Khi Leader nhận được lệnh SET name = "TopDev":
- Leader ghi tạm lệnh vào log cục bộ (chưa commit).
- Leader gửi lệnh sang tất cả Follower qua RPC
AppendEntries. - Khi đa số Follower (Quorum) xác nhận đã ghi log $\rightarrow$ Leader chính thức Commit lệnh và áp dụng vào máy trạng thái (State Machine).
- Leader trả lời client: "Ghi thành công!".
Góc thảo luận#
Anh em đã từng tìm hiểu qua Raft hay Paxos chưa? Đã từng gặp hiện tượng Split-Brain (Não phân đôi) trong các cụm cluster chưa?
Xem thêm nội dung liên quan:
Thảo luận
1 phản hồi
Tham gia thảo luận
Bài liên quan trong #Backend & Microservices
-
Áp dụng Model Context Protocol (MCP) của Anthropic để kết nối AI với Postgres và Docker
Hoàng Nam (Tech Lead) · 💬 1 -
So sánh mô hình Embedding đa ngữ: OpenAI text-embedding-3 vs BGE-M3 vs Cohere
Minh Trí (AI Engineer) · 💬 1 -
Xây dựng Voice AI Agent thời gian thực với WebRTC và Whisper Live: Độ trễ dưới 500ms
Lan Anh (Senior Frontend) · 💬 1 -
Cấu hình Rate Limiting ở tầng Nginx và API Gateway: Chống DDOS Layer 7 hiệu quả
Đức Huy (DevOps Specialist) · 💬 1 -
Tokenization tiếng Việt của các LLM: Tại sao chi phí tiếng Việt đắt gấp 3 lần tiếng Anh?
Minh Trí (AI Engineer) · 💬 1