1 命名空間
不同服務(wù)的鎖用不同的namespace來(lái)區(qū)分,不同元數(shù)據(jù)服務(wù)上鎖namespace的名字不同纸泡,元數(shù)據(jù)鎖和數(shù)據(jù)鎖的namespace也不同赖瞒,客戶端理論上會(huì)向所有的服務(wù)發(fā)請(qǐng)求,所以客戶端的鎖分布在不同的namespace下栏饮,鎖客戶端用namespace來(lái)組織不同的鎖鏈表.
分布式鎖模塊跟元數(shù)據(jù)服務(wù)器中其他模塊比較獨(dú)立袍嬉,它保存了系統(tǒng)中所有已經(jīng)向該元數(shù)據(jù)服務(wù)器申請(qǐng)的鎖。當(dāng)有新的鎖請(qǐng)求到來(lái)時(shí)伺通,會(huì)直接進(jìn)入鎖申請(qǐng)模塊。鎖模塊會(huì)檢查該資源上是否已經(jīng)有鎖吴藻,并檢查鎖是否存在沖突弓柱,以決定申請(qǐng)的鎖是否會(huì)被授權(quán)侧但∠乙叮客戶端上有專門的鎖客戶端緩存該客戶端已經(jīng)申請(qǐng)的分布式鎖。
2 鎖資源
鎖資源伤哺,就是鎖保護(hù)的對(duì)象。除了文件绢彤,還可以對(duì)象id等等蜓耻。一個(gè)鎖資源對(duì)應(yīng)于一個(gè)實(shí)際的實(shí)體,比如一個(gè)文件刹淌、一段數(shù)據(jù)、一個(gè)數(shù)據(jù)庫(kù)等等疹启,鎖資源的對(duì)象也決定鎖粒度蔼卡,比如你可以對(duì)整個(gè)inode加鎖,也可以對(duì)inode中一個(gè)屬性加鎖雇逞,前者的粒度顯然比后者粒度粗。
一個(gè)鎖資源可以擁有多個(gè)鎖持有它节仿,但是一個(gè)鎖只能被一個(gè)鎖資源持有。因此在DLM中粟耻,鎖資源和鎖是1:M關(guān)系眉踱。
2.1 資源所屬命名空間
2.2 鎖狀態(tài)
每個(gè)鎖資源有三個(gè)潛在的鎖狀態(tài):
- 已批準(zhǔn):鎖請(qǐng)求成功獲得其所要求的模式
- 轉(zhuǎn)換中:client嘗試改變的鎖模式和新請(qǐng)求的模式與已存在的鎖不兼容
- 阻塞的:由于沖突的鎖已存在,新請(qǐng)求的鎖無(wú)法被批準(zhǔn)
鎖的狀態(tài)取決于它請(qǐng)求的鎖模式和對(duì)應(yīng)鎖資源已存在的其他鎖模式
對(duì)應(yīng)三個(gè)鏈表對(duì)它們的狀態(tài)進(jìn)行歸類:
批準(zhǔn)鏈表: 已經(jīng)準(zhǔn)許在該資源上使用的所有鎖
等待鏈表:正在請(qǐng)求該資源的所有鎖
轉(zhuǎn)換鏈表:處于轉(zhuǎn)換狀態(tài)的所有鎖
2.3 轉(zhuǎn)換狀態(tài)機(jī)
已批準(zhǔn)
鎖被批準(zhǔn)的條件(其中之一滿足即可):
- 對(duì)應(yīng)鎖資源目前無(wú)鎖持有者
- 請(qǐng)求的鎖模式與最近已批準(zhǔn)的鎖兼容册烈,且轉(zhuǎn)化鏈表為空
轉(zhuǎn)換中
鎖轉(zhuǎn)換即改變已持有鎖的模式,只有批準(zhǔn)鎖可以轉(zhuǎn)化大猛,有兩種轉(zhuǎn)換方式:
up_conversion: a less restrictive to a more restrictive mode
down-conversion: a more restrictive to a less restrictive mode
鎖管理器會(huì)將需要轉(zhuǎn)換的lock從批準(zhǔn)鏈表移動(dòng)到轉(zhuǎn)換鏈表的尾部淀零。
離開轉(zhuǎn)換中狀態(tài)的條件(滿足任一即可):
- 請(qǐng)求鎖的線程終止
- 鎖持有者取消轉(zhuǎn)換請(qǐng)求
- 請(qǐng)求的模式最嚴(yán)格的批準(zhǔn)鎖匹配
鎖管理者對(duì)down-conversion的請(qǐng)求執(zhí)行本地轉(zhuǎn)換,即無(wú)需將請(qǐng)求轉(zhuǎn)移到轉(zhuǎn)移中鏈表就可以直接轉(zhuǎn)換成功
等待鏈表
如果請(qǐng)求的鎖與最嚴(yán)格的批準(zhǔn)鎖不兼容驾中,則鎖被阻塞,鎖請(qǐng)求會(huì)被添加到等待鏈表唠亚。
離開block狀態(tài)的條件(滿足任一即可):
- 請(qǐng)求鎖的線程終止
- 鎖請(qǐng)求者取消請(qǐng)求
- 鎖請(qǐng)求與資源上最嚴(yán)格的鎖兼容持痰,并且在鎖請(qǐng)求前面沒有轉(zhuǎn)換鎖或者block鎖
3 鎖類型
元數(shù)據(jù)鎖(比特鎖)
索引節(jié)點(diǎn)比特鎖,用來(lái)保護(hù)文件系統(tǒng)的元數(shù)據(jù)工窍。元數(shù)據(jù)就是對(duì)關(guān)于數(shù)據(jù)的數(shù)據(jù)的總稱,它可以分為很多種類究珊。我們將元數(shù)據(jù)分為六類:
- 其中目錄項(xiàng)被歸為一類,對(duì)應(yīng)索引節(jié)點(diǎn)比特鎖的一個(gè)比特
INODELOCK_LOOKUP
; - 文件模式言津、所有者、組被歸為一類悬槽,對(duì)應(yīng)索引節(jié)點(diǎn)比特鎖的
INODELOCK_PERM
; - 文件長(zhǎng)度,引用數(shù)蓬坡,時(shí)間戳被歸為一類磅叛,對(duì)應(yīng)
INODELOCK_UPDATE
比特; - 打開文件對(duì)應(yīng)
INODELOCK_OPEN
比特弊琴; - 分條布局信息對(duì)應(yīng)
INODELOCK_LAYOUT
比特; - 除ACL之外的擴(kuò)展屬性對(duì)應(yīng)
INODELOCK_XATTR
紫皇。
這六個(gè)比特共同構(gòu)成了索引比特鎖的各個(gè)部分慰安,也是它被稱為索引比特鎖的原因化焕。相比于傳統(tǒng)的平凡鎖方式铃剔,這種細(xì)分方式有助于提高目錄訪問(wèn)的并發(fā)度》客戶端在要讀取某文件的元數(shù)據(jù)信息時(shí),會(huì)對(duì)該文件加上索引節(jié)點(diǎn)比特鎖踱蠢。
flock
flock鎖為客戶端提供flock和fcntl接口,協(xié)助用戶空間請(qǐng)求文件鎖茎截。flock鎖作為單獨(dú)的命名空間赶盔,專門記錄客戶端申請(qǐng)的flock和fcntl鎖。Flock鎖也是對(duì)文件的某個(gè)范圍上鎖于未,這點(diǎn)與對(duì)象鎖類似,但與之不同的是抖坪,flock鎖請(qǐng)求會(huì)被發(fā)送到MDS而不是OSD
對(duì)象鎖
對(duì)象鎖保護(hù)文件系統(tǒng)對(duì)象的數(shù)據(jù),客戶端可以對(duì)不同的對(duì)象分別加鎖擦俐,在同一對(duì)象中握侧,只能支持一寫多讀的模式。系統(tǒng)中數(shù)據(jù)對(duì)象的大小是4M品擎,文件超過(guò)4M后會(huì)創(chuàng)建一個(gè)新對(duì)象繼續(xù)寫入。同一文件的不同對(duì)象可以同時(shí)被寫饥悴,即使這些對(duì)象屬于同一文件。對(duì)象鎖的resource id是對(duì)象oid西设。對(duì)象鎖保護(hù)文件的數(shù)據(jù),對(duì)對(duì)象加鎖棠笑,對(duì)象鎖服務(wù)器位于數(shù)據(jù)服務(wù)器上,每個(gè)數(shù)據(jù)服務(wù)器上的鎖服務(wù)器負(fù)責(zé)該數(shù)據(jù)服務(wù)器上保存的主份對(duì)象的鎖蓖救。
對(duì)象鎖被用在三種情形下印屁,一是在讀寫時(shí),二是在計(jì)算文件大小時(shí)雄人,三是在文件截?cái)鄷r(shí)。
- 在第一種情況下础钠,在對(duì)文件的某個(gè)范圍內(nèi)的數(shù)據(jù)進(jìn)行實(shí)際讀寫前恰力,計(jì)算數(shù)據(jù)屬于哪個(gè)對(duì)象踩萎,對(duì)該對(duì)象加鎖。
- 第二種是獲得文件size時(shí)香府,如果多個(gè)客戶端在同時(shí)寫一個(gè)文件的不同對(duì)象码倦,文件size更新依賴于各對(duì)象寫的匯總信息。
- 在第三種情況下叹洲,會(huì)計(jì)算文件截?cái)嗪蟊A舻膕ize大小及要截?cái)嗟膶?duì)象运提,分別對(duì)對(duì)象加寫鎖。
意圖鎖
客戶端在訪問(wèn)數(shù)據(jù)或者元數(shù)據(jù)資源時(shí),需要先向鎖服務(wù)器申請(qǐng)鎖,然后再發(fā)送相應(yīng)的請(qǐng)求鞍爱。為了減少交互頻率,在請(qǐng)求鎖的同時(shí)將鎖的意圖數(shù)據(jù)發(fā)給鎖服務(wù)器,如果請(qǐng)求的鎖可以被授權(quán)嬉橙,鎖服務(wù)器根據(jù)客戶端發(fā)的意圖調(diào)用元數(shù)據(jù)服務(wù)注冊(cè)的意圖函數(shù)進(jìn)行相應(yīng)的操作寥假,完成后把操作結(jié)果和鎖一起返回給客戶端。
數(shù)據(jù)的意圖鎖主要跟文件size更新有關(guān)糕韧,當(dāng)系統(tǒng)中多個(gè)客戶端同時(shí)在寫同一文件的不同對(duì)象時(shí),元數(shù)據(jù)服務(wù)上記錄的文件size不準(zhǔn)確粪滤,所以會(huì)發(fā)一個(gè)意圖鎖召回各對(duì)象上的數(shù)據(jù)鎖,各對(duì)象收到鎖召回請(qǐng)求后會(huì)上報(bào)各自的size以及modify time等相關(guān)信息杖小,元數(shù)據(jù)服務(wù)匯總之后確定文件的相關(guān)屬性怕吴。
4 鎖模式
鎖模式?jīng)Q定鎖持有者是否與其他人共享鎖資源的訪問(wèn)或者是否阻止其他人訪問(wèn)自身正在訪問(wèn)的資源。
鎖模式說(shuō)明
鎖模式 | 請(qǐng)求進(jìn)程 | 其他進(jìn)程 | 說(shuō)明 |
---|---|---|---|
EX | 讀或?qū)懺L問(wèn) | 不許訪問(wèn) | 允許鎖client安全的讀取或者寫鎖資源伟件,其他人在此期間不允許訪問(wèn)鎖資源,EX是一種傳統(tǒng)的獨(dú)占鎖 |
PW | 讀或?qū)懺L問(wèn) | 只允許讀 | 允許鎖client安全的讀取或者寫鎖資源斧账,其他人在此期間不允許寫鎖資源煞肾,PW鎖是一種傳統(tǒng)的更新鎖 |
PR | 讀訪問(wèn) | 只允許讀 | 允許鎖client安全的讀取鎖資源,其他人在此期間不允許寫鎖資源籍救,PR鎖是一種傳統(tǒng)的共享鎖 |
CW | 讀或?qū)懺L問(wèn) | 讀或?qū)懺L問(wèn) | 允許沒有保護(hù)的讀或者寫操作 |
CR | 讀訪問(wèn) | 讀或?qū)懺L問(wèn) | 允許沒有保護(hù)的讀操作,因?yàn)樵贑R鎖持有者讀取鎖資源時(shí)闪萄,其他人可以讀或者寫對(duì)應(yīng)的鎖資源,因此CR鎖的讀操作是不受保護(hù)的 |
NL | 無(wú)請(qǐng)求 | 可以讀或?qū)懺L問(wèn) | 未授予所持有者任何權(quán)限败去,通常使用NL作為后續(xù)轉(zhuǎn)換請(qǐng)求的占位符 |
限制級(jí)別(高-->低):
EX --> PW --> CW/PR --> CR --> NL
鎖兼容性
鎖兼容性決定兩種鎖是否可以同時(shí)被批準(zhǔn)對(duì)同一個(gè)鎖資源加鎖烈拒,比如广鳍,EX鎖不允許其他人訪問(wèn)對(duì)應(yīng)的鎖資源吓妆,它與除去NL之外的鎖均不兼容,CR鎖限制性較小耿战,它與除了EX之外的所有其他鎖均兼容,以下是兼容性二維矩陣
EX | PW | PR | CW | CR | NL | |
---|---|---|---|---|---|---|
EX | 0 | 0 | 0 | 0 | 0 | 1 |
PW | 0 | 0 | 0 | 0 | 1 | 1 |
PR | 0 | 0 | 1 | 0 | 1 | 1 |
CW | 0 | 0 | 0 | 1 | 1 | 1 |
CR | 0 | 1 | 1 | 1 | 1 | 1 |
NL | 1 | 1 | 1 | 1 | 1 | 1 |
它們的關(guān)系矩陣是一個(gè)對(duì)稱矩陣狈涮,因此我們知道它們之間的兼容關(guān)系是對(duì)稱關(guān)系鸭栖。對(duì)于鎖兼容關(guān)系的對(duì)稱性,我們可以這樣理解:如果A模式的鎖與B模式的鎖兼容晕鹊,則意味著,如果某資源已被A模式的鎖保護(hù)晓锻,則請(qǐng)求對(duì)該資源加上B模式的新鎖會(huì)被批準(zhǔn);同時(shí)也意味著砚哆,如果資源已被B模式的鎖保護(hù),則請(qǐng)求對(duì)該資源加上A模式的新鎖也會(huì)被批準(zhǔn)躁锁;反之亦然卵史。
系是對(duì)稱關(guān)系。對(duì)于鎖兼容關(guān)系的對(duì)稱性以躯,我們可以這樣理解:如果A模式的鎖與B模式的鎖兼容,則意味著忧设,如果某資源已被A模式的鎖保護(hù),則請(qǐng)求對(duì)該資源加上B模式的新鎖會(huì)被批準(zhǔn);同時(shí)也意味著蒜哀,如果資源已被B模式的鎖保護(hù)吏砂,則請(qǐng)求對(duì)該資源加上A模式的新鎖也會(huì)被批準(zhǔn)乘客;反之亦然。