Raft理論是分布式數據一致性算法难咕,為了便于理解Raft算法分成了4個部分:
-Leader選舉
-日志復制
-成員變更
-日志壓縮
此系列文章先來分析Raft Leader選舉的原理及實現揣云,在后續(xù)《分布式數據復制》的系列文章中,我們再回過頭來實現Raft算法的其他功能晃痴。
Leader選舉:
選舉原則:典型的投票選舉算法(少數服從多數),也就是說,在一定周期內獲得投票最多的節(jié)點成為主節(jié)點咙崎。
節(jié)點角色:
Leader仗处,主節(jié)點眯勾,一個任值周期內只有一個主節(jié)點枣宫。
Candidate,候選節(jié)點吃环,集群中沒有Leader時發(fā)起投票也颤,進行選舉。
Follower郁轻,跟隨節(jié)點翅娶,即主節(jié)點的從節(jié)點。
消息類型:
Vote好唯,投票消息
Heartbeat故觅,心跳消息,Follower接收Leader的心跳消息渠啊,重置選舉計時器输吏。
選舉過程:
1,節(jié)點剛啟動時替蛉,默認是Follower狀態(tài)贯溅。
2,啟動之后躲查,開啟選舉超時定時器它浅,節(jié)點切換到Candidate狀態(tài),發(fā)起選舉請求镣煮。
3姐霍,當Candidate狀態(tài)的節(jié)點,接收到超過半數的投票典唇,則成為主節(jié)點镊折,切換到Leader狀態(tài)。每一輪選舉介衔,每個節(jié)點只能投一次票恨胚。
4,Leader狀態(tài)的節(jié)點向其他節(jié)點發(fā)送心跳消息炎咖,其他Candidate狀態(tài)的節(jié)點切換回Follower狀態(tài)赃泡,并重置選舉超時定時器。
5乘盼,Leader節(jié)點收到更高任期號的消息升熊,切換到Follower狀態(tài)。這種情況主要發(fā)生在有網絡分區(qū)時绸栅。
假設有5個節(jié)點级野,選舉過程如下圖:
1,初始5個節(jié)點為Follower狀態(tài)阴幌,任值周期為1(Term=1)勺阐。
2卷中,節(jié)點切換為Candidate狀態(tài),開啟選舉定時器渊抽,任值周期加1(Term=2)蟆豫。先為自己投票,然后向其他節(jié)點請求投票懒闷。
3十减,得票數超過節(jié)點半數的節(jié)點,切換為Leader狀態(tài)愤估,并向其他4個節(jié)點發(fā)送心跳消息帮辟。其他4個節(jié)點切換為Follower狀態(tài)。
網絡分區(qū):
下面看看玩焰,當發(fā)生網絡分區(qū)時由驹,節(jié)點狀態(tài)如何切換。如下圖:
網絡發(fā)生A昔园、B兩個分區(qū)蔓榄,A分區(qū)的3個節(jié)點繼續(xù)提供服務。B分區(qū)的2個節(jié)點由于沒有收到Leader節(jié)點的心跳消息默刚,在選舉定時器超時后甥郑,切換到Candidate狀態(tài),開始進行投票選舉荤西,任值周期加1(Term=3)澜搅。
當網絡恢復后,A分區(qū)節(jié)點的任值周期(Term=2)比B分區(qū)節(jié)點的任值周期(Term=3)小邪锌,因此A分區(qū)的節(jié)點切換成Follower狀態(tài)勉躺,5個節(jié)點開始進行投票選舉,最終選舉出Leader節(jié)點秃流。
問題:如何避免網絡恢復后赂蕴,不發(fā)生切主?
如上圖舶胀,B分區(qū)的2個節(jié)點由于永遠得不到超過半數的投票,所以任值周期不斷累加碧注。當網絡恢復后嚣伐,原來的Leader由于任值周期小,切換為Follower狀態(tài)萍丐,集群重新選主轩端。
如何避免重新選主,將投票階段分拆成兩階段逝变,即預投票階段和投票階段基茵。
預投票階段:任值周期不累加奋构,選出得票數過半的節(jié)點。
投票階段:由在預投票階段選出的節(jié)點發(fā)起投票請求拱层,任值周期累加弥臼,最終選出主節(jié)點。
這樣根灯,B分區(qū)2個節(jié)點的任值周期就會小于等于原Leader的任值周期径缅,當網絡恢復后就不會重新選主。
開源軟件應用:Go語言編寫的etcd組件烙肺,是一個高可用纳猪,強一致的數據存儲倉庫,就是實現了Raft算法的選主和數據一致性桃笙,Kubernetes的選主就是使用的etcd組件氏堤。
總結:
Raft的選舉算法,節(jié)點有三個角色:Leader搏明、Candidate鼠锈、Follower。有兩種通信消息:投票消息熏瞄,心跳消息脚祟。由選舉定時器開啟任值周期,在任值周期內得票過半的節(jié)點成為主節(jié)點强饮。
優(yōu)點是算法復雜度低由桌,易于實現,主節(jié)點穩(wěn)定邮丰,不會輕易發(fā)生切主行您。缺點是集群內節(jié)點需要全通信,通信量比較大剪廉。
Raft算法的Leader選舉原理講解完了娃循,下一篇文章《分布式選舉-Raft算法-2 Leader選舉 代碼實現》我們來具體看看如何用代碼實現分布式環(huán)境下的Raft Leader選舉。