Vì sao cần bầu leader?
Trong hệ thống phân tán, nhiều tác vụ đòi hỏi đúng một node đứng ra điều phối: ghi dữ liệu vào log, phân phối công việc, hay quản lý khóa. Nếu không có cơ chế bầu chọn rõ ràng, hai node có thể cùng tự nhận mình là leader, gây ra tình trạng split-brain, một trong những lỗi nguy hiểm nhất khiến dữ liệu bị ghi đè, gây xung đột và mất tính nhất quán. Bài toán bầu leader nghe đơn giản nhưng trở nên phức tạp khi mạng bị phân vùng, node bị treo hoặc thông điệp bị trễ.
Bully algorithm: node có ID lớn nhất thắng
Đây là thuật toán cổ điển nhất do Garcia-Molina đề xuất năm 1982. Mỗi node có một ID duy nhất. Khi phát hiện leader hiện tại không phản hồi, node sẽ gửi thông điệp ELECTION tới tất cả node có ID cao hơn. Nếu không ai trả lời trong khoảng timeout, node đó tự tuyên bố làm leader. Nếu có node ID cao hơn phản hồi, node ban đầu rút lui và chờ kết quả. Ưu điểm của thuật toán là dễ hiểu, triển khai nhanh. Nhược điểm là tốn nhiều thông điệp, O(n²) trong trường hợp xấu nhất, và phụ thuộc nhiều vào timeout: đặt quá ngắn thì hệ thống bầu lại liên tục, đặt quá dài thì phải chờ lâu khi leader thực sự chết.
Ring election: vòng tròn bỏ phiếu
Thuật toán ring sắp xếp các node thành một vòng lôgic. Khi phát hiện leader mất kết nối, node sẽ tạo một thông điệp chứa ID của mình rồi gửi cho node kế tiếp trong vòng. Mỗi node nhận thông điệp sẽ thêm ID của mình vào danh sách rồi chuyển tiếp. Khi thông điệp quay về node khởi tạo, node đó chọn ID lớn nhất trong danh sách làm leader mới. Thuật toán này tiết kiệm thông điệp hơn Bully, chỉ O(n), nhưng tốc độ bầu chọn phụ thuộc vào kích thước vòng và có rủi ro khi một node trên vòng gặp lỗi giữa chừng.
Lease-based leadership: quyền lãnh đạo có thời hạn
Thay vì bầu chọn cố định, nhiều hệ thống hiện đại dùng cơ chế lease, tức quyền lãnh đạo có thời hạn. Node nào giành được lease từ dịch vụ điều phối như ZooKeeper hay etcd sẽ trở thành leader, nhưng chỉ trong thời hạn của lease đó. Khi lease hết hạn mà không được gia hạn, node sẽ tự động mất quyền lãnh đạo và hệ thống phải bầu lại. Cách tiếp cận này xử lý gọn vấn đề "zombie leader": node cũ bị treo rồi hoạt động lại nhưng không biết mình đã bị thay thế.
Split-brain và fencing token: khi hai node cùng nghĩ mình là leader
Split-brain xảy ra khi mạng bị phân vùng, khiến hai nhóm node mất liên lạc và mỗi nhóm tự bầu một leader riêng. Hậu quả là hai leader ghi dữ liệu song song, phá vỡ tính nhất quán. Để chống lại, hệ thống dùng fencing token: mỗi lần bầu leader mới, token tăng đơn điệu (ví dụ epoch 5, epoch 6). Mọi thao tác ghi phải kèm token hiện tại. Nếu leader cũ (epoch 5) tỉnh dậy sau khi bị phân vùng và gửi lệnh ghi, các node lưu trữ sẽ từ chối vì đã thấy epoch 6, ngăn chặn dữ liệu bị ghi đè. Cơ chế quorum (đa số phiếu) bổ sung thêm lớp bảo vệ: chỉ phân vùng có đa số node mới đủ điều kiện bầu leader, loại bỏ khả năng hai phân vùng cùng có leader hợp lệ.
Leader liveness detection: xác định leader còn hoạt động hay đã mất kết nối
Phát hiện leader đã chết là bài toán khó nhất, vì hệ thống không thể phân biệt leader thực sự gặp sự cố với trường hợp mạng chỉ bị chậm. Hầu hết hệ thống dùng heartbeat: leader gửi tín hiệu định kỳ, nếu node theo sau không nhận được trong một khoảng timeout thì coi như leader đã mất. Raft (thuật toán đồng thuận phổ biến trong các hệ thống phân tán hiện đại) dùng election timeout ngẫu nhiên để tránh nhiều follower cùng phát động bầu chọn. Kafka và RabbitMQ dùng node tạm thời (ephemeral node) của ZooKeeper: khi leader mất kết nối, session timeout sẽ xóa node tạm thời và kích hoạt đợt bầu chọn mới. Tuy nhiên, mọi cơ chế phát hiện đều có rủi ro báo động giả: leader có thể chỉ bị chậm mạng chứ chưa chết, nhưng hệ thống đã vội bầu leader mới. Chính vì vậy, fencing token là lớp phòng thủ cuối cùng khi cơ chế phát hiện mắc sai sót.
Bài học thực tế
Không có thuật toán leader election hoàn hảo. Bully algorithm đơn giản nhưng kém hiệu quả với cluster lớn. Ring election tiết kiệm nhưng chậm. ựa chọn phổ biến nhất trong hệ thống sản xuất vì kết hợp tốt giữa độ an toàn và hiệu suất. Nhưngg dù chọn thuật toán nào, luôn nhớ: fencing token và quorum là bắt buộc. Split-brain không phải lỗi hiếm gặp, nó là chuyện sẽ xảy ra, và hệ thống của bạn cần sẵn sàng cho nó.






