Raft實(shí)現(xiàn)報(bào)告(20)
客戶端的交互
上節(jié)講到了給每個執(zhí)行的命令賦予序列號,那么接收到相同序列號的命令代表已經(jīng)執(zhí)行過了,不會重復(fù)執(zhí)行。
無需將任何內(nèi)容寫入日志即可處理制度操作。
但是,如果沒有額外的措施,這將冒著返回陳舊數(shù)據(jù)的風(fēng)險(xiǎn),因?yàn)轫憫?yīng)請求的leader可能已經(jīng)被他不知道的新leader取代了。線性化讀取不能返回陳舊數(shù)據(jù),Raft需要兩個額外的預(yù)防措施來保證這一點(diǎn),而不是用日志。
首先,leader必須擁有提交的條目的最新信息,leader完整性的特性保證leader擁有所有一提交的條目,但是從其的起始term開始,它可能不知道那些是哪些。要找到他們,他需要從其任期內(nèi)提交一個條目,Raft通過讓每個leader在其任期開始向日志中提交一個空白的條目,來處理這個問題。
然后,leader必須在處理制度請求之前檢查它是否已經(jīng)被廢除(如果選舉了更新的leader,其信息可能是陳舊的)。Raft通過讓leader在響應(yīng)時(shí)只讀請求之前與大多數(shù)集群交換心跳信息來處理這個問題?;蛘遧eader可以依靠心跳機(jī)制來提供一種合約形式,但這將依賴于安全時(shí)間。
實(shí)現(xiàn)與評估
Raft的實(shí)現(xiàn)大約2000行C++代碼,不包括測試,注釋,或空白行。源代碼http://github.com/ logcabin/logcabin。而根據(jù)他們論文相關(guān)的獨(dú)立實(shí)現(xiàn)也有25個第三方開源的,都處于不同的開發(fā)階段。
http://raftconsensus.github.io.