參考資料:
源碼地址:https://github.com/corgi-kx/blockchain_consensus_algorithm/tree/master/raft
本demo為raft的代碼實(shí)現(xiàn)确徙,如果想了解raft的詳細(xì)信息請(qǐng)自行谷歌
本demo展示了raft的部分功能,寫的并不嚴(yán)謹(jǐn),僅作為對(duì)raft的了解用途
實(shí)現(xiàn)功能:
- 節(jié)點(diǎn)狀態(tài)分為Leader(領(lǐng)導(dǎo)者)、Follower(追隨者)域醇、Candidate(候選人)
- 節(jié)點(diǎn)間隨機(jī)成為candidate狀態(tài)并選舉出Leader,且同時(shí)僅存在一個(gè)Leader
- Leader節(jié)點(diǎn)定時(shí)發(fā)送心跳檢測至其他Follower節(jié)點(diǎn)
- Follower節(jié)點(diǎn)們超過一定時(shí)間未收到心跳檢測蓉媳,則Follower節(jié)點(diǎn)們重新開啟選舉
- 客戶端通過http發(fā)送消息到節(jié)點(diǎn)A譬挚,如果A不是Leader則轉(zhuǎn)發(fā)至Leader節(jié)點(diǎn)
- Leader收到客戶端的消息后向Follower節(jié)點(diǎn)進(jìn)行廣播
- Follower節(jié)點(diǎn)收到消息,反饋給Leader酪呻,等待Leader確認(rèn)
- Leader收到全網(wǎng)超過二分之一的反饋后减宣,本地進(jìn)行打印,然后將確認(rèn)收到反饋的信息提交到Follower節(jié)點(diǎn)
- Follower節(jié)點(diǎn)收到確認(rèn)提交信息后玩荠,打印消息
運(yùn)行步驟:
1.下載/編譯
git clone https://github.com/corgi-kx/blockchain_consensus_algorithm.git
cd blockchain_consensus_algorithm/raft
go build -o raft.exe
2.開啟三個(gè)端口蚪腋,并分別執(zhí)行raft.exe A 丰歌、raft.exe B 姨蟋、 raft.exe C屉凯,代表開啟三個(gè)節(jié)點(diǎn)(初始狀態(tài)為追隨者)
3.三個(gè)節(jié)點(diǎn)會(huì)隨機(jī)選舉出領(lǐng)導(dǎo)者(其中A節(jié)點(diǎn)默認(rèn)監(jiān)聽來自http的訪問),成功的節(jié)點(diǎn)會(huì)發(fā)送心跳檢測到其他兩個(gè)節(jié)點(diǎn)
4.此時(shí)打開瀏覽器用http訪問本地節(jié)點(diǎn)8080端口,帶上節(jié)點(diǎn)需要同步打印的消息眼溶,比如:
http://localhost:8080/req?message=噢悠砚,我的上帝呀
可以看到三個(gè)節(jié)點(diǎn)同時(shí)打印了消息,本段數(shù)據(jù)同步步驟可以用下圖進(jìn)行理解(不過缺少了4.1步驟)
在這里插入圖片描述
5.如果領(lǐng)導(dǎo)者節(jié)點(diǎn)宕機(jī)了怎么辦呢堂飞,我們嘗試關(guān)閉領(lǐng)導(dǎo)者節(jié)點(diǎn)B
可以發(fā)現(xiàn)關(guān)閉領(lǐng)導(dǎo)者B后灌旧,節(jié)點(diǎn)間有個(gè)超時(shí)機(jī)制,如果超過一定時(shí)間沒有收到心跳檢測绰筛,則會(huì)自動(dòng)開始重新進(jìn)行選舉枢泰,此時(shí)A當(dāng)選了新的領(lǐng)導(dǎo)者
6.再次打開瀏覽器用http訪問本地節(jié)點(diǎn)8080端口,帶上節(jié)點(diǎn)需要同步打印的消息铝噩,看看還能同步打印嗎
http://localhost:8080/req?message=天氣不錯(cuò)
結(jié)果發(fā)現(xiàn)可以打印的衡蚂,因?yàn)樾碌念I(lǐng)導(dǎo)者A、追隨者C并沒有宕機(jī)骏庸,A收到了C的回饋(2>3/2)超過了全網(wǎng)一半的節(jié)點(diǎn)毛甲,所以是可以進(jìn)行打印數(shù)據(jù)的
7.重新啟動(dòng)節(jié)點(diǎn)B,B自動(dòng)變?yōu)樽冯S者狀態(tài)具被,并接收來自新的領(lǐng)導(dǎo)者A的心跳檢測
???建了個(gè)QQ群:722124200 有問題可以加群互相討論 :)
???郵箱:mikesen1994@gmail.com ?????? ?? ???? ? vx:965952482