用通俗易懂的方法解釋MongoDB的選舉機制

chenfeng發表於2017-10-05
如果主節點當機或故障了,其他的節點就會選出一個新的主節點。選舉的過程可以由任意的非主節點發起,然後根據優先順序和Bully演算法選舉出新的主節點。在選舉出主節點之前,整個叢集服務是隻讀的,不能執行寫入操作。
非仲裁節點都有一個優先順序的設定,範圍為0--100,越大的值越能優先成為主節點。預設情況下為1,如果值為0則不能成為主節點。
Bully演算法是一種協調者(主節點)競選演算法,主要思想是叢集的每個成員都可以宣告它是主節點並通知其他節點。其演算法介紹如下:

當任何一個程式發現協調者不響應請求時,他發起一次選舉,選舉過程如下:
(1).P程式向所有編號比他大的程式傳送一個election訊息;
(2).如果無人響應,則P獲勝,成為協調者
(3).如果編號比他大的程式響應,則由響應者接管選舉工作,P的工作完成。
   任何一個時刻,一個程式只能從編號比他小的程式接受election訊息,當訊息到達時,接受者傳送一個OK訊息給傳送者,表明它在執行,
接管工作。
最終除了一個程式外,其他程式都放棄,那個程式就是新的協調者。
    他將獲勝訊息傳送給其他所有程式,通知他們新的協調者。
    當一個以前崩潰的程式恢復過來了後,它將主持一場選舉。如果該程式恰好是當前執行程式中編號最大的程式,它將獲勝,故此成為
欺負演算法。


舉例來說,當主節點故障或當機之後,有資格成為主節點的從節點就會向其他節點發起一個選舉提議,基本的意思就是“我覺得我能成為主節點,你們覺得呢?”,
而其他節點在收到這個選舉提議後會做如下判斷(三個條件):
(1).副本集中是否有其他節點已經是主節點了?
(2).自己的資料是否比請求成為主節點的從節點上的資料更新呢?
(3).副本集中的其他節點的資料是否比請求成為主節點的從節點的資料更新呢?
如果這三個條件中只有有一個條件成立,那麼都會認為對方的提議不可行,於是將返回一個訊息給請求節點說“我覺得你成為主節點不合適,你退出選舉吧!”,
請求節點只要收到其他任何一個節點返回不合適,都會立刻退出選舉,並將自己保持在從節點的角色;但是如果上面三個條件都是否定的,那麼就會在返回包中回覆說“我覺得你可以成為主節點”,也就是把票投給這個請求節點,投票環節結束後就會進入選舉的第二階段。獲得認可的請求節點會向其他節點傳送一個確認的請求包,基本意思就是“我要宣佈自己是主節點了,有人反對嗎?”,如果在這次確認過程中其他節點都沒反對,那麼請求節點就將自己升級為主節點,所有節點在30秒內不再進行其他選舉投票決定,如果有節點在確認環節反對請求節點做主節點,那麼請求節點在收到反對回覆後,會保持自己的節點角色依然是從節點,然後等待下一次選舉。
那優先順序是如何影響到選舉的呢?選舉機制會盡自己最大努力讓優先順序最高的節點成為主節點,即使副本集中已經選舉出了比較穩定的,但優先順序比較低的主節點。
優先順序比較低的節點會短暫地作為主節點執行一段時間,但不能一直作為主節點。也就是說如果優先順序比較高的節點在 Bully演算法投票中沒有勝出,副本集執行一段時間後會繼續發起選舉,直到優先順序最高的節點成為主節點為止。

由此可見,優先順序的設定引數在選舉過程中是很重要的,要麼不設定,保持都是優先順序為1的公平狀態,要麼可以把效能比較好的幾臺Server設定的優先順序更高一些。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2145712/,如需轉載,請註明出處,否則將追究法律責任。

相關文章