Skip to the content.

Thuật Toán Raft Consensus

Lịch sử

Thuật toán Raft Cosensus được phát triển bởi Diego dự trên Thuật toán Paxos thông qua bài báo In Search of an Understandable Consensus Algorithm.

Mục đích

Vấn đề bầu cử (lựa chọn) Leader server

Sẽ chả có vấn đề gì nếu như chúng ta sử dụng hệ thống Client - Server. Khi đó chỉ có 01 server chịu trách nhiệm tương tác với client.

img0

Vấn đề chỉ xảy ra khi chúng ta sử dụng 01 cụm server.

Sự đồng thuận (Consensus) : Đồng thuận có nghĩa là nhiều máy chủ đồng ý về cùng một thông tin, một điều bắt buộc để thiết kế các hệ thống phân tán chịu lỗi.

Giao thức đồng thuận có thể giải quyết được nhiều sự cố nhưng phải tuân theo các quy ước sau :

Có một số ý tưởng khá hay về hệ thống có nhiều máy chủ sau đây là 2 ý tưởng :

Ở bài viết này chúng ta sẽ cùng tìm hiểu về Hệ thống không đối xứng (Asymmetric). Vì giải pháp này được khá nhiều các hệ thống lựa chọn.

img1

Một số thuật ngữ trong Hệ thống không đối xứng (Asymmetric) :

img2

Hệ thống này sẽ tuân theo định lý CAP (CAP theorem) :

Giao thức Raft là gì ?

Raft là một thuật toán đồng thuận được thiết kế để dễ hiểu. Nó tương đương với Paxos về khả năng chịu lỗi và hiệu suất. Sự khác biệt là nó bị phân rã thành các bài toán con tương đối độc lập và nó giải quyết rõ ràng tất cả các phần chính cần thiết cho các hệ thống thực tế. Chúng tôi hy vọng Raft sẽ cung cấp sự đồng thuận cho nhiều đối tượng hơn và đối tượng rộng hơn này sẽ có thể phát triển nhiều hệ thống dựa trên sự đồng thuận chất lượng cao hơn so với hiện nay.

Quy trình lựa chọn leader server (Sơ đồ thuật toán)

img3

Term number là thời gian duy trì để truyền tải các thông tin giữa các server nodes. Trong khoảng thời gian đó các server sẽ vote ra leader server thông qua các đường truyền tin. Mỗi server chỉ được vote 1 lần trong thời gian bỏ phiếu. Nếu xảy ra tình huống có 2 server cùng số lượng vote thì nhiệm kỳ sẽ được gọi là split vote (Bỏ phiếu chia). Nhiệm kỳ sẽ kết thúc mà không có leader server nào được tạo. Và sẽ chạy lại nhiệm kỳ. Vì thế mỗi nhiệm kỳ chỉ có nhiều mất 01 leader server.

Mục đích sử dụng Term number :

Thuật toán Raft sử dụng 2 thủ tục được gọi từ xa (RPCs) :

Leader election : Để duy trì cuộc bầu cử thì leader server phải gửi request đến các follower server để thông báo được gọi là RequestVotes. Một cuộc bầu cử diễn ra khi Follower server hết thời gian chờ RequestVotes. Tại thời điểm đó Follower server sẽ tự ứng cử trở thành Candidate (ứng viên). Chính Cadidate sẽ cố gắng gửi RPC RequestVotes để trở thành Leader server.

Cuộc bầu cử sẽ diễn ra dưới 3 hình thức sau :

img4

Vấn đề sao lưu dữ liệu giữa các server

Log replication (bản sao nhật ký) : Khi leader server tương tác với client thì sẽ lưu lại dữ liệu gửi đi vào 1 thư mục mới và sử dụng AppendEmtries song song được kết nối với các máy chủ khác để sao lưu một cách an toàn. Việc bảo đảm log được lưu đúng chỉ mục trên tất cả các server node là điều tương đối khó khăn . Nếu như máy leader gặp sự cố có thể các nhật ký sẽ trở nên không được nhất quán chính vì vậy raft phát triển thuật toán lưu trữ dựa trên các server với nhau.

img5

Giải thích quá trình sao lưu:

Sơ đồ thuật toán :

img6

Các quy tắc về an toàn trong giao thức Raft đảm bảo sự an toàn sau đây chống lại sự cố đồng thuận nhờ thiết kế của nó:

Thời gian và tính sẵn sàng:

                BroadcastTime << electionTimeout << MTBF

Số điển hình cho các giá trị này có thể là 0,5ms đến 20ms cho BroadcastTime, điều này ngụ ý rằng bạn đặt thời gian bầu cử ở đâu đó trong khoảng từ 10ms đến 500ms. Có thể mất vài tuần hoặc vài tháng giữa các lần hỏng máy chủ, điều đó có nghĩa là các giá trị đều ổn để một cụm ổn định hoạt động.

Tài liệu tham khảo

Raft Consensus Algorithm

raft-paper

Dự án về raft