chubby分佈式鎖服務概述

分佈式鎖與chubby

分佈式鎖,是控制分佈式系統之間同步訪問共享資源的一種方式。Chubby是一種面向松耦合的分佈式系統的鎖服務,通常用於爲一個由適度規模的大量小型計算機構成的的松耦合的分佈式系統提供高可用的分佈式鎖服務。鎖服務的目的是允許它的客戶端進程同步彼此的操作,並對當前所處環境的基本狀態信息達成一致。因此,Chubby的主要設計目標是爲一個由適度大規模的客戶端進程組成的分佈式場景提供高可用的鎖服務,以及易於理解的API接口定義。而值得一提的是,在Chubby的設計過程中,系統的吞吐量和存儲容量並不是首要考慮的因素。Chubby的客戶端接口設計非常類似於文件系統結構,不僅能夠對Chubby上的整個文件進行讀寫操作,還能夠添加對文件節點的鎖控制,並且能夠訂閱Chubby服務端發出的一系列文件變動的事件通知。

chubby概述

chubby在實現分佈式鎖的時候,主要考慮的是通過小文件讀寫服務的方式來進行Master選舉結果的發佈與訂閱,Chubby客戶端需要實時的感知到Master的變化情況,Chubby需要有能力將服務端的數據變化情況以時間通知的形式通知到所有訂閱的客戶端,利用租約機制來加入緩存機制從而達到數據一致性與較高的響應性能,通過訪問控制來保住服務端數據的安全性。

Chubby設計爲只提供面向粗粒度鎖機制的鎖服務,而放棄對細粒度鎖控制的支持。即可降低對服務器端的壓力,也可讓用戶自行實現一定的業務邏輯。其基本的結構如下;

在這裏插入圖片描述

chubby的架構設計如上所示。

chubby架構

推薦的部署模式是五臺部署,因爲數據一致性需要通過一致性的算法來進行確定,採用的Quorum機制(即需要獲得絕大多數的從節點同意纔算數據提交成功),所以奇數臺機器可以快速的有效的進行判讀數據是否提交成功。

在運行過程中,只有master節點才能夠進行數據的修改創建操作,操作完成的數據通過一致性算法同步到follower節點。客戶端在連接到服務端的過程中,如果連接的是master服務器則接着進行數據交互,如果連接的是從節點,則從節點會返回master服務器的信息,客戶端直連master節點,從而爲後面提交修改數據,並且可以獲取訂閱服務的修改與變更。如果在運行過程中,master節點崩潰,從節點會在租期到期之後進行重新選舉,重新選擇出主節點,從而客戶端會重新連接到新的master節點繼續運行。

啓動過程的流程

此時,啓動的過程中會啓動選舉,此時就統計哪個節點獲取最多的票數,從而完成對master的選舉,根據zookeeper的實現可知,在選舉過程中,會生成一個id從而檢查獲取的選票是哪個週期的選舉。在該流程中,ServerA發起了選舉投票,並且ServerB稍後也發起了選舉投票,此時就看哪個節點先接受到了超過半數的選票,在ServerB發起的選舉投票中,此時ServerA已經獲取了大部分的選票,並通知各個節點,主節點的信息。從而完成選舉。

在運行過程中,如果master節點突然崩潰,在超過一個租約的過程中(此時也可以根據心跳)來判斷是否master節點還存活,如果在一個租約中,沒有得到反饋則會發起選舉過程,從而重新選擇master。

數據與權限

在chubby中,數據的展示形式類似與常用的文件系統形式,例如;

/ls/foo/wombat/pouch

其中“ls”是所有Chubby節點所共有的前綴,代表着鎖服務(lock service)。第二個部分(foo)是Chubby集羣的名字,並可以由一個服務器集羣來組成該服務。名字的剩餘部分(/wombat/pouch),則是一個真正包含業務含義的節點名字,由Chubby服務器內部解析並定位到數據節點。同樣跟UNIX系統一樣,每個目錄都可以包含一系列的子文件和子目錄列表,而每個文件中則會包含文件內容。在chubby中節點分爲臨時節點和持久節點,臨時節點就是與會話保持一致的節點,當會話消失時該節點就會刪除,持久節點就會被一致保持在服務端,並會被集羣所保存。在節點上面包含一些元數據和控制信息,通過控制權限可限制客戶端訪問數據的權限,在實現鎖的過程中,chubby通過請求一個序號器,來訪問服務端,服務器接收到這樣的請求後,會首先檢測該序號器是否有效,以及檢查客戶端是否處於恰當的鎖模式;如果沒有檢查通過,那麼服務端就會拒絕該客戶端請求。在客戶端已經持有鎖的過程中,如果出現網絡突然斷線也會造成鎖的突然失效,故會添加一個鎖延時,如果在延時時間內該客戶端重新連接上,則該鎖可以繼續被該客戶端持有並使用,如果鎖延時到期之後該客戶端還未能重新連接,則會讓接下來的其他客戶端來持有該鎖。

