用通俗易懂的方法解釋MongoDB的選舉機(jī)制
如果主節(jié)點(diǎn)宕機(jī)或故障了,其他的節(jié)點(diǎn)就會選出一個新的主節(jié)點(diǎn)。選舉的過程可以由任意的非主節(jié)點(diǎn)發(fā)起,然后根據(jù)優(yōu)先級和Bully算法選舉出新的主節(jié)點(diǎn)。在選舉出主節(jié)點(diǎn)之前,整個集群服務(wù)是只讀的,不能執(zhí)行寫入操作。
非仲裁節(jié)點(diǎn)都有一個優(yōu)先級的設(shè)置,范圍為0--100,越大的值越能優(yōu)先成為主節(jié)點(diǎn)。默認(rèn)情況下為1,如果值為0則不能成為主節(jié)點(diǎn)。
Bully算法是一種協(xié)調(diào)者(主節(jié)點(diǎn))競選算法,主要思想是集群的每個成員都可以聲明它是主節(jié)點(diǎn)并通知其他節(jié)點(diǎn)。其算法介紹如下:
當(dāng)任何一個進(jìn)程發(fā)現(xiàn)協(xié)調(diào)者不響應(yīng)請求時,他發(fā)起一次選舉,選舉過程如下:
(1).P進(jìn)程向所有編號比他大的進(jìn)程發(fā)送一個election消息;
(2).如果無人響應(yīng),則P獲勝,成為協(xié)調(diào)者
(3).如果編號比他大的進(jìn)程響應(yīng),則由響應(yīng)者接管選舉工作,P的工作完成。
任何一個時刻,一個進(jìn)程只能從編號比他小的進(jìn)程接受election消息,當(dāng)消息到達(dá)時,接受者發(fā)送一個OK消息給發(fā)送者,表明它在運(yùn)行,
接管工作。
最終除了一個進(jìn)程外,其他進(jìn)程都放棄,那個進(jìn)程就是新的協(xié)調(diào)者。
他將獲勝消息發(fā)送給其他所有進(jìn)程,通知他們新的協(xié)調(diào)者。
當(dāng)一個以前崩潰的進(jìn)程恢復(fù)過來了后,它將主持一場選舉。如果該進(jìn)程恰好是當(dāng)前運(yùn)行進(jìn)程中編號最大的進(jìn)程,它將獲勝,故此成為
欺負(fù)算法。
舉例來說,當(dāng)主節(jié)點(diǎn)故障或宕機(jī)之后,有資格成為主節(jié)點(diǎn)的從節(jié)點(diǎn)就會向其他節(jié)點(diǎn)發(fā)起一個選舉提議,基本的意思就是“我覺得我能成為主節(jié)點(diǎn),你們覺得呢?”,
而其他節(jié)點(diǎn)在收到這個選舉提議后會做如下判斷(三個條件):
(1).副本集中是否有其他節(jié)點(diǎn)已經(jīng)是主節(jié)點(diǎn)了?
(2).自己的數(shù)據(jù)是否比請求成為主節(jié)點(diǎn)的從節(jié)點(diǎn)上的數(shù)據(jù)更新呢?
(3).副本集中的其他節(jié)點(diǎn)的數(shù)據(jù)是否比請求成為主節(jié)點(diǎn)的從節(jié)點(diǎn)的數(shù)據(jù)更新呢?
如果這三個條件中只有有一個條件成立,那么都會認(rèn)為對方的提議不可行,于是將返回一個消息給請求節(jié)點(diǎn)說“我覺得你成為主節(jié)點(diǎn)不合適,你退出選舉吧!”,
請求節(jié)點(diǎn)只要收到其他任何一個節(jié)點(diǎn)返回不合適,都會立刻退出選舉,并將自己保持在從節(jié)點(diǎn)的角色;但是如果上面三個條件都是否定的,那么就會在返回包中回復(fù)說“我覺得你可以成為主節(jié)點(diǎn)”,也就是把票投給這個請求節(jié)點(diǎn),投票環(huán)節(jié)結(jié)束后就會進(jìn)入選舉的第二階段。獲得認(rèn)可的請求節(jié)點(diǎn)會向其他節(jié)點(diǎn)發(fā)送一個確認(rèn)的請求包,基本意思就是“我要宣布自己是主節(jié)點(diǎn)了,有人反對嗎?”,如果在這次確認(rèn)過程中其他節(jié)點(diǎn)都沒反對,那么請求節(jié)點(diǎn)就將自己升級為主節(jié)點(diǎn),所有節(jié)點(diǎn)在30秒內(nèi)不再進(jìn)行其他選舉投票決定,如果有節(jié)點(diǎn)在確認(rèn)環(huán)節(jié)反對請求節(jié)點(diǎn)做主節(jié)點(diǎn),那么請求節(jié)點(diǎn)在收到反對回復(fù)后,會保持自己的節(jié)點(diǎn)角色依然是從節(jié)點(diǎn),然后等待下一次選舉。
那優(yōu)先級是如何影響到選舉的呢?選舉機(jī)制會盡自己最大努力讓優(yōu)先級最高的節(jié)點(diǎn)成為主節(jié)點(diǎn),即使副本集中已經(jīng)選舉出了比較穩(wěn)定的,但優(yōu)先級比較低的主節(jié)點(diǎn)。
優(yōu)先級比較低的節(jié)點(diǎn)會短暫地作為主節(jié)點(diǎn)運(yùn)行一段時間,但不能一直作為主節(jié)點(diǎn)。也就是說如果優(yōu)先級比較高的節(jié)點(diǎn)在 Bully算法投票中沒有勝出,副本集運(yùn)行一段時間后會繼續(xù)發(fā)起選舉,直到優(yōu)先級最高的節(jié)點(diǎn)成為主節(jié)點(diǎn)為止。
由此可見,優(yōu)先級的設(shè)置參數(shù)在選舉過程中是很重要的,要么不設(shè)置,保持都是優(yōu)先級為1的公平狀態(tài),要么可以把性能比較好的幾臺Server設(shè)置的優(yōu)先級更高一些。