NFS4文件鎖機制探秘

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

簡介

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

NFS?4?為支持文件鎖需要解決的問題:

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緩存的鎖狀態更新請求!

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


參考文獻:RFC 3530

轉載于:https://my.oschina.net/linjiezang/blog/1845157

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Stay Hungry Stay Foolish——網絡學習平臺分享

從1月24號回家也有一陣子了,今天已經是31號,這一個周的中心思想就是一個字,玩。 學生一但遠離學校,就會碰到許多學習的阻力,有來自外界的,家里有活要干,有親戚要訪,有同學邀約&…

linux_check

linux_check echo "********CPU****************" echo 總核數 物理CPU個數 X 每顆物理CPU的核數 echo " 總邏輯CPU數 物理CPU個數 X 每顆物理CPU的核數 X 超線程數"echo 查看物理CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| un…

Unity3D學習筆記之四完善Prefab并添加First Person Controller

好久沒學東西并用博客記錄了,這個年過的很懶散,慢慢臨近開學了,也要提前適應一下,寫寫東西,這樣開學才能更好的進入狀態呀~~本次筆記中,我們將來雕琢一個更加完善的Prefab&#xff0…

高精度(壓位+判負數+加減乘+讀寫)

本算法目前屬于還處于測試狀態,歡迎Hack! struct gj{bool fu; //是否是負數int tt,mod; //高精的長度int s[40005]; //壓位用的數組inline gj(){ //整體初始化fu0; tt0; mod1e9;memset(s,0,sizeof(s));}inline gj read(){ register char ch; //高精度讀…

Hadoop從安裝Linux到搭建集群環境

簡介與環境準備  hadoop的核心是分布式文件系統HDFS以及批處理計算MapReduce。近年,隨著大數據、云計算、物聯網的興起,也極大的吸引了我的興趣,看了網上很多文章,感覺還是云里霧里,很多不必要的配置都在入門教程出現…

git推送本地分支到遠程分支

場景 有時候我們開發需要開一個分支,這樣可以有效的并行開發. 開分支有兩種方式: 一種是在遠程開好分支,本地直接拉下來;一種是本地開好分支,推送到遠程.遠程先開好分支然后拉到本地 git checkout -b feature-branch origin/feature-branch //檢出遠程的feature-branch分支到…

delphi 函數內創建對象 釋放_JavaScript 的函數底層運行機制

▲ 點擊上方藍字關注我 ▲文 / 景朝霞來源公號 / 朝霞的光影筆記ID / zhaoxiajingjing圖 / 自己畫目錄0 / 題(1)第一題(2)第二題1 / 引用數據類型:object2 / 引用數據類型:function(1)第二題,簡圖(2)創建函數(3)執行函數(4)閉包3 / 練習題(1)…

Unity3D學習筆記之五為Prefab添加材質

本次筆記中,我們將利用unity來創建并使用材質,把材質添加到我們的Prefab中去。這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》,下載鏈接附在第二篇學習筆記中。繼續上次筆記中所記錄的東西&a…

分布式版本控制系統之Git

Git Git 是目前世界上最先進的分布式版本控制系統(沒有之一)作用 源代碼管理為什么要進行源代碼管理? 方便多人協同開發方便版本控制Git的誕生 作者是 Linux 之父:Linus Benedict Torvalds當初開發 Git 僅僅是為了輔助 Linux 內核的開發&…

oo第三次博客-JML規格

這三周的作業主要是圍繞以JML來約束代碼開發,以確保程序的正確性與魯棒性。 Part 1:三次作業的實現與bug 第一次作業沒有任何算法和數據結構上的難度,對于Path和PathContainer的各個方法的實現按照給出的規格復讀即可。唯一的難點&#xff08…

Kinect開發筆記之一Kinect詳細介紹

畢業設計的課題我選擇了結合Kinect和Unity3D開發體感游戲,這是我十分感興趣的一個課題,所以做好當然責無旁貸。準備再寫一系列Kinect的學習筆記,記錄自己畢設一步一個腳印的歷程。1、Kinect背景介紹眾所周知,Kinect是一款集成了很…

獲取2個地址之間的距離(高德API)

2019獨角獸企業重金招聘Python工程師標準>>> string startLonLat SiteHelper.GetLonLat("大連"); //獲取起始地經度緯度 string endLonLat SiteHelper.GetLonLat("沈陽"); //獲取目的地經度緯度 int distance SiteHelper.GetDistance(star…

WPF屬性學習

一.WPF屬性系統 CLR屬性 .NET中的屬性稱為CLR屬性 轉載于:https://www.cnblogs.com/programme-maker/p/10910166.html

chemdraw怎么連接兩個結構_利用神經結構搜索構建快速準確輕量級的超分辨率網絡...

介紹我們知道,把神經網絡拆解,可以把它歸結為幾個元素的排列組合而成,例如,以卷積神經網絡為例,其主要由卷積層,池化層,殘差連接,注意力層,全連接層等組成,如…

Unity3D學習筆記之六創建更多的Prefab

在寫完第五篇后,因為不知名的原因,我突然不能夠上傳100KB以上的圖片在博客中了。等了幾天還是這樣,所以我用PS把圖片的分辨率一張張調低,讓圖片的大小都在100左右,將積攢了四篇的學習筆記一起發上來,也算彌…

iOS底層探索(二) - 寫給小白看的Clang編譯過程原理

iOS底層探索(一) - 從零開始認識Clang與LLVM 寫在前面 編譯器是屬于底層知識,在日常開發中少有涉及,但在我的印象中,越接近底層是越需要編程基本功,也是越復雜的。但要想提升技術卻始終繞不開要對底層原理的探究,很多資…

四、構建Node Web程序

---恢復內容開始--- 一、HTTP 服務器的基礎知識 1、Node如何向開發者呈現HTTP請求 2、一個用“Hello World”做響應的HTTP服務器 它用了默 認的狀態碼200(表明成功)和默認的響應頭 3、讀取請求頭及設定響應頭 Node提供了幾個修改HTTP響應頭的方法&#x…

datagrid 什么時候結束編輯_2020年中考結束后,什么時候出分?什么時候報志愿?...

導語7月19日下午16:00,2020年北京中考正式落下帷幕。考試結束后,很多家長和考生都會長舒一口氣,但北京中考在線團隊提醒你,現在還不是放松的時刻,中考結束后,還有成績查詢和填報志愿等重要事件等著你。那么…

Unity3D學習筆記之七創建自己的游戲場景

到現在為止我們已經擁有了比較完備的Prefab,已經可以創建宏大的游戲場景,并以第一人稱視角在場景中漫游了。這里給大家做個小的示范,建一個小場景大家在創建場景的時候需要自由發揮,做個盡量大的場景出來。這一系列教程以及素材均…

excel if in函數_【Excel函數】Small+Index+IF 一對N返回

通常情況下,Vlookup和lookup函數只能返回滿足條件的第一個,剩余的都不會返回。 這也是其函數的一個弊端之一。 若是按照條件,返回所有滿足條件的數據(1->N)的,可是適用組合函數。 Index返回位置&#xf…