緩存與故障恢復

爲了減少客戶端和服務端之間讀請求的數據傳輸量,Chubby客戶端會將數據及節點信息緩存在內存,從而達到較高的訪問效率,master上維護着每個客戶端的數據緩存情況,並通過向客戶端發送過期信息來維護客戶端數據的一致性。當文件或節點的元數據信息被修改時,Chubby首先會阻塞該修改操作,然後由master向所有可能緩存了該數據的客戶端發送緩存過期信號,等到Master在接收到所有相關的客戶端針對該過期信號的應答後(應答包括兩類,一種是客戶端明確要求更新緩存,另一類則是客戶端允許緩存租期過期),在繼續之前的修改操作。從而完成數據一致性的操作,該操作就是在租約的基礎上,在修改數據的情況下,主動通知可能緩存過期數據的客戶端,然後通過客戶端緩存數據失效,再收到客戶端的確認刪除過期數據之後再繼續數據的更新修改操作,從而保證了數據的強一致性。

在故障的回覆過程中,當在正常運行的時候,客戶端通過訪問master獲取租約並操作數據,此時客戶端會緩存租約,並保持會話,假如master節點突然崩潰,此時客戶端還會持有租約,但是在續約的過程中master不能響應客戶端的請求,故客戶端會清空本地的數據,然後再嘗試連接服務端,當服務端重新選舉完成之後,此時客戶端就會被告知master節點的位置,在連接到新的master節點之後,此時服務端檢查的租約信息與當前租約的週期不同,則重新向客戶端頒發一個新的租約週期,並將數據返回給客戶端緩存,在此過程中,新選舉出來的master需要進來一下步驟才能繼續提供服務;

  1. 新的master節點會重新生成一個週期id,以區分不同週期過程中的週期,用來標識是否處於同一個週期;
  2. master會處理數據請求但不會處理會話處理;
  3. master會根據保存的數據重新構建服務端數據的內存狀態,從而重新完成數據的加載;
  4. 此時處理客戶端的會話信息,並給每個會話發送一個故障恢復的信息,讓客戶端重新清空本地的緩存;
  5. 在客戶端響應故障恢復的信息的過程中,會一直等待所有客戶端完成,待完成之後再進行新的會話的處理;

大致的處理過程如上,在故障的處理過程中,數據的恢復主要就是通過數據的備份機制來進行新的master的信息的重建,該數據備份同步的過程也可以通過Quorum機制,只要大部分節點同意了該數據的更新,則將該數據提交到本地的備份數據中去,從而完成信息的一致性。

chubby與zookeeper

chubby當前還沒有開源的代碼,zookeeper主要就是根據該模式的開源實現,大家如有興趣可以去查看zookeeper的源碼,在zookeeper的實現過程中,並沒有採用paxos算法來保證數據的一致性,而是通過Quorum機制來保證修改數據的一致性,在其他的論文中也討論論文chubby通過paxos機制來實現數據備份的一致性大家有星球可自行查看。

總結

本文只是簡單的閱讀了一下chubby的論文內容,其基本的實現過程與zookeeper的實現思路高度相似,大家可通過查閱zookeeper的實現來更深刻的理解論文的基本思想,分佈式鎖與分佈式數據一致性一直都是比較複雜、需要根據場景進行取捨的內容,場景的側重點更偏向於解決一類問題,本文的內容比較淺並沒有深入的去探討與學習,例如在選舉的過程中,也會出現多種異常情況,例如選舉過程中突然出現網絡分區,並且如果出現了分區之後多個主之後的數據如果保持一致也需要額外的去保證與討論。由於本人才疏學淺,如有錯誤請批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章