簡述Raft一致性算法
在分布式系統(tǒng)中,多個節(jié)點可能會同時對相同的數(shù)據(jù)進行操作,為了保證數(shù)據(jù)的一致性,需要使用一致性算法讓所有節(jié)點達成一致。下面我們就來了解一下Raft一致性算法。
Raft一致性算法簡介
Raft是一種簡單方便易于理解的一致性算法,相比傳統(tǒng)的Paxos算法,Raft將大量的計算問題分解成為了一些簡單的相對獨立的子問題。
Raft一致性算法增加了強領導性,優(yōu)化了領導的選舉過程,在成員發(fā)生變化之后依然能夠很好的進行工作。

Raft一致性算法的原理
Raft一致性算法的原理是將系統(tǒng)中的所有節(jié)點分為三種角色,分別是領導者(Leader)、跟隨者(Follower)和候選領導者(Candidate)。
領導者負責處理所有的寫請求,并將這些請求復制給其他節(jié)點;跟隨者則負責接收領導者的命令并執(zhí)行,同時保持與領導者的同步;當領導者出現(xiàn)故障時,候選領導者會發(fā)起選舉,選舉出新的領導者。
Raft一致性算法的過程
Leader選舉的過程
Raft使用心跳(heartbeat)觸發(fā)Leader選舉。當服務器啟動時,初始化為Follower。Leader向所有Followers周期性發(fā)送heartbeat。如果Follower在選舉超時時間內(nèi)沒有收到Leader的heartbeat,就會等待一段隨機的時間后發(fā)起一次Leader選舉。
每一個Followers都有一個時鐘,是一個隨機的值,表示的是Follower等待成為Leader的時間,誰的時鐘先跑完,則發(fā)起leader選舉。
Follower將其當前term加一然后轉(zhuǎn)換為Candidate。它首先給自己投票并且給集群中的其他服務器發(fā)送 RequestVote RPC。

日志復制的過程
Leader選出后,就開始接收客戶端的請求。Leader把請求作為日志條目(Log entries)加入到它的日志中,然后并行的向其他服務器發(fā)起 AppendEntries RPC復制日志條目。當這條日志被復制到大多數(shù)服務器上,Leader將這條日志應用到它的狀態(tài)機并向客戶端返回執(zhí)行結(jié)果。
日志壓縮
在實際的系統(tǒng)中,不能讓日志無限增長,否則系統(tǒng)重啟時需要花很長的時間進行回放,從而影響可用性。Raft采用對整個系統(tǒng)進行snapshot來解決,snapshot之前的日志都可以丟棄。

Raft一致性算法的特點
- 強領導者:和其他一致性算法相比,Raft 使用一種更強的領導能力形式。比如,日志條目只從領導者發(fā)送給其他的服務器。這種方式簡化了對復制日志的管理并且使得 Raft 算法更加易于理解。
- 領導選舉:Raft 算法使用一個隨機計時器來選舉領導者。這種方式只是在任何一致性算法都必須實現(xiàn)的心跳機制上增加了一點機制。在解決沖突的時候會更加簡單快捷。
- 成員關(guān)系調(diào)整:Raft 使用一種共同一致的方法來處理集群成員變換的問題,在這種方法下,處于調(diào)整過程中的兩種不同的配置集群中大多數(shù)機器會有重疊,這就使得集群在成員變換的時候依然可以繼續(xù)工作。
免責聲明:素材源于網(wǎng)絡,如有侵權(quán),請聯(lián)系刪稿。




