選舉(election)是分佈式系統實踐中常見的問題,經過打破節點間的對等關係,選得的leader(或叫master、coordinator)有助於實現事務原子性、提高決議效率。 多數派(quorum)的思路幫助咱們在網絡分化的狀況下達成決議一致性,在leader選舉的場景下幫助咱們選出惟一leader。租約(lease)在必定期限內給予節點特定權利,也能夠用於實現leader選舉。html
下面咱們就來學習分佈式系統理論中的選舉、多數派和租約。web
選舉(electioin)算法
一致性問題(consistency)是獨立的節點間如何達成決議的問題,選出你們都承認的leader本質上也是一致性問題,於是如何應對宕機恢復、網絡分化等在leader選舉中也須要考量。spring
Bully算法[1]是最多見的選舉算法,其要求每一個節點對應一個序號,序號最高的節點爲leader。leader宕機後次高序號的節點被重選爲leader,過程以下:緩存
(a). 節點4發現leader不可達,向序號比本身高的節點發起從新選舉,從新選舉消息中帶上本身的序號網絡
(b)(c). 節點五、6接收到重選信息後進行序號比較,發現自身的序號更大,向節點4返回OK消息並各自向更高序號節點發起從新選舉分佈式
(d). 節點5收到節點6的OK消息,而節點6通過超時時間後收不到更高序號節點的OK消息,則認爲本身是leader性能
(e). 節點6把本身成爲leader的信息廣播到全部節點學習
回顧《分佈式系統理論基礎 - 一致性、2PC和3PC》就能夠看到,Bully算法中有2PC的身影,都具備提議(propose)和收集反饋(vote)的過程。ui
在一致性算法Paxos、ZAB[2]、Raft[3]中,爲提高決議效率均有節點充當leader的角色。ZAB、Raft中描述了具體的leader選舉實現,與Bully算法相似ZAB中使用zxid標識節點,具備最大zxid的節點表示其所具有的事務(transaction)最新、被選爲leader。
多數派(quorum)
在網絡分化的場景下以上Bully算法會遇到一個問題,被分隔的節點都認爲本身具備最大的序號、將產生多個leader,這時候就須要引入多數派(quorum)[4]。多數派的思路在分佈式系統中很常見,其確保網絡分化狀況下決議惟一。
多數派的原理提及來很簡單,假如節點總數爲2f+1,則一項決議獲得多於 f 節點同意則得到經過。leader選舉中,網絡分化場景下只有具有多數派節點的部分纔可能選出leader,這避免了多leader的產生。
多數派的思路還被應用於副本(replica)管理,根據業務實際讀寫比例調整寫副本數Vw、讀副本數Vr,用以在可靠性和性能方面取得平衡[5]。
租約(lease)
選舉中很重要的一個問題,以上還沒有提到:怎麼判斷leader不可用、何時應該發起從新選舉?最早可能想到會經過心跳(heart beat)判別leader狀態是否正常,但在網絡擁塞或瞬斷的狀況下,這容易致使出現雙主。
租約(lease)是解決該問題的經常使用方法,其最初提出時用於解決分佈式緩存一致性問題[6],後面在分佈式鎖[7]等不少方面都有應用。
租約的原理一樣不復雜,中心思想是每次租約時長內只有一個節點得到租約、到期後必須從新頒發租約。假設咱們有租約頒發節點Z,節點0、1和2競選leader,租約過程以下:
(a). 節點0、一、2在Z上註冊本身,Z根據必定的規則(例如先到先得)頒發租約給節點,該租約同時對應一個有效時長;這裏假設節點0得到租約、成爲leader
(b). leader宕機時,只有租約到期(timeout)後才從新發起選舉,這裏節點1得到租約、成爲leader
租約機制確保了一個時刻最多隻有一個leader,避免只使用心跳機制產生雙主的問題。在實踐應用中,zookeeper、ectd可用於租約頒發。
小結
在分佈式系統理論和實踐中,常見leader、quorum和lease的身影。分佈式系統內不必定事事協商、事事民主,leader的存在有助於提高決議效率。
本文以leader選舉做爲例子引入和講述quorum、lease,固然quorum和lease是兩種思想,並不限於leader選舉應用。
最後提一個有趣的問題與你們思考,leader選舉的本質是一致性問題,Paxos、Raft和ZAB等解決一致性問題的協議和算法自己又須要或依賴於leader,怎麼理解這個看似「蛋生雞、雞生蛋」的問題?[8]
[1] Elections in a Distributed Computing System, Hector Garcia-Molina, 1982
[2] ZooKeeper’s atomic broadcast protocol: Theory and practice, Andre Medeiros, 2012
[3] In Search of an Understandable Consensus Algorithm, Diego Ongaro and John Ousterhout, 2013
[4] A quorum-based commit protocol, Dale Skeen, 1982
[5] Weighted Voting for Replicated Data, David K. Gifford, 1979
[6] Leases: An Efficient Fault-Tolerant Mechanism for Distributed File Cache Consistency, Cary G. Gray and David R. Cheriton, 1989
[7] The Chubby lock service for loosely-coupled distributed systems, Mike Burrows, 2006