聊聊Raft一致性協議以及Apache Ratis


前言


在分布式系統中,有一類經典的問題經常會被提起:一致性問題。在單機環境中,這看起來根本不是一個問題。但是在多機,多服務,不同網絡環境下時,一致性問題就是一個典型的問題了。在分布式系統中,當我們提到一致性問題時,我們立馬想到的是Paxos協議。而對此協議的一個開源的實現框架是目前被廣泛使用的組件Zookeeper。但是所說Paxos比較成熟,但是它比較晦澀難懂,實現起來也比較復雜。於是另外一種邏輯比較清晰的一致性算法出現了:Raft算法。本文筆者來簡單闡述此協議算法的內容以及對應的工具庫實現Apache Ratis。

分布式系統中的經典問題:Consensus問題


首先,我們還是需要了解下Raft要解決的問題:Consensus問題。Consensus是一個在具有容錯能力的分布式系統中需要去解決的一個基本問題(因為不同服務狀態能達成一致,所以系統才有容錯能力)。這里需要多系統服務之間通信協調來達成具有一致性的狀態或值。這里面還包括於說不同服務在所經歷的transaction操作以及所更新的狀態值也應該是完全一致的。這里其實我們提到的里面的狀態機(State Machine)的情況了

Raft一致性算法的使用場景


基於Raft的一致性,我們可以有哪些使用場景呢,這里主要有以下2個:

  • Log Replication。我們可以理解為一個Log代表的是一次transaction操作記錄。
  • Replicated state machines,副本狀態機。它能保證所有的服務間的狀態的同步性。

Raft算法原理


OK,此處我們開始正式地來了解Raft協議。
前面也已經提到過,Raft相比較於Paxos,它的實現過程更加簡潔一些,邏輯也更加清晰一些。相比較於Paxos每個階段復雜的操作步驟,Raft的步驟可以用下面簡單的文字進行概括。

首先這里會有3個角色身份:

  • Leader,領導者身份。由此身份來向其Follower身份發號各種施令。同時Leader通過心跳的方式來表明其領導屬性。
  • Follower,跟隨者身份。接收Leader的命令指示,並執行結果。同時當在一定超時時間內沒有收到Leader的消息后,能夠變為Candidate身份,重新競選Leader身份。
  • Candidate身份。可由Follower轉變而來,Candidate向其他Follower機器發送投票選舉,當超過半數以上的投票選擇后,能成為Leader身份。

這里有個特殊case,當有2個Candidate在最后時間里得到了相同票數的時候,那么此輪選舉將會失敗,隨后會進行一次隨機超時時間內的新一輪選舉,官方術語稱為Split Vote(投票分裂)。這樣發生同票現想的幾率就會變低了

以下是3種身份角色的轉換圖:

在這里插入圖片描述

Leader和Follower之間的交互關系,首先是Leader(下圖S1)發出操作命令,比如說是一次Log append entry:

在這里插入圖片描述

然后是Follower反饋給Leader過程。

在這里插入圖片描述

Raft協議的一致性過程


基於Raft一致性協議下,服務間是如何保證做到狀態的同步性的呢?如下圖所示:

在這里插入圖片描述

我們可以看到,每個Server通過一致性算法過程得到每次的Log記錄,等每次Log操作記錄完整持久化到本地Sever之后,然后再經過3步驟,apply log到狀態機中,這樣每個Sever的狀態演變過程以及最終狀態值都將是完全同步的。

Raft的java實現庫:Apache Ratis


為了將Raft一致性算法更方便地使用於各個分布式系統中,以此構建出容錯性更強的分布式服務。Apache Ratis誕生了,它是一個Raft算法的Java實現庫。目前在Ozone被用來做Container command的replicate的執行。在未來還將用於Ozone HA的實現。

另外,Apache Ratis還能夠定制化上節中Log Store存儲和狀態機的自定義實現。這無疑大大增強了Ratis的使用性和靈活性。

以上就是筆者對於Raft算法的簡單闡述了,更多內容詳見引用鏈接處。

引用


[1].https://raft.github.io/raft.pdf
[2].http://ratis.incubator.apache.org/
[3].https://raft.github.io/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM