nacos源碼分析——raft如何選舉

在上一篇文章http://www.reibang.com/p/b0cdaa64688e說到了如果follower長時間收不到leader的心跳酌毡,就會發(fā)起leader選舉循帐。具體的過程是怎么樣的呢碧查?

發(fā)起請求:
image.png

public static final String API_VOTE = UtilsAndCommons.NACOS_NAMING_CONTEXT + "/raft/vote";

其他節(jié)點收到選舉請求
image.png

收到請求的處理過程是:

如果對方的term比自己小,voteFor為自己版确,然后返回結果梢灭。意思是我自己更適合做leader,這一票我投給自己幕侠。
如果對方的term比自己大,設置voteFor為對方碍彭,然后返回結果晤硕,意思是就按你說的做,這一票就投給你了庇忌。
image.png

發(fā)起投票的節(jié)點收集到回應之后就開始處理了:


image.png
image.png
把所有的節(jié)點投票信息放到TreeBag舞箍,這個可以看成是個按value排序的有序map。排第一的就是得票最多的節(jié)點

public int majorityCount() {
return peers.size() / 2 + 1;
}
超過半數(shù)皆疹,表示選舉新的leader成功疏橄。

我們發(fā)現(xiàn)這的leader成功,并不會通知其他節(jié)點修改leader略就。最后是怎么變成一致的呢捎迫?

假如一個節(jié)點選舉自己成功,他會認為自己是leader表牢,就會定時發(fā)送心跳給其他的節(jié)點窄绒,這個時候其他節(jié)點的leader還是舊的,收到心跳會報錯的崔兴。
image.png
所以其他節(jié)點都經(jīng)歷一次選舉:
image.png
因為已經(jīng)選舉成功過彰导,所以local.voteFor都有值,為上一次選舉成功的節(jié)點敲茄,所以其他節(jié)點選舉的結果都會統(tǒng)一了位谋。

看起來是不是很簡單啊。堰燎。掏父。

但是這里有個關鍵邏輯就是term的比較,這個是決定了所有的邏輯的爽待。

每次發(fā)布新的內容的時候损同,term都會增加。而且follower的term也會增加鸟款,最終會同步為leader的term膏燃。


image.png

舉個例子

假如5個節(jié)點
節(jié)點1的term為4 為leader
節(jié)點2的term為4
節(jié)點3的term為4
節(jié)點4的term為3
節(jié)點5的term為3
節(jié)點1這個leader掛的情況下,

假如節(jié)點2開始選舉何什,它的term是最高的组哩,選舉自己是可以成功的。

同樣,節(jié)點3也是可以選舉成功的伶贰。這個就看節(jié)點2蛛砰,3誰先開始選舉了,誰先黍衙,誰就是新的leader泥畅。

假如節(jié)點2和節(jié)點3同時選舉呢,節(jié)點2得到自己和節(jié)點4的票琅翻,節(jié)點3得到自己和節(jié)點5的票位仁。這個時候兩邊都不能成功。所以等待下一輪方椎,因為下一次開始的時間是隨機的聂抢,所以同時的概率很小。誰先棠众,誰就是新的leader了琳疏。

假如所有的節(jié)點的term相同,其實是選舉不出leader的闸拿,因為都只有自己一票空盼。這個是怎么解決的呢?

每次發(fā)起投票的時候都會給自己的term加1 胸墙,是這里制造term的差異的:


image.png

收到投票請求的時候我注,如果對方的term比自己的大,為什么要放棄這一輪的發(fā)起選舉
        local.resetLeaderDue();
image.png

這個是為了減少選舉沖突迟隅。對方比自己的term大1但骨,自己不放棄這一輪選舉的話,自己發(fā)起選舉智袭,term會加1奔缠,其實term就一樣大了,可能的結果就是兩個都選舉不成功吼野。


為什么每次發(fā)布新的內容校哎,term都會加100呢

local.term.addAndGet(PUBLISH_TERM_INCREASE_COUNT);
public static final int PUBLISH_TERM_INCREASE_COUNT = 100;
上面也看到了,每次發(fā)起投票都term都會加1瞳步,如果發(fā)布內容也是加一的話闷哆,內容落后的節(jié)點第二次發(fā)起投票的時候就是加2了,term居然高過內容最新的節(jié)點单起。這個時候就不對了抱怔。
100其實就是允許重新發(fā)起投票的次數(shù),這個數(shù)字越大越安全嘀倒,100這個數(shù)字已經(jīng)足夠大了屈留,100輪投票都產(chǎn)生不了leader局冰,這個概率可以忽略不計了。


問題1

假如一個節(jié)點只是和leader不通灌危,和其他節(jié)點都是通的康二。剛開始的時候,他的term其實是最新的勇蝙,所以它是可以成功選自己為leader的沫勿。
這個時候看起來就會有兩個leader,其他節(jié)點認為舊的leader是ok的味混,所以不會重新投票選舉藕帜。但是其他節(jié)點會受到這兩個leader的心跳,只是對于第二個心跳會報錯而已惜傲。。這種情況確實有點蛋疼贝攒,不過理論上很少發(fā)生這種情況的盗誊。


問題2

選舉發(fā)生沖突,都失敗的時候隘弊,等待下一輪選舉的時間是15~20秒哈踱,感覺這個時間等得太久了。
而且隨機的區(qū)間就是0-5000 ms梨熙,這個命中比較接近的數(shù)字還不小开镣,搞不好下一輪還沖突。那就一共等30多秒了咽扇。邪财。
public void resetLeaderDue() {
leaderDueMs = GlobalExecutor.LEADER_TIMEOUT_MS + RandomUtils.nextLong(0, GlobalExecutor.RAMDOM_MS);
}

public static final long LEADER_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(15L);

public static final long RAMDOM_MS = TimeUnit.SECONDS.toMillis(5L);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市质欲,隨后出現(xiàn)的幾起案子树埠,更是在濱河造成了極大的恐慌,老刑警劉巖嘶伟,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怎憋,死亡現(xiàn)場離奇詭異,居然都是意外死亡九昧,警方通過查閱死者的電腦和手機税稼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門肺魁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事盗舰。” “怎么了箱歧?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵炎功,是天一觀的道長凤薛。 經(jīng)常有香客問我,道長诞仓,這世上最難降的妖魔是什么缤苫? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮墅拭,結果婚禮上活玲,老公的妹妹穿的比我還像新娘。我一直安慰自己谍婉,他們只是感情好舒憾,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穗熬,像睡著了一般镀迂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唤蔗,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天探遵,我揣著相機與錄音,去河邊找鬼妓柜。 笑死箱季,一個胖子當著我的面吹牛,可吹牛的內容都是我干的棍掐。 我是一名探鬼主播藏雏,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼作煌!你這毒婦竟也來了掘殴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粟誓,失蹤者是張志新(化名)和其女友劉穎杯巨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努酸,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡服爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了获诈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仍源。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舔涎,靈堂內的尸體忽然破棺而出笼踩,到底是詐尸還是另有隱情,我是刑警寧澤亡嫌,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布嚎于,位于F島的核電站掘而,受9級特大地震影響,放射性物質發(fā)生泄漏于购。R本人自食惡果不足惜袍睡,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肋僧。 院中可真熱鬧斑胜,春花似錦、人聲如沸嫌吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辫诅。三九已至凭戴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炕矮,已是汗流浹背簇宽。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吧享,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓譬嚣,卻偏偏與公主長得像钢颂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拜银,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容