ratis - 整體概念

? ? ratis是raft協(xié)議java版本的開源實(shí)現(xiàn)項(xiàng)目,位于Apache項(xiàng)目下。項(xiàng)目git地址:https://github.com/apache/ratis。raft協(xié)議是基于日志的強(qiáng)領(lǐng)導(dǎo)模型的共識(shí)算法。leader選舉、集群數(shù)據(jù)同步都離不離開日志。ratis最終目的是為了實(shí)現(xiàn)分布式系統(tǒng)的高可用性,對(duì)于具體的應(yīng)用程序,ratis使用狀態(tài)機(jī)(StateMachineUpdater)對(duì)具體的應(yīng)用程序抽象隔離,保證ratis實(shí)現(xiàn)raft協(xié)議的純粹性和可移植性。

1、Ratis結(jié)構(gòu)梳理

1、raft協(xié)議

圖1.1

2、mutli-raft協(xié)議

圖1.2

2、ratis正常工作模型

圖2.1

客戶端向raftServerImpl提交請(qǐng)求,請(qǐng)求最終由 RaftLog、LogAppender、LeaderState、StateMachineUpdater、StateMachine共同完成。具體步驟如下:

? ? 1、客戶端向RaftServerImpl發(fā)送請(qǐng)求

? ? ?2、RaftServerImpl將請(qǐng)求發(fā)送給RaftLog,構(gòu)建日志并寫入日志文件。

? ? 3、RaftServerImpl將請(qǐng)求提交給LeaderState(返回一個(gè)CompelableFuture),等待請(qǐng)求處理完成。

? ? 4、LogAppender檢測(cè)到新增日志,復(fù)制日志到對(duì)應(yīng)的Follower節(jié)點(diǎn),并等待節(jié)點(diǎn)的響應(yīng)。

? ? 5、LogAppender接收到Follower節(jié)點(diǎn)日志提交成功響應(yīng)后,將日志發(fā)送給LeaderState提交。

? ? 6、LeaderState檢測(cè)到大所屬節(jié)點(diǎn)都已經(jīng)同步成功后,提交日志,并通知StateMachineUpdater服務(wù)

? ? 7、StateMachineUpdater服務(wù)檢測(cè)到新提交的日志,讀取日志并發(fā)送給StateMachine(應(yīng)用程序通過該步驟接收到客戶請(qǐng)求)并處理日志。

? ? 8、StateMachine處理完成提交的日志,將對(duì)應(yīng)日志在LeaderState中的CompletableFuture狀態(tài)更新為完成。

? ? 9、RaftServerImpl通過CompletableFuture接收到處理結(jié)果,并返回給客戶端。

3、ratis啟動(dòng)

圖3.1

? ? ratis啟動(dòng)可以分解成三個(gè)部分:1、初始化;2、leader選舉;3、啟動(dòng)leader;

1、初始化

? ? 初始化部分是指Ratis正常工作的必要模塊的初始化和啟動(dòng)。其中就包括:1、RaftServerImpl的初始化;2、LifeCycle生命周期管理器初始化;3、StateMachineUpdater應(yīng)用日志服務(wù)器的初始化和啟動(dòng),以及作為初始角色Follower對(duì)應(yīng)的服務(wù)FollowerState的初始化和啟動(dòng)。其中RaftServerImpl、LifeCycle、StateMachineUpdater不論節(jié)點(diǎn)屬于什么角色,這三個(gè)服務(wù)都是必要服務(wù)。

啟動(dòng)順序?yàn)椋?/p>

? ? 1、有代理服務(wù)初始化LifeCycle生命周期控制器

? ? 2、構(gòu)建RaftServerImpl服務(wù)實(shí)例,調(diào)用start方法啟動(dòng)該服務(wù)(這里的star并不是啟動(dòng)一個(gè)單獨(dú)線程)

? ? 3、由RaftServerImpl初始節(jié)點(diǎn)角色管理服務(wù),并將Follower作為初始角色啟動(dòng)(設(shè)置角色為:follower,啟動(dòng)角色對(duì)應(yīng)的后臺(tái)服務(wù)FoloowerState)。

? ? 4、設(shè)置集群為運(yùn)行狀態(tài)(更新LifeCycle的狀態(tài))? ??

2、leader選舉

? ? ratis的leader選舉是由Follower后臺(tái)服務(wù)FollowerState觸發(fā),在指定的超時(shí)時(shí)間范圍內(nèi)沒有接收到Leader心跳請(qǐng)求,就觸發(fā)節(jié)點(diǎn)角色的變更(由Follower角色變更為 Candidate角色,并啟動(dòng)Candidate角色對(duì)應(yīng)的后臺(tái)服務(wù)LeaderElection),開啟Raft 候選人的leader選舉流程。

如1.2圖:

? ? 第10步:指Follower角色對(duì)應(yīng)的后臺(tái)服務(wù)FollowerState在指定時(shí)間內(nèi)沒有接收到Leader的心跳信息,于是觸發(fā)角色變更。

? ? 第11步:FollowerState -> RaftServerImpl#changeToCandidate指FollowerState通過Raft頂層服務(wù)RaftServerImpl變更節(jié)點(diǎn)角色,并結(jié)束當(dāng)前服務(wù)(結(jié)束FollowerState服務(wù))

? ? 第12步:RaftServerImpl -> RoleInfo#startLeaderElection指RaftServerImpl通知RoleInfo將節(jié)點(diǎn)角色變更為:Candidate

????第13步:并啟動(dòng)leader選舉(也就是Candidate角色對(duì)應(yīng)的后臺(tái)服務(wù) - LeaderElection服務(wù))


圖3.2

? ? ? ?LeaderElection服務(wù)啟動(dòng)后,就開始向配置文件中配置的其它節(jié)點(diǎn)發(fā)送投票請(qǐng)求。正常清情況下投票請(qǐng)求分為兩個(gè)階段:

? ? ? ? ? ? 1、預(yù)選階段 - Phase.PRE_VOTE

? ? ? ? ? ? ? ? 預(yù)選階段抓喲是檢查當(dāng)前集群是否存在合法的leader,該步驟可以通過配置:raft.server.leaderelection.pre-vote?關(guān)閉該步驟。??

? ? ? ? ? ? 2、競(jìng)選階段 - Phase.ELECTION

? ? ? ? ? ? ? ? 競(jìng)選階段就是正式leader競(jìng)選,candidate向各節(jié)點(diǎn)開始拉票,并在指定節(jié)時(shí)間內(nèi)統(tǒng)計(jì)得到的投票情況。

3、leader啟動(dòng)

leader的啟動(dòng)由LeaderElection選舉通過觸發(fā)。如圖1.2時(shí)序圖所示:

? ? 第14步:由LeaderElection調(diào)用RaftServerImpl#changeToLeader,開啟leader上位。

? ? 第15步:RaftServerImpl調(diào)用RoleInfo#shutDownElection,關(guān)閉LeaderElection后臺(tái)服務(wù)。

? ? 第17步:RaftServerImpl調(diào)用RoleInfo#becomeLeader,將節(jié)點(diǎn)的角色設(shè)置為:leader,并初始化啟動(dòng)LeaderStateImpl。

? ? 第18步:LeaderState初始化并啟動(dòng)LogAppender,開啟leader日志同步后臺(tái)服務(wù)。

至此,Ratis服務(wù)leader上位就結(jié)束,可以開啟正常的服務(wù)請(qǐng)求處理了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容