1.選舉協議
下面是官網對老版本和新版本複製協議的簡潔說明:
pv0: 基於priority 和 optime 選舉新主,依賴clock synchronization。
有選舉權的節點,每一輪選舉最多投一票,在30s內,不能重複投票。
pv1:基於raft協議,每個成員都有 對候選主列表成員投贊成或者反對票,不是單方面否決選舉,沒有節點投反對票,且獲得贊成票數超過有權投票節點總數的1/2,則能成為primary。否則進入下一輪選舉。
因使用了raft協議,加快 back-to-back選主,減少整個選舉新主所需花費的總時間,相應的會增加writeconcern(w:1)rollback的可能性。
raft將時間分為多個term,term以連續的整數來標識,每個term以一次election開始,如果有server被選為leader,則該term的剩餘時間該server都是leader。
有些term裡,可能並沒有選出leader,這時候會開啟乙個新term來繼續選主,如上圖中的t3。
2.怎麼選舉?
選舉:假設x是乙個secondary,那麼x會定時檢測是否需要選舉自己成為primary。其檢測內容包括:
1) 是否集群中有其它節點認為自己是primary?
2) x節點自己是否已經是primary?
3) x節點自己是否有資格成為primary?
如果這三個問題中的任何乙個回答是否定的,那麼x節點就不會試圖把自己變成primary。(也就是說,只有當x節點是乙個能夠當primary 的secondary,並且其它節點都不是primary時,x才會發起選舉並選自己為primary)。
3.2之前(只支援pv0 協議):
影響選舉的因素:
1)優先順序(先看優先順序,級別越高,優先為主,priority=0:表示不參與選舉、不能成為主)
2)optime (如果優先順序都相同,則有最新的 optime 的成為主) 注意:集群中 prority 最大,但是optime 不是最新的,落後集群其他最新optime超過10s的prority 最大也不能選為主。
3)心跳 (副本級中的每個member預設都是每2秒ping 其他節點,如果超過 預設是10秒沒有回應,則標記節點不可達s_down)
網路**(network partition):
如果primary在少數的那一組,那麼次primary會變成secondary,多數節點(互相能通訊)的那組選舉新的主(primary)。
例外情況:如發生網路**,被**的一組選舉出乙個新的primary,老的primary還沒降級,這就出現了2個primary,這就是腦裂現象。此時2個primary都有寫入,直到網路恢復後,若老主再次成為primary,則腦裂過程中選舉出的新primary會回滾腦裂過程新寫入的資料;若老主成為secondary,則回滾老主腦裂過程新寫入的資料。
>= 3.2開始:
支援pv0 協議、pv1協議,預設是pv1協議。
影響選舉的因素:
1)replication election protocol(從3.2開始支援protocolversion: 1)
2)優先順序(先看優先順序,級別越高,優先為主,priority=0:表示不參與選舉、不能成為主)
3)optime (如果優先順序都相同,則有最新的 optime 的成為主)
4)心跳 (副本級中的每個member預設都是每2秒ping 其他節點,protocolversion:0如果超過 預設是10秒 或者 protocolversion:1時 electiontimeoutmillis 預設是10秒沒有回應,則標記節點不可達s_down,類似redis sentinel主觀下線)
下面status的節點有資格成為選舉者:
primary
secondary
recovering
arbiter
rollback
什麼時候發生選舉主?
1)初始化副本集
2)修改了節點的priority (config.members[0].priority = 3)
3)網路**(當前的primary和多數的節點不通,當前primary變成secondary多數節點的組重新選primary)
4)當前主上執行rs.stepdown()
5)secondary ping超過heartbeattimeoutsecs 後不可達,則標記primary s_down,發生選主
rollbacks during replica set failover:
回滾的限制:
超過300mb的rollbacks,則需要重新全同步。
影響回滾的配置引數:
settings.catchuptimeoutmillis:新選舉出來的的新主,sync from 集群中有更新的資料同步的時間,在整個過程新主是不可write。其他節點(其他secondary包括以後加入到集群的老主)都需要從新主同步,他們需要rollback 一些資料,都需要與新主資料對齊(保證資料一致性),增加此引數值,可以減少回滾的資料量,加速回滾;同時也會增加failover 的時間。
多次選舉:
並不是每次都是一次就可以選出新主,那麼pv0和pv1分別是怎麼多次選舉?
假設:有3個節點a、b、c,當集群都是secondary,此時發生選主時候,有資格成為主的a發起選主(發給集群其他節點,我要成為主),b、c收到a的選主請求後,結果b給a投了贊成票,c給a投了反對票,此時無主,要進入下一輪選主。若下一輪c發起我要成為主,由於b上次投出了贊成票,若是pv0,則30秒內不能再投票,此時c必須獲得a的贊成票後才能成為主。若是pv1,b很快就開啟下乙個term,進入投票,這樣對比,pv1 比 pv0 可能更快選出新主。也即back-to-back elections(緊鄰選舉/多次連續選舉)。
參考文獻:
一致性協議
節點在進行事務處理過程中保持原子性和一致性而設計的一種演算法。1.事務詢問。2.執行事務。3.各參與者向協調者反饋事務詢問的響應。理解 類似協調者組織各參與者對一次事務操作進行投票表態的過程。假如參與者全部反饋yes 1.傳送提交請求 2.事務提交 3.反饋事務提交結果 4.完成事務。假如任何乙個參...
一致性協議
在分布式系統中,每乙個機器節點雖然都能夠明確地知道自己在進行事務操作過程中的結果是成功或失敗,但卻無也直接獲取到其他分布式節點的操作結果。因此,當乙個事務操作需要跨越多個分布式節點的時候,為了保持事務處理的acid特性,就需要引人乙個稱為 協調者 的元件來統一排程所有分布式節點的執行邏輯,這些被排程...
一致性協議
在分布式系統中,當乙個事務操作需要跨越多個分布式節點的時候,為了保持事務acid的特徵,就需要引入乙個稱為 協調者 coordinator 的元件來統一排程所有分布式節點的執行邏輯,這些被排程的節點則稱為 參與者 participant 協調者負責參與者的行為,並最終決定這些參與者是否要把事務真正提...