1、閱讀raft論文
2、閱讀raft理論與實(shí)踐[1]-理論篇
3、閱讀raft理論與實(shí)踐[2]-lab2a
4、閱讀raft理論與實(shí)踐[3]-lab2a講解
5、閱讀raft理論與實(shí)踐[4]-lab2b日志復(fù)制
6、查看我寫(xiě)的這篇文章:?模擬RPC遠(yuǎn)程過(guò)程調(diào)用
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、河口網(wǎng)站維護(hù)、網(wǎng)站推廣。
如果基于Raft的服務(wù)器重新啟動(dòng),則應(yīng)從中斷的位置恢復(fù)服務(wù)。 這就要求Raft保持持久狀態(tài),使其在重啟后仍然有效。
論文中Figure 2指出了那些字段需要持久化。
并且raft.go包含有關(guān)如何保存和恢復(fù)持久性狀態(tài)的示例。
一個(gè)“真實(shí)的服務(wù)在每次Raft更改狀態(tài)時(shí)將Raft的持久狀態(tài)寫(xiě)入磁盤(pán),并在重新啟動(dòng)時(shí)從磁盤(pán)讀取最新的狀態(tài)來(lái)恢復(fù)。
但是我們的實(shí)現(xiàn)將會(huì)采用一個(gè)結(jié)構(gòu)體的方式來(lái)模擬實(shí)現(xiàn)persister.go。
調(diào)用Raft.Make()會(huì)提供一個(gè)Persister,它持有Raft的最近持久狀態(tài)。
Raft應(yīng)從該P(yáng)ersister初始化其狀態(tài),并在每次狀態(tài)更改時(shí)修改其持久狀態(tài)。
主要使用Persister的ReadRaftState()和SaveRaftState()方法。
在本實(shí)驗(yàn)中,我們需要完善在raft.go中的persist() and readPersist()方法。
需要使用到labgob包中的編碼與解碼函數(shù)。
你需要明確在什么時(shí)候需要持久化。
下面只列出兩個(gè)重要實(shí)現(xiàn),其他不再贅述,留給讀者自己實(shí)現(xiàn)。
func?(rf?*Raft)?persist()?{ ????//?Your?code?here?(2C). ????w?:=?new(bytes.Buffer) ????e:=?labgob.NewEncoder(w) ????e.Encode(rf.CurrentTerm) ????e.Encode(rf.VotedFor) ????e.Encode(rf.Logs) ????data?:=?w.Bytes() ????rf.persister.SaveRaftState(data) }
func?(rf?*Raft)?readPersist(data?[]byte)?{ ????if?data?==?nil?||?len(data)?1?{?//?bootstrap?without?any?state? ????????return ????} ????//?Your?code?here?(2C). ????r?:=?bytes.NewBuffer(data) ????d:=?labgob.NewDecoder(r) ????d.Decode(&rf.CurrentTerm) ????d.Decode(&rf.VotedFor) ????d.Decode(&rf.Logs) }
>?go?test?-v?-run=2C
https://github.com/dreamerjackson/golang-deep-distributed-lab