NFS4檔案鎖機制探秘

2021-09-06 03:23:17 字數 2942 閱讀 5251

nfs4實現「租賃鎖」。每個鎖擁有一樣的「租賃期」。客戶端的讀寫操作將重新整理「租賃期」。租賃期到期後,鎖將被伺服器釋放。nfs4通過下述「模型」實現對鎖的管理:

1) 清晰地劃分客戶端和伺服器;

2) 可靠的鎖的一致性檢測機制

3) 簡單可靠的鎖狀態恢復機制

client -- 客戶端是訪問nfs伺服器的資源的實體。客戶端是包含直接訪問nfs伺服器的乙個應用程式。客戶端可以是傳統的作業系統遠端檔案系統服務的應用程式。客戶端負責維護乙個或多個使用者應用程式的nfs鎖。客戶端崩潰或失敗時,它負責管理重新獲取鎖。請注意,多個客戶端可以共享相同的傳輸;多個客戶端可能存在於同乙個網路節點。

clientid  --- 64位的id識別符號。客戶端經過認證後,由伺服器分配的整型數,用於後續通訊中標識客戶端。

server  --- 負責協調客戶端訪問檔案系統的實體。

stateid  --- 128位變數用於標識特定檔案狀態(開啟和鎖定)。由伺服器分配,根據stateid可找到相應的狀態資訊表。

1) 客戶端認證(申請clientid) 

客戶端啟動 --> 傳送nfs_client_id4(verifier和id串) ,setclientid

--> 伺服器分配clientid --> 客戶端傳送clientid 給伺服器端,二次確認setclientid_confirm --> 認證成功(建立server記錄)

2) 狀態建立(申請stateid) --> 帶狀態的檔案操作 --> 撤銷狀態

客戶端用clientid為特定lock_owner發起鎖申請 --> 伺服器鎖定檔案,並發回stateid (建立狀態表)--> 客戶端用stateid進行檔案讀寫--> 撤銷狀態,即撤銷stateid

1) 如何識別客戶端?不同客戶端?客戶端重啟?

2) 如何識別伺服器?伺服器是否重啟?

3) 如何維護鎖狀態?正常流程?重啟恢復?

4) 如何保證「至多一次」的鎖狀態更新?

5) 狀態同步?客戶端失敗,伺服器成功下的狀態同步?

1) 如何識別客戶端?不同客戶端?客戶端重啟?

每個客戶端均必須經過伺服器端的認證,並獲取伺服器端分配的唯一識別符號clientid。在後續操作中,nfs系統採用clientid表示該客戶端。

客戶端發起認證時,需提供兩個資訊,verifier和id,verifier用於表示該客戶端是否是重啟客戶端(重啟客戶端將撤銷所有此客戶端的鎖狀態);id是該客戶端使用者標識自己身份的唯一字串。id串一般由如下幾部分組成:客戶端位址(ip+port),伺服器位址(ip+port), mac等機器唯一的資訊。socket的通訊五元組可作為同乙個server下的唯一標識串,加上mac等資訊是為了防止不同客戶端的ip重用。

在上述id生成規則下,不同客戶端將生成唯一的標識串。客戶端重啟時,id不變,僅改變verifier。為了實現重啟時id不變,每個客戶端配乙個監控程序,監控程序生成id和verifier,並啟動客戶端,重啟時改變verifier。

2) 如何識別伺服器?伺服器是否重啟?

伺服器的標識放在stateid中,由於伺服器的唯一性,可用程序id來標識伺服器。伺服器重啟後,程序id改變,相應的stateid中server標識也將改變,導致stateid失效。同時伺服器重啟將導致所有鎖資訊丟失(無資訊持久化),也導致stateid失效。

3) 如何維護鎖狀態?正常流程?重啟恢復?

正常流程:

針對特定檔案,lock_owner可申請相應的鎖(狀態申請),得到伺服器分配的stateid表示鎖請求成功。在後續操作中,該owner均使用stateid進行檔案操作。

異常處理流程:

a) 客戶端失敗:死鎖,網路不可達,無法正常工作

