早在2013年11月份,在raft論文還只能在網上下載到草稿版時,我曾經寫過一篇blog對其進行簡要分析。4年過去了,各種raft協(xié)議的講解鋪天蓋地,raft也確實得到了廣泛的應用。其中最知名的應用莫過于etcd。etcd將raft協(xié)議本身實現(xiàn)為一個library,位于https://github.com/coreos/etcd/tree/master/raft,然后本身作為一個應用使用它。

本文不講解raft協(xié)議核心內容,而是站在一個etcd raft library使用者的角度,講解要用上這個library需要了解的東西。

這個library使用起來相對來說還是有點麻煩。官方有一個使用示例在 https://github.com/coreos/etcd/tree/master/contrib/raftexample。整體來說,這個庫實現(xiàn)了raft協(xié)議核心的內容,比如append log的邏輯,選主邏輯,snapshot,成員變更等邏輯。需要明確的是:library沒有實現(xiàn)消息的網絡傳輸和接收,庫只會把一些待發(fā)送的消息保存在內存中,用戶自定義的網絡傳輸層取出消息并發(fā)送出去,并且在網絡接收端,需要調一個library的函數(shù),用于將收到的消息傳入library,后面會詳細說明。同時,library定義了一個Storage接口,需要library的使用者自行實現(xiàn)。

Storage接口如下:

// Storage is an interface that may be implemented by the application// to retrieve log entries from storage.//// If any Storage method returns an error, the raft instance will//&nb