分佈式概念-去中心化副本控制實現
- 2020 年 2 月 26 日
- 筆記

去中心化的副本控制區別於前面文章介紹的中心化副本控制在於,其所有節點都是對等的,不存在中心化節點,所有節點之前互相協商,以達到最終一致。

前面介紹過中心化節點控制最大的問題在於,中心節點存在單點風險,造成停服風險。去中心化節點則存在較長時間的數據一致性窗口,所以在需要實現強一致性場景,或是流程複雜場景下實現起來更為複雜,性能和效率也比較低。
以這次疫情來說,我們在集權控制下可以很好的統一調配資源,進行控制。在民主機制下,節點之前要求平等,協商,所以效率會低。這也是我不太看好區塊鏈場景落地的一個主要原因,公平有了,效率呢?
去中心化節點為了可以達到協商的效果,可以採用租約機制,也就是我們熟知的lease機制。
lease機制的定義:
由頒發者授予的一種有效期內的承諾,頒發者一旦發出lease,無論接收方是否接收到,也無論接收方處於什麼狀態,只要lease不過期,頒發者則信守承諾保證數據不做修改。而一旦lease過期,接收方則不能繼續使用頒發者發出的承諾。
在一些分佈式存儲服務設計時,我們一般會有一個中心服務對整個集群提供元數據存儲。系統中其他節點通過訪問中心服務器獲取元數據,這樣這個元數據服務就會變成整個系統的性能瓶頸點。
針對這種問題,我們可以將元數據緩存一段時間元數據,這樣所有節點就不對中心節點強依賴,就不存在前面說到的中心節點壓力的問題了。
當然你很容易想到,這種方案存在的一個問題就是中心節點和其他節點存在數據不一致的情況,比如中心節點數據進行了變更,其他節點在緩存未過期時是很難更新到新數據的。
通過引入lease機制,我們可以設計中心服務器在向各個節點進行數據下發過程時,同時下發一個lease。每個lease都有一定的時效期,一般是個明確的時間點,比如下午3點鐘。一旦時間達到,則判定超時,lease過期。這樣這個節點數據過期就不會和節點收到lease的時間有關了。
假如中心節點和所有節點時鐘同步,lease表述的意義是:
在lease有效期內,中心服務器保證不會對元數據進行修改。
因此節點收到數據,且在lease生效期內,元數據緩存在這個節點之上,當lease超時,節點將本地cache的元數據清除。中心服務對元數據的修改,也是阻塞到某個key租約到期之後才進行數據的修改,否則會進入寫阻塞狀態。
中心服務器在向節點回傳數據同時,授予lease,同時保證在lease有效期內,中心服務不進行響應數據修改,從而達到各個節點緩存和中心服務器數據一致性的效果。保證了節點在lease有效期內,緩存數據的正確性。一旦lease過期,節點緩存的數據即無效,而不會造成提供錯誤數據的問題。
針對於中心節點,可以控制在數據獲取請求時,不下發lease,提供讀能力,提升性能。
通過lease有效期承諾,可以很好的解決網絡異常問題,接收者無需向頒發者進行網絡ack,不影響lease的頒發。
同時lease有效期是個確定的時間點,和頒發時間無關,這樣一個lease可以重複的發到多個接收者手裡。一旦lease頒發成功,lease後續機制不再依賴於網絡通信。
同時lease機制可以很好的解決節點宕機問題,如果頒發者宕機,則其無法改變之前的承諾,不影響lease的正確性。在頒發者恢復之後,頒發者獲取了之前的lease信息,可以進行遵守lease承諾。如果頒發者無法恢復lease信息,只能等待最長的lease失效,一旦全部節點上的lease失效,則會有獲取lease請求打來,而不破壞lease機制。
同時整個系統的穩定性不再依賴於中心服務的穩定性。頒發者可以持久化自己頒發過lease的信息,從而在宕機恢復之後使得有效期lease繼續有效。
目前看lease機制強依賴於節點時鐘,要求頒發者和接收者的時間一致。如果頒發者和接收者時間不一致,會存在lease失效時間差異。對於時鐘不同步問題,實踐中一般是將頒發的lease時效增大,只需要大過時鐘誤差就可以避免對lease有效性的影響。
我們知道在分佈式副本機制中,腦裂是很容易出現的一種情況。一般處理方式是在系統中容忍「雙主」錯誤,就是對於節點狀態判斷需要全體協商後的結果,而不是一家之言。第二種方案是引入lease機制。
實現邏輯大概是這樣:
中心節點向其他節點發送lease,某個節點持有lease,則認為此節點可以提供服務。持有lease的節點周期性向中心節點發送心跳報告狀態,中心節點對心跳進行確認。節點們在lease有效期內正常工作。
中心節點可以給節點中的primary節點頒發一個特殊的lease,當前一個primary lease到期後,可以將primary lease頒發給其他節點。而不會出現「雙主」問題。
但是一個中心節點進行lease頒發,其實也存在單點可用問題,一般我們採用多個中心節點互備方式形成一個小的中心節點集群,以集群的可用性提供對外頒發lease的能力。