nfs 4採用的租賃鎖,有特定的租賃期限。若客戶端失敗,伺服器不做任何特殊處理(無法區分客戶端正常與否),等待租賃鎖到期,鎖自然釋放。

b) 客戶端重啟

客戶端重啟,伺服器根據客戶端發過來的verifier可知客戶端重啟,伺服器主動釋放與該客戶端id相關的所有鎖。

c) 伺服器失敗 -- 無法處理,只能重啟伺服器

d) 伺服器重啟

伺服器重啟將導致所有的客戶端鎖狀態失效,客戶端進行檔案操作時將知道lock狀態丟失。當lock狀態丟失,client應該重建鎖狀態。

server重啟後,lease period期間內為客戶端重建鎖狀態時期。在此期間,server可以阻塞所有的讀、寫、lock等請求,除非server能夠確保不發生鎖衝突(比如持久化鎖狀態於磁碟)!

e) 網路不可達

網路不可達,基本等同於客戶端失敗,伺服器等待租賃鎖失效。但當網路不可達和伺服器重啟同時出現時,可能出現兩種難以處理的情形,需要持久化儲存鎖狀態方能解決,略去。

4) 如何保證「至多一次」的鎖狀態更新?

在和檔案鎖相關的操作中(加鎖,公升級,降級,解鎖),多次操作是不允許的。這就要求相應的操作具有「至多一次(at-most-once)」語義。為實現「至多一次」的鎖狀態更新,nfs引入「序列化機制」,以應對網路重傳和重排序。具體實現如下:每個鎖狀態更新請求均攜帶序列號。該序列號是乙個連續遞增整數,由客戶端維護,不同lock_owners擁有不同的序列號,初始值為0。伺服器在狀態表中快取最後收到的序列號(last sequence number (l))和應答(response)。只有當下次鎖狀態更新請求的序列號為l+1時,該請求才被視為有效請求!

注意:a) 客戶端必須保證不多於乙個的鎖狀態更新請求!(同一鎖狀態更新請求可多次傳送,序列號相同)

b) 當伺服器收到相同的鎖狀態更新請求(序列號相同)時,快取的應答將傳送給客戶端,而無相應鎖操作被執行。

5) 狀態同步?客戶端失敗,伺服器成功下的狀態同步?

當鎖狀態更新請求失敗後,如超時,伺服器的鎖狀態可能已經改變。為了保證客戶端的鎖狀態的一致性,客戶端應該重發「失敗」的鎖狀態更新請求,同步狀態,即客戶端必須快取失敗的鎖狀態更新請求,並在下次提交鎖狀態更新請求前,重發該lock_owner快取的鎖狀態更新請求!

「二次確認機制」也能確保狀態的一致性,但成本高,重發機制,只有在失敗後才會重新傳送,成本低(鎖狀態更新請求遠比客戶端認證頻繁!)。

4 檔案操作

學習目標 1 了解linux的目錄結構 2 掌握linux的目錄操作命令 學習過程 一 linux目錄的基本結構 根目錄,系統中所有的目錄都是從根目錄開始。bin 存放常用命令。boot 引導核心的程式目錄。dev 外部裝置名。etc etcetera 系統管理所要的配置檔案和子目錄。home 存放...

4 檔案操作

對檔案操作 對檔案操作就是對檔案的控制代碼的操作,通過open函式得到檔案的控制代碼。一 r,w,a,x,模式 r 只有讀操作,檔案必須存在。讀的時候預設游標在最開始讀,沒有寫操作,encoding在進行解碼操作。w 無法讀取檔案,只是寫操作,檔案存在覆蓋寫,檔案不存在的話,建立檔案再寫。encod...

4 檔案基本管理

命令 說明touch 檔案路徑 如果是要使用空格,可以使用雙引號包裹路徑,不能使用表示根路徑的 符號。第一次touch乙個檔案如果檔案不存在會自動建立,如果已經建立,會修改該檔案的最後修改時間 命令說明 cat用來檢視內容較少的檔案,選項加上 n 可以為內容新增行號。不太適合長檔案。tac反向檢視檔...