動(dòng)畫鏈接 http://thesecretlivesofdata.com/raft/
1.所有節(jié)點(diǎn)有三個(gè)狀態(tài)谆膳,leader,candidate,follower.其中candidate狀態(tài)不能對(duì)外工作叭爱。
2.選舉過程,每個(gè)節(jié)點(diǎn)兩個(gè)時(shí)間周期和選舉有關(guān)漱病。
election timeout:失去leader聯(lián)系的節(jié)點(diǎn)等待超過該時(shí)間买雾,則變?yōu)閏andidate.隨機(jī)在150ms 到 300ms之間。
heartbeat timeout:leader往follower發(fā)的庇С疲活心跳時(shí)間凝果。會(huì)刷新election timeout。
選舉中的具體投票過程睦尽。
成為candidate后立刻發(fā)信息給所有其他節(jié)點(diǎn),要求其他節(jié)點(diǎn)對(duì)自己投票型雳。
其他節(jié)點(diǎn)如果在election timeout周期內(nèi)沒有投過票則回應(yīng)贊成票并重置election timeout当凡。--確保一個(gè)選舉周期內(nèi)一個(gè)節(jié)點(diǎn)一票。
并遞增選舉周期election term纠俭。
PS:平票重選-時(shí)間是隨機(jī)沿量,已經(jīng)相當(dāng)程度避免了平票。
3.工作過程冤荆。leader根據(jù)heartbeat timeout為周期發(fā)送Append Entries給follower朴则,后者回復(fù),這就是刷新follower的election timeout心跳钓简。
這會(huì)持續(xù)直到有follower成為新的candidate.
工作過程中的具體寫入過程-Log Replication乌妒。
第一步leader像集群爭取寫入同意汹想,半數(shù)以上回復(fù)同意,此刻返回客戶端寫入成功并進(jìn)行第二步撤蚊。
第二步確認(rèn)寫入古掏,并同步給follower。
可以理解為二段式提交的分布式事務(wù)侦啸。當(dāng)然這很脆弱槽唾,但是好用。
使用上方介紹的惫馔浚活消息Append Entries傳遞消息庞萍。
4.腦裂處理:
這里的一些假設(shè)先解釋一下,要達(dá)成腦裂也就是出現(xiàn)兩個(gè)leader.必須是老的少數(shù)派被隔離忘闻,產(chǎn)生新的多數(shù)派的情況钝计,否則第二個(gè)leader根本選不出來。
當(dāng)然也不存在兩個(gè)leader擁有相同數(shù)量支持者的情況服赎。
少數(shù)派leader會(huì)寫入失敗葵蒂。
多數(shù)派leader可寫入成功。
網(wǎng)絡(luò)連通后重虑,老的少數(shù)派會(huì)看到election term更高的多數(shù)派并主動(dòng)成為follower践付,兩個(gè)leader都會(huì)放棄未commit的寫入,并根據(jù)election term的多數(shù)派開始同步數(shù)據(jù)缺厉。