專利名稱:使用網(wǎng)絡(luò)和基于碟片上的方案的混合鎖定的制作方法
使用網(wǎng)絡(luò)和基于碟片上的方案的混合鎖定相關(guān)申請(qǐng)的交叉引用本申請(qǐng)要求2009年2月5日提交的美國(guó)臨時(shí)申請(qǐng)No.61/150,094的權(quán)益。本申請(qǐng)是 2007 年 2 月 16 日提交的名稱為 “System and Method forlmplemented Distributed Locks via On-Disk Heartbeating”的美國(guó)專利申請(qǐng)No. 11/676,109的部分繼續(xù)申請(qǐng),以 R 2004 ^f-2 J3i 6 Hil^W^^^J "Providing multiple concurrent access to a file system"的美國(guó)專利申請(qǐng)No. 10/773,613的部分繼續(xù)申請(qǐng),以引用的方式將這兩個(gè)申請(qǐng)并 入本文。
背景技術(shù):
分布式(或跨主機(jī)的)鎖可以用于同步多個(gè)節(jié)點(diǎn)(即主機(jī))的操作??梢允褂镁W(wǎng) 絡(luò)鎖管理器(NLM),或替代地,在更加可靠的存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN)可用的系統(tǒng)中,使用碟片 上基于租用的鎖(on-disklease-based lock)來(lái)實(shí)施分布式鎖。網(wǎng)絡(luò)容易出故障,并且當(dāng)主機(jī)的IP網(wǎng)絡(luò)不工作或者管理鎖的主機(jī)崩潰時(shí),必須選 出用于鎖的新管理器,而且有很多復(fù)雜的實(shí)施問(wèn)題。這些系統(tǒng)還必須從網(wǎng)絡(luò)分區(qū)中恢復(fù), 這會(huì)導(dǎo)致所謂的“腦分裂”問(wèn)題,其中集群可能分裂為兩個(gè)或更多的子集群,每個(gè)子集群可 能對(duì)重要的碟片上資源要求獨(dú)占。因此,NLM對(duì)節(jié)點(diǎn)失效的最大數(shù)量有限制。NLM可以將 至IJ “仲裁(quorum) ”碟片的心跳選作為幫助確定節(jié)點(diǎn)是否宕機(jī)的額外途徑,諸如Red Hat Cluster Suite和VERITAS ClusterService的集群軟件在過(guò)去已經(jīng)使用“仲裁”碟片的概 念,盡管它們不具體實(shí)施鎖。碟片上基于租用的鎖依賴于互斥原語(yǔ)(mutual exclusionprimitives),諸如為絕 大多數(shù)碟片陣列控制器所支持的SCSI-2保留/釋放或SCSI-3持久性保留/釋放。碟片陣 列控制器管理物理碟片驅(qū)動(dòng),并將它們作為邏輯數(shù)據(jù)存儲(chǔ)單元(DSU)向連接的計(jì)算機(jī)系統(tǒng) 呈現(xiàn),每個(gè)物理碟片驅(qū)動(dòng)用邏輯單元號(hào)(LUN)來(lái)標(biāo)識(shí)。碟片上基于租用的鎖的性能取決于 這些存儲(chǔ)系統(tǒng)所提供的互斥原語(yǔ)的功效。具體地,SCSI-2保留可能與LUN粒度上的那些操作一樣花費(fèi)大,并將對(duì)DSU的訪 問(wèn)限制到持有保留的節(jié)點(diǎn)。因此,連附到DSU的任何其他計(jì)算機(jī)系統(tǒng)在保留持續(xù)結(jié)束之前, 不能進(jìn)行到LUN的輸入輸出。同時(shí),基于SCSI-3的保留允許來(lái)自持有保留的節(jié)點(diǎn)之外的節(jié) 點(diǎn)/起始器的輸入輸出,但是SCSI保留/釋放的開(kāi)銷可能仍然被禁止。
發(fā)明內(nèi)容
在一個(gè)實(shí)施例中,公開(kāi)了一種由節(jié)點(diǎn)獲取在多個(gè)互連節(jié)點(diǎn)的系統(tǒng)中的共享資源上 的鎖的方法。競(jìng)爭(zhēng)共享資源上的鎖的每個(gè)節(jié)點(diǎn)維護(hù)該節(jié)點(diǎn)當(dāng)前所擁有的鎖的列表。鎖元數(shù) 據(jù)被維護(hù)在共享存儲(chǔ)上,可能競(jìng)爭(zhēng)共享資源上的鎖的所有節(jié)點(diǎn)可以訪問(wèn)該共享存儲(chǔ)。在對(duì) 應(yīng)于每個(gè)節(jié)點(diǎn)的共享資源上維護(hù)心跳區(qū),這樣節(jié)點(diǎn)可以注冊(cè)其活性。鎖狀態(tài)被維護(hù)在共享 存儲(chǔ)內(nèi)的鎖元數(shù)據(jù)中。鎖狀態(tài)可以指示鎖被排他持有、鎖空閑或鎖處于管理模式(managed mode)。如果鎖是以管理模式被持有,則可以不必使用互斥原語(yǔ),將鎖的所有權(quán)轉(zhuǎn)移給另一節(jié)點(diǎn)。在另一實(shí)施例中,公開(kāi)了一種在第一節(jié)點(diǎn)從第二節(jié)點(diǎn)接收釋放鎖的請(qǐng)求的方法。 該方法包括檢查第一節(jié)點(diǎn)的本地鎖元數(shù)據(jù)。如果本地鎖元數(shù)據(jù)包括指示該鎖正由第一節(jié)點(diǎn) 以排他模式所擁有的信息,則向第二節(jié)點(diǎn)發(fā)送指示該鎖正被使用的消息。如果本地鎖元數(shù) 據(jù)包括指示該鎖正由第一節(jié)點(diǎn)持有但不被使用的信息,則第二節(jié)點(diǎn)將該鎖的信息從本地鎖 元數(shù)據(jù)移除,并且更新在對(duì)應(yīng)于該鎖的心跳區(qū)中的信息,以將該鎖授予給第二節(jié)點(diǎn)。向第二 節(jié)點(diǎn)返回指示該鎖被授予的消息。在一個(gè)實(shí)施例中,釋放請(qǐng)求經(jīng)由IP網(wǎng)絡(luò)被接收。在又一實(shí)施例中,公開(kāi)了一種用于存儲(chǔ)以執(zhí)行以下方法步驟的程序指令的計(jì)算機(jī) 可讀介質(zhì)(a)探查節(jié)點(diǎn)的本地鎖元數(shù)據(jù),以確定在本地鎖元數(shù)據(jù)中是否存在該鎖的鎖元 數(shù)據(jù),其中鎖元數(shù)據(jù)包括鎖的標(biāo)識(shí)和鎖狀態(tài);(b)如果在所述本地鎖元數(shù)據(jù)中不存在所述 鎖元數(shù)據(jù),則執(zhí)行步驟(i)到(iv),(i)從共享存儲(chǔ)中讀取所述鎖的共享鎖元數(shù)據(jù),所述讀 取包括識(shí)別所述鎖的當(dāng)前擁有者和所述鎖的當(dāng)前狀態(tài);(ii)探查所述鎖的所述當(dāng)前擁有 者的心跳區(qū),以確定所述當(dāng)前擁有者是否活著,其中如果所述當(dāng)前擁有者不是活著的,則等 待鎖租用時(shí)間流逝,然后獲取所述鎖,并更新所述共享鎖元數(shù)據(jù)以指示所述鎖現(xiàn)在由所述 節(jié)點(diǎn)擁有;(iii)如果所述鎖的所述當(dāng)前狀態(tài)指示所述當(dāng)前擁有者正以排他模式持有所述 鎖,則向所述節(jié)點(diǎn)返回消息以通知所述鎖不是空閑的;(iv)如果所述鎖的當(dāng)前狀態(tài)指示所 述當(dāng)前擁有者正以管理模式持有所述鎖,則向所述當(dāng)前擁有者發(fā)送釋放所述鎖的請(qǐng)求,其 中如果所述當(dāng)前擁有者還沒(méi)有將所述鎖釋放給另一請(qǐng)求節(jié)點(diǎn),則將所述鎖授予給所述節(jié)點(diǎn) 而不在所述共享資源上執(zhí)行互斥原語(yǔ)操作,并且更新所述共享鎖元數(shù)據(jù)以指示新的鎖所有 權(quán)和鎖狀態(tài);(c)如果在所述本地鎖元數(shù)據(jù)中存在所述節(jié)點(diǎn)的所述鎖元數(shù)據(jù),則探查在所 述本地鎖元數(shù)據(jù)中的所述鎖的所述鎖狀態(tài),如果在所述本地鎖元數(shù)據(jù)中的所述鎖的鎖狀態(tài) 指示所述鎖正以管理模式被擁有,則改變本地鎖元數(shù)據(jù)中的所述鎖的鎖狀態(tài)以指示所述節(jié) 點(diǎn)對(duì)所述鎖的排他使用,并更新所述共享鎖元數(shù)據(jù)(而不用執(zhí)行互斥原語(yǔ))以指示所述鎖 正以排他模式被所述節(jié)點(diǎn)擁有。所述管理模式意指所述鎖正由所述節(jié)點(diǎn)擁有,但是所述鎖 未被所述節(jié)點(diǎn)使用。
圖1圖示了根據(jù)本發(fā)明一個(gè)或多個(gè)實(shí)施例的用于提供混合鎖定的系統(tǒng)的邏輯圖。圖2圖示了根據(jù)本發(fā)明一個(gè)或多個(gè)實(shí)施例的用于存儲(chǔ)鎖信息的存儲(chǔ)段的邏輯圖。圖3從概念上圖示了根據(jù)本發(fā)明一個(gè)或多個(gè)實(shí)施例的多個(gè)節(jié)點(diǎn)、節(jié)點(diǎn)實(shí)例、鎖、和 心跳之間的邏輯組織和關(guān)系。圖4從概念上圖示了根據(jù)本發(fā)明一個(gè)或多個(gè)實(shí)施例的鎖、心跳區(qū)和心跳段之間的邏輯組織和關(guān)系。圖5-9圖示了根據(jù)本發(fā)明一個(gè)或多個(gè)實(shí)施例的用于獲取鎖的流程圖。
具體實(shí)施例方式圖1圖示了用于提供對(duì)共享資源的混合鎖定的系統(tǒng)。資源可以是必須控制對(duì)其的 共享訪問(wèn)的實(shí)體,典型地是文件、記錄、或共享存儲(chǔ)器的區(qū)域,但是也可以是應(yīng)用設(shè)計(jì)者選 擇的任何實(shí)體。節(jié)點(diǎn)是有資源所有權(quán)能力的任何實(shí)體。另外,節(jié)點(diǎn)可以具有由系統(tǒng)內(nèi)的持久性標(biāo)識(shí)符識(shí)別的可選特性,并且具有對(duì)共享資源保持基于租用的鎖的能力。在一個(gè)或多個(gè)實(shí)施例中,每次節(jié)點(diǎn)被重啟或重新初始化,創(chuàng)建該節(jié)點(diǎn)的不同實(shí)例。如在此所使用的,術(shù)語(yǔ)“節(jié)點(diǎn)”意指連接到計(jì)算機(jī)網(wǎng)絡(luò)的任何設(shè)備。節(jié)點(diǎn)可以是計(jì) 算機(jī)、個(gè)人數(shù)字助理(PDA)、蜂窩電話、或多種其他網(wǎng)絡(luò)裝置。在IP網(wǎng)絡(luò)上,節(jié)點(diǎn)是具有IP 地址的任何設(shè)備。在圖1圖示的系統(tǒng)中,任何計(jì)算機(jī)102均可以是節(jié)點(diǎn)。當(dāng)在虛擬機(jī)環(huán)境中實(shí)施本 發(fā)明時(shí),可以將任何虛擬機(jī)100認(rèn)為是節(jié)點(diǎn)。在一個(gè)或多個(gè)實(shí)施例中,節(jié)點(diǎn)用鎖獲取對(duì)資源 的控制。特定節(jié)點(diǎn)實(shí)例所獲取的鎖與單個(gè)心跳相關(guān)聯(lián)。心跳被實(shí)施為碟片上的數(shù)據(jù)結(jié)構(gòu), 其包含用于識(shí)別特定節(jié)點(diǎn)實(shí)例的各種信息。鎖也被實(shí)施為碟片上的數(shù)據(jù)結(jié)構(gòu),其包含用于 識(shí)別擁有鎖的節(jié)點(diǎn)實(shí)例的信息和對(duì)應(yīng)于心跳的節(jié)點(diǎn)的地址。圖1的系統(tǒng)包括共享存儲(chǔ)104,其包括用來(lái)存儲(chǔ)鎖定信息的心跳區(qū)106。共享資源 和節(jié)點(diǎn)使用局域網(wǎng)(LAN) 108和存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN) 110互連,局域網(wǎng)108可以是因特網(wǎng)、局 域網(wǎng)或廣域網(wǎng)。在一個(gè)實(shí)施例中,SAN 110和LAN 108可以是同一網(wǎng)絡(luò)。應(yīng)當(dāng)注意,可以在 非虛擬化環(huán)境以及虛擬化環(huán)境中實(shí)踐此處描述的實(shí)施例。圖2圖示了在共享存儲(chǔ)中的心跳區(qū)106的邏輯圖。心跳區(qū)106包括存儲(chǔ)結(jié)構(gòu),用 于存儲(chǔ)心跳數(shù)據(jù)130、鎖元數(shù)據(jù)132和實(shí)施本文檔以下將要描述的鎖定方法可能需要的其 他鎖相關(guān)數(shù)據(jù)134。在一個(gè)實(shí)施例中,網(wǎng)絡(luò)108中的所有節(jié)點(diǎn)都可以訪問(wèn)心跳數(shù)據(jù)存儲(chǔ)130 和鎖元數(shù)據(jù)存儲(chǔ)132。然而,該可訪問(wèn)性易遭受到網(wǎng)絡(luò)故障。在其他實(shí)施例中,還可以將鎖 元數(shù)據(jù)存儲(chǔ)在與心跳區(qū)相分離的區(qū)中。在一個(gè)或多個(gè)實(shí)施例中,每個(gè)主機(jī)或節(jié)點(diǎn)具有用于每個(gè)文件系統(tǒng)的心跳區(qū)106,以 指示節(jié)點(diǎn)的活性。在一個(gè)實(shí)施例中,節(jié)點(diǎn)的活性由節(jié)點(diǎn)更新心跳區(qū)中的節(jié)點(diǎn)心跳數(shù)據(jù)的能 力所指示。例如,如果因故障或負(fù)載大或從網(wǎng)絡(luò)斷開(kāi)連接,節(jié)點(diǎn)變得不可操作,則節(jié)點(diǎn)可能 失去其更新心跳數(shù)據(jù)的能力。節(jié)點(diǎn)在獲取鎖之后改變特定鎖元數(shù)據(jù)區(qū)的狀態(tài),使得其他節(jié) 點(diǎn)在給定的時(shí)間能夠確定特定鎖的擁有者。類似地,當(dāng)鎖被釋放時(shí),在對(duì)應(yīng)的鎖元數(shù)據(jù)區(qū)更 新鎖狀態(tài)。圖3示出多個(gè)節(jié)點(diǎn)、鎖、資源和心跳之間的邏輯組織和關(guān)系。在一個(gè)實(shí)施例中,節(jié) 點(diǎn)是與其他節(jié)點(diǎn)共享相同資源的任何實(shí)體。如所圖示,節(jié)點(diǎn)280可以已與一個(gè)或多個(gè)鎖 290a, 290b,290c,. . . 290η相關(guān)聯(lián),每個(gè)鎖與資源相關(guān)聯(lián)。節(jié)點(diǎn)280所持有的鎖290a,290b, 290c,.. . 290η中的每個(gè)已與指針數(shù)據(jù)相關(guān)聯(lián),指針數(shù)據(jù)識(shí)別與節(jié)點(diǎn)280的實(shí)例唯一關(guān)聯(lián)的 心跳區(qū)342a。同樣,節(jié)點(diǎn)282所持有的鎖292a,292b,292c,. . . 292η中的每個(gè)已與指針數(shù)據(jù) 相關(guān)聯(lián),指針數(shù)據(jù)識(shí)別與節(jié)點(diǎn)282的實(shí)例唯一關(guān)聯(lián)的心跳區(qū)342b。通過(guò)要求所有節(jié)點(diǎn)在系 統(tǒng)級(jí)時(shí)間常數(shù)內(nèi)刷新其各自的心跳區(qū),使得其他節(jié)點(diǎn)能夠確定心跳及其各自的鎖是否為有 效或失效的協(xié)議是可能的。例如,在圖3中,從節(jié)點(diǎn)280和282中的每個(gè)到其各自心跳的實(shí) 曲線指示心跳數(shù)據(jù)結(jié)構(gòu)的刷新。以虛線圖示的節(jié)點(diǎn)N是節(jié)點(diǎn)的過(guò)期實(shí)例。節(jié)點(diǎn)N不再刷新 其心跳,但是與該節(jié)點(diǎn)相關(guān)聯(lián)的鎖仍舊指向其各自的心跳342η。如從節(jié)點(diǎn)280出發(fā)的虛線 所圖示的,如果節(jié)點(diǎn)280希望獲取節(jié)點(diǎn)282當(dāng)前持有的鎖,則節(jié)點(diǎn)280可以通過(guò)監(jiān)視心跳數(shù) 據(jù)結(jié)構(gòu)來(lái)確定心跳342b是否存活,其在該實(shí)例中是仍然“心跳著”。因而,節(jié)點(diǎn)280將必須 為獲取鎖而等待。在另一實(shí)施例中,獲取鎖的失敗導(dǎo)致鎖操作的失敗。相反,如從節(jié)點(diǎn)282 出發(fā)的虛線所圖示的,如果來(lái)自節(jié)點(diǎn)282的過(guò)程希望獲取當(dāng)前由節(jié)點(diǎn)N鎖定的資源,則節(jié)點(diǎn)282可以通過(guò)監(jiān)視心跳數(shù)據(jù)結(jié)構(gòu)來(lái)確定心跳342η是否仍然存活,其在該實(shí)例中是“失效”, 因而,節(jié)點(diǎn)282可以通過(guò)修改其狀態(tài)值來(lái)清除心跳342η,并且此后節(jié)點(diǎn)282可以自由地獲取 與心跳342η相關(guān)聯(lián)的鎖中的一個(gè)或多個(gè)。在一個(gè)實(shí)施例中,碟片用于存儲(chǔ)心跳段340。通過(guò)分配大到足夠容納多個(gè)心跳 區(qū)342的例如IOM字節(jié)的碟片的段340,來(lái)實(shí)現(xiàn)心跳分配。在該心跳段340中,系統(tǒng)的每 個(gè)心跳區(qū)342a,342b,... 342η通常可以至少與碟片上的最小扇區(qū)大小一樣大。例如,在 SCSI碟片上,每個(gè)心跳區(qū)可以是512字節(jié)。替代性地,設(shè)計(jì)者自行選擇各個(gè)心跳區(qū)342a, 342b,. . . 342η以及整個(gè)心跳段可以具有的大小,以優(yōu)化存儲(chǔ)器使用并容納與系統(tǒng)內(nèi)的節(jié)點(diǎn) 相關(guān)聯(lián)的心跳的預(yù)計(jì)數(shù)目。在本發(fā)明中,心跳段340內(nèi)的心跳區(qū)342的數(shù)目典型地大于系 統(tǒng)內(nèi)的活動(dòng)節(jié)點(diǎn)的最大數(shù)目。在本文中除非另外指出,否則術(shù)語(yǔ)“心跳”可互換使用來(lái)指代 數(shù)據(jù)結(jié)構(gòu)345和數(shù)據(jù)結(jié)構(gòu)駐留的心跳區(qū)342。在此公開(kāi)的動(dòng)態(tài)心跳分配算法避免了任何將節(jié)點(diǎn)提前配置為群集的一部分的要 求。一旦節(jié)點(diǎn)分配了心跳區(qū),則其也可以將關(guān)于自身的配置信息,比如其IP地址或主機(jī)名, 存儲(chǔ)在心跳區(qū)345的“其他特定于節(jié)點(diǎn)的信息”區(qū)354中。在圖4中,占據(jù)心跳區(qū)342a,342b,. . . 342η的心跳數(shù)據(jù)結(jié)構(gòu)345包括以下字段擁 有者標(biāo)識(shí)符、心跳狀態(tài)、心跳產(chǎn)生數(shù)、脈沖字段、其他特定于節(jié)點(diǎn)的信息和心跳超時(shí)。也稱為擁有者的擁有者標(biāo)識(shí)符字段344唯一地標(biāo)識(shí)擁有心跳區(qū)的節(jié)點(diǎn),并且可以 用包括但不 限于字母數(shù)字或二進(jìn)制的任何數(shù)據(jù)類型來(lái)實(shí)施,該數(shù)據(jù)類型的長(zhǎng)度被選擇為允 許系統(tǒng)內(nèi)的充足的唯一標(biāo)識(shí)符??梢允褂萌魏螖?shù)量的不同標(biāo)識(shí)方案,只要系統(tǒng)內(nèi)的所有節(jié) 點(diǎn)可以識(shí)別當(dāng)前擁有特定心跳區(qū)342的節(jié)點(diǎn)。在優(yōu)選實(shí)施例中,通用唯一標(biāo)識(shí)符(UUID)用 于識(shí)別節(jié)點(diǎn)。在替代實(shí)施例中,在僅使用心跳區(qū)的地址和心跳產(chǎn)生數(shù)就可以唯一地標(biāo)識(shí)節(jié) 點(diǎn)實(shí)例時(shí),可以省略擁有者字段。然而應(yīng)當(dāng)注意,擁有者字段使得能夠進(jìn)行多種優(yōu)化并簡(jiǎn)化 調(diào)試ο心跳狀態(tài)字段346指示心跳的當(dāng)前狀態(tài),并且可以用能夠采取多種狀態(tài)的枚舉數(shù) 據(jù)類型來(lái)實(shí)施。在說(shuō)明性實(shí)施例中,心跳狀態(tài)值可以采取任何以下?tīng)顟B(tài)CLEAR-心跳當(dāng)前未被使用;IN_USE_心跳結(jié)構(gòu)正由節(jié)點(diǎn)使用;BREAKING-心跳已超時(shí),并正由另一節(jié)點(diǎn)清除。心跳產(chǎn)生數(shù)348是可修改的值,其指示心跳區(qū)已被初始化的次數(shù),并可以用64位 整數(shù)數(shù)據(jù)類型來(lái)實(shí)施。心跳產(chǎn)生數(shù)348可以被修改,典型地是每次將心跳區(qū)分配給節(jié)點(diǎn)時(shí) 遞增。與心跳區(qū)的地址一起,心跳產(chǎn)生數(shù)348可以用于唯一地識(shí)別心跳的特定實(shí)例。例如, 心跳產(chǎn)生數(shù)348可以用于確定節(jié)點(diǎn)是否已經(jīng)解除分配心跳區(qū),然后重新分配同一區(qū)域。因 此,心跳產(chǎn)生數(shù)使其他節(jié)點(diǎn)能夠確定心跳是否被與鎖數(shù)據(jù)結(jié)構(gòu)中記錄的節(jié)點(diǎn)相同的實(shí)例 (instance)擁有。脈沖字段350是每次心跳由其各自的擁有者更新(心跳著)時(shí)改變的值,并且可 以用64位整數(shù)數(shù)據(jù)類型實(shí)施。在一個(gè)實(shí)施例中,脈沖字段350可以用時(shí)間戳來(lái)實(shí)施。替代 地,脈沖字段350可以用另一值來(lái)實(shí)施,其可以不是時(shí)間格式,但是確保心跳每次更新時(shí)改 變。其他節(jié)點(diǎn)可以通過(guò)觀察脈沖字段350中的變化來(lái)獲悉擁有者節(jié)點(diǎn)是否在心跳??梢允?用多種技術(shù)更新脈沖字段350的值。例如,脈沖字段350可以相對(duì)從系統(tǒng)內(nèi)部得到的初始啟動(dòng)值而遞增。替代地,在更新時(shí)刻等,可以將脈沖字段350設(shè)置為本地時(shí)間的值。在說(shuō)明 性實(shí)施例中,為使在此公開(kāi)的鎖租用技術(shù)工作,不需要時(shí)鐘跨主機(jī)同步。其他特定于節(jié)點(diǎn)的信息區(qū)354是未定義的附加存儲(chǔ),其不需要與特定的數(shù)據(jù)類型 相關(guān)聯(lián)。數(shù)據(jù)結(jié)構(gòu)345的該區(qū)允許將其他有用的數(shù)據(jù)與特定于心跳的數(shù)據(jù)一起存儲(chǔ),并且 可以包括對(duì)當(dāng)前擁有心跳的節(jié)點(diǎn)唯一或與之相關(guān)聯(lián)的數(shù)據(jù)。例如,在分布式文件系統(tǒng)的環(huán)境中,可以將到用于主題節(jié)點(diǎn)的日志文件的指針存儲(chǔ)在心跳數(shù)據(jù)結(jié)構(gòu)345的其他特定于節(jié) 點(diǎn)的信息區(qū)354內(nèi),如果該節(jié)點(diǎn)崩潰可以重放該日志文件。在說(shuō)明性實(shí)施例中,碟片上鎖365可以用包含以下內(nèi)容的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)施持有 鎖的節(jié)點(diǎn)的地址、到持有鎖的節(jié)點(diǎn)實(shí)例的心跳區(qū)342的指針、和獲取鎖時(shí)的心跳的產(chǎn)生數(shù)。 以此方式,其他節(jié)點(diǎn)可以驗(yàn)證該鎖定節(jié)點(diǎn)是否仍在心跳,并且自獲取鎖之后沒(méi)有崩潰??梢?將鎖典型地存儲(chǔ)在與心跳段340相同的故障域諸如相同的碟片內(nèi)。在本發(fā)明中,鎖數(shù)據(jù)結(jié) 構(gòu)365與系統(tǒng)內(nèi)的每個(gè)資源相關(guān)聯(lián)并且可以保持在碟片上。在圖4中,可以與系統(tǒng)內(nèi)的每個(gè)資源相關(guān)聯(lián)的鎖數(shù)據(jù)結(jié)構(gòu)365包括以下字段擁有者標(biāo)識(shí)符(擁有鎖的節(jié)點(diǎn))或擁有者通用唯一標(biāo)識(shí)符(UUID)、心跳地址、心跳產(chǎn)生數(shù)、鎖類 型、其他特定于鎖的信息??梢杂妙愃朴谛奶鴶?shù)據(jù)結(jié)構(gòu)345的擁有者標(biāo)識(shí)符字段344的方式實(shí)施擁有者標(biāo)識(shí) 符字段364。在預(yù)期的系統(tǒng)中,擁有者標(biāo)識(shí)符字段364和擁有者標(biāo)識(shí)符字段344對(duì)沒(méi)有失效 或過(guò)期的心跳可以具有相同的值,即擁有心跳的節(jié)點(diǎn)也擁有與該心跳相關(guān)聯(lián)的所有鎖。該 要求在其中在心跳中沒(méi)有指定擁有者的替代實(shí)施例中不存在,即使出于優(yōu)化和調(diào)試的原因 鎖包含擁有者??梢杂妙愃朴谛奶鴶?shù)據(jù)結(jié)構(gòu)345的心跳產(chǎn)生數(shù)348的方式實(shí)施心跳產(chǎn)生數(shù)366。 在預(yù)期的系統(tǒng)中,心跳產(chǎn)生數(shù)348和心跳產(chǎn)生數(shù)366對(duì)于還沒(méi)有成為失效的心跳可以具有 相同的值。鎖類型字段368指示與資源相關(guān)聯(lián)的鎖的類型,并且可以用能夠采取多個(gè)狀態(tài)的任何枚舉數(shù)據(jù)類型來(lái)實(shí)施。在說(shuō)明性實(shí)施例中,鎖類型字段典型地可以具有將由在系統(tǒng)內(nèi) 可用的鎖的數(shù)目和類型限定的多個(gè)值。諸如這些值留待系統(tǒng)設(shè)計(jì)者決定??梢允褂萌魏捂i 類型實(shí)施此處描述的系統(tǒng)。典型的鎖類型可以包括空、并發(fā)讀、并發(fā)寫、讀保護(hù)、寫保護(hù)、或排他鎖類型中的任 何一個(gè)。心跳地址字段372識(shí)別鎖擁有者心跳區(qū)的位置,并且可以用到心跳段340的特定心跳區(qū)342的指針來(lái)實(shí)施,該特定心跳區(qū)342包含對(duì)應(yīng)于與鎖相關(guān)聯(lián)的心跳的擁有者的心 跳數(shù)據(jù)結(jié)構(gòu)345??蛇x地,鎖數(shù)據(jù)結(jié)構(gòu)365可以進(jìn)一步包括用于與其相關(guān)聯(lián)的其他數(shù)據(jù)類型的其他特定于鎖的信息區(qū)(未示出)。數(shù)據(jù)結(jié)構(gòu)365的該區(qū)允許將其他有用的數(shù)據(jù)與鎖數(shù)據(jù)一起 存儲(chǔ),并且可以包括對(duì)當(dāng)前擁有鎖的節(jié)點(diǎn)唯一或與之相關(guān)聯(lián)的數(shù)據(jù)。在本發(fā)明中,鎖數(shù)據(jù)結(jié) 構(gòu)365與系統(tǒng)內(nèi)的每個(gè)資源相關(guān)聯(lián)并且可以保持在SAN的碟片上。在說(shuō)明性實(shí)施例中,每 個(gè)鎖數(shù)據(jù)結(jié)構(gòu)365與其對(duì)應(yīng)的資源駐留在一起,所以映射系統(tǒng)資源或與其相關(guān)聯(lián)。當(dāng)節(jié)點(diǎn) 試圖獲取對(duì)資源的訪問(wèn)時(shí),該節(jié)點(diǎn)可以通過(guò)從碟片讀取鎖數(shù)據(jù)結(jié)構(gòu)來(lái)立刻確定資源是否被 鎖定。取決于此處描述的技術(shù)是與傳統(tǒng)計(jì)算機(jī)系統(tǒng)還是與完全或部分虛擬化的計(jì)算機(jī)系統(tǒng)一起使用,資源到鎖的映射可以隨設(shè)計(jì)者的決定而變化,只要在兩者之間保持某種關(guān)聯(lián)。例如,可以使用存儲(chǔ)在碟片上或與心跳段340相同的故障域內(nèi)的一個(gè)或多個(gè)表實(shí)施這樣的映射。如以上所描述的,在共享存儲(chǔ)的鎖元數(shù)據(jù)區(qū)中維護(hù)用于每個(gè)鎖的鎖狀態(tài)或類型。 在一個(gè)實(shí)施例中,鎖類型包括三個(gè)值“空閑”、“管理”和“鎖定”。應(yīng)當(dāng)注意,這些名稱值(例 如,空閑、管理和鎖定)僅是用來(lái)說(shuō)明管理鎖的方法。只要遵循在本文檔全文中描述的管理 和獲取鎖的過(guò)程,不論是所述的過(guò)程還是等效的過(guò)程,可以代替使用任何其他值或名稱。如 果鎖處于“空閑”狀態(tài),則任何節(jié)點(diǎn)可以使用諸如SCSI保留的互斥原語(yǔ)來(lái)獲取鎖。當(dāng)節(jié)點(diǎn)獲 取鎖時(shí),該鎖的鎖狀態(tài)在鎖元數(shù)據(jù)中變?yōu)椤版i定”?!版i定”狀態(tài)還意指鎖的當(dāng)前擁有者正以 排他模式持有鎖。然而,由于在存儲(chǔ)區(qū)域網(wǎng)絡(luò)中通過(guò)互斥原語(yǔ)獲取鎖的該過(guò)程代價(jià)高昂,所 以在一個(gè)實(shí)施例中,如果節(jié)點(diǎn)不再需要鎖,則該鎖的狀態(tài)在鎖元數(shù)據(jù)中變?yōu)椤肮芾怼?,以指?盡管當(dāng)前擁有者仍然持有該鎖,但如果請(qǐng)求,當(dāng)前擁有者將釋放該鎖。此外,維護(hù)鎖元數(shù)據(jù) 中的指針,以識(shí)別當(dāng)前擁有鎖的節(jié)點(diǎn)。通過(guò)使用“管理”這種中間狀態(tài),大大減少了在獲取 鎖中互斥原語(yǔ)的使用。當(dāng)節(jié)點(diǎn)需要獲取鎖時(shí),探查鎖元數(shù)據(jù)以識(shí)別1)誰(shuí)是該鎖的當(dāng)前擁有 者,和2)該鎖的當(dāng)前狀態(tài)是什么。如果該鎖處于“空閑”狀態(tài),則將該鎖授予請(qǐng)求節(jié)點(diǎn)。如 果該鎖處于“鎖定”狀態(tài),則探查當(dāng)前擁有該鎖的節(jié)點(diǎn)的心跳區(qū),以確定擁有節(jié)點(diǎn)是否仍然 是活著的。如果該節(jié)點(diǎn)仍然活著,則將消息發(fā)送給請(qǐng)求節(jié)點(diǎn),以通知請(qǐng)求節(jié)點(diǎn)該鎖不是空閑 的。然而,如果擁有節(jié)點(diǎn)不是活著的,則釋放該鎖,并將該鎖的所有權(quán)傳遞給請(qǐng)求節(jié)點(diǎn)。如 果該鎖處于“管理”狀態(tài),則這意指擁有節(jié)點(diǎn)不再需要該鎖但仍持有它以供其他節(jié)點(diǎn)獲取該 鎖。在該情況中,通知擁有節(jié)點(diǎn)并將該鎖授予給請(qǐng)求節(jié)點(diǎn),并且相應(yīng)地更新鎖元數(shù)據(jù)。如果 鎖處于“鎖定”或“管理”狀態(tài),則在一個(gè)實(shí)施例中,可以使用租用超時(shí)(典型地以較高的毫 秒或秒為單位)值來(lái)釋放鎖。在正常操作中,擁有節(jié)點(diǎn)將更新心跳以延長(zhǎng)租用超時(shí)。然而, 如果擁有節(jié)點(diǎn)更新其心跳失敗并因而沒(méi)能延長(zhǎng)鎖租用(例如,由于SAN故障或節(jié)點(diǎn)故障), 則可以在經(jīng)過(guò)租用時(shí)間之后釋放該鎖。以下描述將詳細(xì)描述本段中描述的過(guò)程。在優(yōu)選實(shí)施例中,當(dāng)節(jié)點(diǎn)需要共享資源上的鎖時(shí),該節(jié)點(diǎn)檢查在該節(jié)點(diǎn)之中的本 地鎖元數(shù)據(jù)中的鎖的狀態(tài)。在其他實(shí)施例中,可以將本地鎖元數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)外。如果在 該節(jié)點(diǎn)的本地鎖元數(shù)據(jù)中找到鎖元數(shù)據(jù),并且鎖狀態(tài)指示該鎖正以“管理”模式被持有,則 該節(jié)點(diǎn)將本地鎖元數(shù)據(jù)和碟片上(即共享存儲(chǔ))鎖元數(shù)據(jù)存儲(chǔ)中的鎖狀態(tài)改變?yōu)椤俺钟小保?并且獲取該鎖而不觸發(fā)諸如SCSI保留過(guò)程的互斥原語(yǔ)。如果該節(jié)點(diǎn)的本地鎖元數(shù)據(jù)不包 含該鎖的鎖元數(shù)據(jù),并且碟片上元數(shù)據(jù)指示該鎖是空閑的,則該節(jié)點(diǎn)嘗試通過(guò)諸如SCSI保 留的互斥原語(yǔ)獲取該鎖。如果獲取該鎖的這種嘗試成功,則在該節(jié)點(diǎn)的本地鎖元數(shù)據(jù)中產(chǎn) 生具有鎖狀態(tài)為“持有”的鎖條目。如果另一節(jié)點(diǎn)在該節(jié)點(diǎn)之前成功獲取了該鎖,則該嘗試 將會(huì)失敗。如果碟片上鎖元數(shù)據(jù)指示該鎖由另一節(jié)點(diǎn)排他持有,則該節(jié)點(diǎn)對(duì)另一節(jié)點(diǎn)發(fā)送 消息以嘗試獲取該鎖。如果另一節(jié)點(diǎn)仍使用該鎖,則其可以通知該節(jié)點(diǎn)該鎖不是空閑的。如 果另一節(jié)點(diǎn)正以“管理”模式持有該鎖,則其可以將該鎖釋放給該節(jié)點(diǎn)。在該情況中,該節(jié)點(diǎn) 不執(zhí)行SCSI保留過(guò)程就獲取該鎖,并且更新碟片上和本地鎖元數(shù)據(jù)以指示該鎖的所有權(quán) 和狀態(tài)。在一個(gè)示例中,可能有第三節(jié)點(diǎn)也對(duì)另一節(jié)點(diǎn)做出同樣的請(qǐng)求,并成功獲取該鎖。 在該情況中,另一節(jié)點(diǎn)將通知該節(jié)點(diǎn)自己不再是該鎖的擁有者了。在另一節(jié)點(diǎn)未能對(duì)該節(jié) 點(diǎn)的請(qǐng)求成功響應(yīng)情況下,該節(jié)點(diǎn)首先檢查碟片上存儲(chǔ)以驗(yàn)證另一節(jié)點(diǎn)是否仍在心跳。在該情況中,節(jié)點(diǎn)在發(fā)起獲取該鎖的另一請(qǐng)求之前,等候選定的時(shí)間段。然而,如果另一節(jié)點(diǎn) 不響應(yīng)也不心跳,則該節(jié)點(diǎn)嘗試通過(guò)SCSI保留過(guò)程破解(break)該鎖。圖5圖示了由節(jié)點(diǎn)獲取鎖的過(guò)程400。在一個(gè)實(shí)施例中,節(jié)點(diǎn)維護(hù)自己擁有的所有 鎖的本地鎖元數(shù)據(jù)。在一個(gè)實(shí)施例中,在存儲(chǔ)器緩存中維護(hù)本地鎖元數(shù)據(jù)。在步驟402,節(jié) 點(diǎn)開(kāi)始獲取在共享資源上的鎖。在步驟404,檢查本地鎖元數(shù)據(jù)以確定正被獲取的鎖是否是 已由該節(jié)點(diǎn)擁有,或該節(jié)點(diǎn)是否已對(duì)相同的鎖做出了另一鎖獲取請(qǐng)求。在決定步驟406,確 定正被獲取的鎖的鎖狀態(tài)是否存在于本地鎖元數(shù)據(jù)中。如果否,則在步驟408,將鎖狀態(tài)設(shè) 置為“鎖請(qǐng)求”?;氐?jīng)Q定步驟406,如果是,則在決定步驟410,確定該鎖是否處于“管理” 狀態(tài)并且鎖租用還未超時(shí)。如果否,則在步驟414,將鎖狀態(tài)改變?yōu)椤版i請(qǐng)求”。在步驟416, 從心跳區(qū)讀取鎖信息。如果是(在決定步驟410),接著在步驟422,在鎖元數(shù)據(jù)的共享存儲(chǔ)中更新鎖狀 態(tài),并且將本地緩存中的鎖狀態(tài)改變?yōu)椤俺钟小辈⒎祷亍俺晒Α毕?。換言之,不經(jīng)過(guò)諸如 SCSI保留的互斥原語(yǔ)的過(guò)程,獲取該鎖。在決定步驟428,確定請(qǐng)求的鎖是否空閑,或者存 儲(chǔ)在鎖元數(shù)據(jù)中的擁有者UUID是否與請(qǐng)求節(jié)點(diǎn)的UUID相同,或者該鎖是否指向失效的心 跳區(qū)。如先前所描述的,鎖元數(shù)據(jù)包括用于鎖的心跳區(qū)的位置。如果該鎖是空閑的,則該鎖 不指向心跳區(qū)。否則,該鎖正由節(jié)點(diǎn)持有,該節(jié)點(diǎn)將定期更新心跳區(qū)以指示該節(jié)點(diǎn)是活著的 并連接到網(wǎng)絡(luò)。如果是,則在步驟412,如在圖9中進(jìn)一步描述地發(fā)起獲取該鎖的過(guò)程。如 果否,則在步驟420,如圖6中描述地將對(duì)該鎖釋放的請(qǐng)求發(fā)送給該鎖的當(dāng)前擁有者。圖6圖示了接收請(qǐng)求鎖釋放的過(guò)程450。在步驟452,從網(wǎng)絡(luò)中的另一節(jié)點(diǎn)接收鎖 釋放的請(qǐng)求。在步驟454,檢查當(dāng)前擁有或請(qǐng)求的鎖的本地鎖元數(shù)據(jù)。在決定步驟456,檢 查本地鎖元數(shù)據(jù)以確定本地鎖元數(shù)據(jù)中是否有鎖狀態(tài)條目。如果否,則在步驟458,通知請(qǐng) 求節(jié)點(diǎn)該節(jié)點(diǎn)不是鎖的當(dāng)前擁有者。在決定456,如果是,則該鎖或者已被擁有或者由接收 節(jié)點(diǎn)請(qǐng)求。在決定步驟460,如果鎖狀態(tài)指示該鎖正由接收節(jié)點(diǎn)“持有”,則在步驟462,發(fā)送 消息給請(qǐng)求節(jié)點(diǎn)以指示該鎖非空閑。如果否,且在決定步驟464,若鎖狀態(tài)是“管理”,那么 在步驟466,將鎖狀態(tài)條目從本地鎖元數(shù)據(jù)移除,并將碟片上鎖授予給請(qǐng)求節(jié)點(diǎn),接著在步 驟470,將“已獲取鎖”消息發(fā)送給請(qǐng)求節(jié)點(diǎn)以指示該鎖被授予給請(qǐng)求節(jié)點(diǎn)。如果在決定步 驟464,回答是否,則在步驟468,讀取碟片上鎖。在決定步驟472,如果該鎖已被授予,則在 步驟478,將鎖狀態(tài)設(shè)置為“持有”,接著在步驟480,將消息發(fā)送給請(qǐng)求節(jié)點(diǎn)以指示該鎖非 空閑。如果在決定步驟472,回答是否,則在步驟474,將消息發(fā)送給請(qǐng)求節(jié)點(diǎn)以指示正請(qǐng)求 釋放該鎖的節(jié)點(diǎn)不是該鎖的擁有者。圖7圖示了釋放鎖的過(guò)程500。當(dāng)節(jié)點(diǎn)需要釋放鎖時(shí),在步驟502,節(jié)點(diǎn)將本地鎖 元數(shù)據(jù)中的鎖狀態(tài)改變?yōu)椤肮芾怼?,并更新該鎖的時(shí)間戳。進(jìn)一步,在步驟504,節(jié)點(diǎn)將共享 存儲(chǔ)中的心跳區(qū)的鎖狀態(tài)改變?yōu)椤肮芾怼?,并用新的時(shí)間戳更新鎖元數(shù)據(jù)。應(yīng)當(dāng)注意,使用詞 “管理”僅是為了說(shuō)明目的??梢允褂萌魏纹渌线m的標(biāo)記或指示符來(lái)代替。對(duì)鎖狀態(tài)的該 更新確保其他請(qǐng)求該鎖的節(jié)點(diǎn)在嘗試獲取該鎖時(shí),將對(duì)該節(jié)點(diǎn)發(fā)送網(wǎng)絡(luò)消息,而不是使用 諸如SCSI保留的互斥原語(yǔ)。在鎖租用時(shí)間內(nèi),該節(jié)點(diǎn)繼續(xù)持有“管理”狀態(tài)的鎖。如果該 節(jié)點(diǎn)在租用時(shí)間內(nèi)請(qǐng)求鎖,則租用可以展期。一旦在該“管理”鎖上的租用期滿,則在步驟 506,從該節(jié)點(diǎn)中的本地鎖元數(shù)據(jù)中移除鎖狀態(tài),并且在步驟508,改變碟片上鎖狀態(tài)(共享 存儲(chǔ)中)以指示該鎖現(xiàn)在空閑。
11
圖8A圖示了對(duì)來(lái)自另一節(jié)點(diǎn)的“非擁有者”(見(jiàn)圖6,元素458)消息進(jìn)行處理的過(guò) 程550。在步驟552,響應(yīng)于節(jié)點(diǎn)的釋放鎖的請(qǐng)求,節(jié)點(diǎn)從另一節(jié)點(diǎn)接收“非擁有者”消息。 在步驟554,節(jié)點(diǎn)重新讀取該鎖以確定該鎖現(xiàn)在是否可用,因?yàn)樵诠?jié)點(diǎn)發(fā)送請(qǐng)求之前,該鎖 可能在此期間已被另一節(jié)點(diǎn)釋放。在決定步驟558,如果鎖狀態(tài)與上次讀取的不同,則在決 定步驟560,確定該鎖是否空閑。如果是,則控制移動(dòng)到步驟556以嘗試通過(guò)圖9描述的過(guò) 程來(lái)破解該鎖。如果否,則在步驟562,返回消息以指示該鎖非空閑?;氐?jīng)Q定步驟558,如 果是,在步驟556,嘗試通過(guò)圖9描述的過(guò)程來(lái)破解該鎖。在決定步驟564,如果破解該鎖的 嘗試成功,則在步驟566,本地緩存中的鎖狀態(tài)變?yōu)椤俺钟小?,并且返回“成功”消息。如果否?則在步驟562,返回消息以指示該鎖非空閑。圖8B圖示了節(jié)點(diǎn)處理“非空閑”消息的過(guò)程。當(dāng)節(jié)點(diǎn)向另一節(jié)點(diǎn)發(fā)送請(qǐng)求以請(qǐng)求 鎖時(shí),該節(jié)點(diǎn)在其本地緩存中產(chǎn)生已經(jīng)對(duì)特定鎖做出請(qǐng)求的條目。在步驟580,節(jié)點(diǎn)接收從 另一節(jié)點(diǎn)返回的“非空閑”消息。在步驟582,從本地鎖元數(shù)據(jù)移除鎖狀態(tài),并且在步驟584, 將“非空閑”消息發(fā)送給請(qǐng)求鎖的應(yīng)用或代碼。圖8C圖示了子系統(tǒng)處理“已獲取鎖”消息的過(guò)程。在步驟590,接收指示根據(jù)節(jié)點(diǎn) 的鎖請(qǐng)求已獲取鎖的消息。在步驟592,更新節(jié)點(diǎn)的本地鎖元數(shù)據(jù)以指示該鎖正由該節(jié)點(diǎn)持 有。在步驟594,將成功消息返回給請(qǐng)求該鎖的應(yīng)用或代碼。圖9圖示了嘗試破解鎖的過(guò)程600。在步驟602,在需要時(shí),嘗試破解鎖(例如,見(jiàn) 圖8A,元素556)。在步驟604,檢查共享存儲(chǔ)內(nèi)的心跳區(qū)和鎖元數(shù)據(jù)以識(shí)別該鎖的當(dāng)前狀 態(tài)。在決定步驟606,如果鎖元數(shù)據(jù)指示該鎖空閑,則在步驟608,通過(guò)諸如SCSI保留的互 斥原語(yǔ)來(lái)嘗試獲取該鎖。在獲取該鎖之后,如果需要?jiǎng)t重放文件系統(tǒng)或其他類型的日志以 保持?jǐn)?shù)據(jù)的完整性。如果否,則在決定步驟610,將存儲(chǔ)在鎖元數(shù)據(jù)中的鎖擁有者UUID與請(qǐng) 求節(jié)點(diǎn)的UUID進(jìn)行比較。如果UUID匹配,則在步驟616,將指示已獲取該鎖的消息發(fā)送給 請(qǐng)求該鎖的應(yīng)用或代碼。如果否,在步驟612,檢查當(dāng)前鎖模式?;氐?jīng)Q定步驟614,如果破解該鎖的嘗試成功,則在步驟616,將共享緩存更新為 “持有”,并發(fā)送指示已獲取該鎖的消息。如果破解該鎖的嘗試不成功,則在步驟614,發(fā)送指 示該鎖非空閑的消息。這種獲取該鎖的失敗可能是由于步驟606和608之間的事實(shí),即另 一節(jié)點(diǎn)可能獲取該鎖。在決定步驟612,確定當(dāng)前鎖模式是否是排他的。在一個(gè)實(shí)施例中,“排他”鎖模式 意指該鎖正由一個(gè)節(jié)點(diǎn)持有。如果是,在步驟622,再次讀取心跳和鎖元數(shù)據(jù)。在決定步驟 626,確定鎖狀態(tài)是否改變。如果否,在決定步驟632,確定是否已發(fā)生心跳超時(shí)。如果鎖的 擁有者在選定的時(shí)間段內(nèi)未能成功更新共享存儲(chǔ)中的心跳數(shù)據(jù),則心跳超時(shí)可能產(chǎn)生。如 果是,重復(fù)步驟608,其包括清除該鎖的當(dāng)前擁有者,該擁有者因?yàn)闆](méi)能心跳,所有失去其租 用。如果否,在步驟634,在選定的時(shí)間段內(nèi)使過(guò)程進(jìn)入休眠,然后重復(fù)步驟622。如果決定 步驟626的答案為是,則在決定步驟650,確定是否僅有心跳已改變。如果是,在步驟652, 移除鎖緩存條目,并返回“非空閑”消息。如果在決定步驟650是否,則在決定步驟654,確 定鎖狀態(tài)是否已變?yōu)椤肮芾怼?。如果是,則控制前進(jìn)到?jīng)Q定步驟624。如果否,則控制前進(jìn)到 決定步驟632。在決定步驟624,確定該鎖是否處于“管理”模式。在一個(gè)實(shí)施例中,如果先前獲取 該鎖的節(jié)點(diǎn)不再需要該鎖,但在其他節(jié)點(diǎn)請(qǐng)求該鎖之前一直持有該鎖,則該鎖可以是處于管理模式的。如果否,則在步驟628,發(fā)送指示該鎖非空閑的消息。如果是,在步驟630,讀 取鎖元數(shù)據(jù)。在決定步驟638,確定自從上次讀取,鎖狀態(tài)是否已改變。如果是,執(zhí)行步驟 640。在決定步驟640,將鎖擁有者UUID與本地UUID進(jìn)行比較。如果UUID匹配,則在步驟 642,將共享緩存更新為“持有”并發(fā)送“已獲得鎖”消息。如果UUID不匹配,則在步驟628, 將共享緩存更新為“持有”并發(fā)送“非空閑”消息。如果否,在決定步驟644,確定該鎖是否 超時(shí)。如果當(dāng)前擁有者沒(méi)能成功延長(zhǎng)鎖租用,則鎖可能超時(shí)。如果是,執(zhí)行步驟608。如果否,在步驟648,在選定的時(shí)間段內(nèi)使破解該鎖的過(guò)程進(jìn)入休眠,然后重復(fù)步驟630??紤]以上實(shí)施例,應(yīng)當(dāng)理解本發(fā)明可以采用各種計(jì)算機(jī)實(shí)施的涉及存儲(chǔ)在計(jì)算機(jī) 系統(tǒng)內(nèi)的數(shù)據(jù)的操作。這些操作是需要對(duì)物理量進(jìn)行物理操控的。任何此處描述的構(gòu)成本 發(fā)明一部分的操作是有用的機(jī)器操作。本發(fā)明還涉及用于執(zhí)行這些操作的設(shè)備或裝置。在 一個(gè)實(shí)施例中,該裝置可以是為了所需目的而專門構(gòu)建的(例如專用機(jī)器),或者該裝置可 以是由存儲(chǔ)在計(jì)算機(jī)中的計(jì)算機(jī)程序選擇性激活或配置的通用計(jì)算機(jī)。具體而言,各種通 用機(jī)器可以與根據(jù)本文的教導(dǎo)所編寫的計(jì)算機(jī)程序一起使用,或者更便利地是構(gòu)建更加專 用的裝置來(lái)執(zhí)行所需的操作。還可以將本發(fā)明的實(shí)施例定義為將數(shù)據(jù)從一種狀態(tài)變換為另一種狀態(tài)的機(jī)器。可 以將變換后的數(shù)據(jù)存儲(chǔ)在存儲(chǔ)中,然后由處理器操控。于是,處理器將數(shù)據(jù)從一個(gè)形態(tài)變換 為另一形態(tài)。進(jìn)一步,可以由一個(gè)或多個(gè)可以通過(guò)網(wǎng)絡(luò)互連的機(jī)器或處理器來(lái)處理本方法。 還可以虛擬化本機(jī)器,以將對(duì)存儲(chǔ)的物理訪問(wèn)和處理能力提供給一個(gè)或多個(gè)用戶、服務(wù)器 或客戶端。于是,可以將虛擬化的系統(tǒng)認(rèn)為是可以作為一個(gè)或多個(gè)通用機(jī)器操作或可以被 配置為專用機(jī)器的機(jī)器。每個(gè)機(jī)器或機(jī)器的虛擬表示可以將數(shù)據(jù)從一種狀態(tài)或形態(tài)變換為 另一種,并且還可以處理數(shù)據(jù)、將數(shù)據(jù)存儲(chǔ)在存儲(chǔ)中、顯示結(jié)果、或?qū)⒔Y(jié)果通信給其他機(jī)器。還可以將本發(fā)明實(shí)施為在計(jì)算機(jī)可讀介質(zhì)上的計(jì)算機(jī)可讀代碼。計(jì)算機(jī)可讀介 質(zhì)是可以存儲(chǔ)此后可以由計(jì)算機(jī)系統(tǒng)讀取的數(shù)據(jù)的任何數(shù)據(jù)存儲(chǔ)設(shè)備。計(jì)算機(jī)可讀介質(zhì) 的示例包括硬盤驅(qū)動(dòng)、網(wǎng)絡(luò)附加存儲(chǔ)(NAS)、只讀存儲(chǔ)器、隨機(jī)存取存儲(chǔ)器、CD-ROM、CD-R、 CD-RW、磁帶和其他光和非光數(shù)據(jù)存儲(chǔ)設(shè)備。計(jì)算機(jī)可讀介質(zhì)可以包括分布在聯(lián)網(wǎng)計(jì)算機(jī)系 統(tǒng)上的計(jì)算機(jī)可讀有形介質(zhì),使得可以以分布式方式存儲(chǔ)和執(zhí)行計(jì)算機(jī)可讀代碼。盡管以特定順序描述了本方法操作,但是應(yīng)當(dāng)理解,在操作之間可以執(zhí)行其他輔 助操作,或者可以調(diào)整操作以使得操作發(fā)生的時(shí)間略有不同,或者可以將操作分布在允許 處理操作在與處理相關(guān)聯(lián)的各種時(shí)間間隔上發(fā)生的系統(tǒng)中,只要重疊操作的處理是按期望 的方式來(lái)執(zhí)行的。盡管已經(jīng)為了理解上的清楚,在某些細(xì)節(jié)上描述了以上發(fā)明,但是很顯然,可以在 所附權(quán)利要求的范圍內(nèi)實(shí)踐特定變化和修改。因此,將本實(shí)施例認(rèn)為是說(shuō)明性而不是限制 性的,并且本發(fā)明不受限于本文給出的細(xì)節(jié),而是可以在所附權(quán)利要求的范圍和等效內(nèi)容 進(jìn)行修改。
權(quán)利要求
一種由節(jié)點(diǎn)獲取在多個(gè)互連節(jié)點(diǎn)的系統(tǒng)中的共享資源上的鎖的方法,所述方法包括(a)探查所述節(jié)點(diǎn)的本地鎖元數(shù)據(jù),以確定在所述本地鎖元數(shù)據(jù)中是否存在所述鎖的鎖元數(shù)據(jù),其中所述鎖元數(shù)據(jù)包括所述鎖的標(biāo)識(shí)和鎖狀態(tài);(b)如果在所述本地鎖元數(shù)據(jù)中不存在所述鎖元數(shù)據(jù),則執(zhí)行步驟(i)到(iv),(i)從共享存儲(chǔ)中讀取所述鎖的共享鎖元數(shù)據(jù),所述讀取包括識(shí)別所述鎖的當(dāng)前擁有者和所述鎖的當(dāng)前狀態(tài);(ii)探查所述鎖的所述當(dāng)前擁有者的心跳區(qū),以確定所述當(dāng)前擁有者是否活著,其中如果所述當(dāng)前擁有者不是活著的,則等待鎖租用時(shí)間流逝,然后獲取所述鎖,并更新所述共享鎖元數(shù)據(jù)以指示所述鎖現(xiàn)在由所述節(jié)點(diǎn)擁有;(iii)如果所述鎖的所述當(dāng)前狀態(tài)指示所述當(dāng)前擁有者正以排他模式持有所述鎖,則向所述節(jié)點(diǎn)返回消息以通知所述鎖不是空閑的;(iv)如果所述鎖的所述當(dāng)前狀態(tài)指示所述當(dāng)前擁有者正以管理模式持有所述鎖,則向所述當(dāng)前擁有者發(fā)送釋放所述鎖的請(qǐng)求,其中如果所述當(dāng)前擁有者還沒(méi)有將所述鎖釋放給另一請(qǐng)求節(jié)點(diǎn),則將所述鎖授予給所述節(jié)點(diǎn)而不在所述共享資源上執(zhí)行互斥原語(yǔ)操作,并且更新所述共享鎖元數(shù)據(jù)以指示新的鎖所有權(quán)和鎖狀態(tài);以及(c)如果在所述本地鎖元數(shù)據(jù)中存在所述節(jié)點(diǎn)的所述鎖元數(shù)據(jù),則探查在所述本地鎖元數(shù)據(jù)中的所述鎖的所述鎖狀態(tài),如果在所述本地鎖元數(shù)據(jù)中的所述鎖的所述鎖狀態(tài)指示所述鎖正以管理模式被擁有,則改變所述本地鎖元數(shù)據(jù)中的所述鎖的所述鎖狀態(tài)以指示所述節(jié)點(diǎn)對(duì)所述鎖的排他使用,并更新所述共享鎖元數(shù)據(jù)以指示所述鎖正以排他模式被所述節(jié)點(diǎn)擁有,其中所述管理模式意指所述鎖正由所述節(jié)點(diǎn)擁有,但是所述鎖未被所述節(jié)點(diǎn)使用。
2.如權(quán)利要求1所述的方法,其中等待所述鎖租用時(shí)間流逝包括在選定的時(shí)間間隔 內(nèi),探查所述鎖的所述當(dāng)前擁有者的所述心跳區(qū)以確定所述當(dāng)前擁有者是否活著,其中所 述選定的時(shí)間間隔是小于所述鎖租用時(shí)間的時(shí)間段。
3.如權(quán)利要求1所述的方法,其中如果所述節(jié)點(diǎn)的所述本地鎖元數(shù)據(jù)未指示所述鎖正 由所述節(jié)點(diǎn)擁有,則更新所述本地鎖元數(shù)據(jù)以指示所述鎖正被請(qǐng)求。
4.如權(quán)利要求1所述的方法,其中獲取所述鎖包括更新所述本地鎖元數(shù)據(jù)以包括所 述節(jié)點(diǎn)擁有所述鎖的信息,并且更新所述共享存儲(chǔ)中的所述鎖元數(shù)據(jù)以添加指向所述心跳 區(qū)的指針。
5.如權(quán)利要求4所述的方法,其中更新所述鎖元數(shù)據(jù)包括更新鎖時(shí)間戳。
6.如權(quán)利要求4所述的方法,其中更新所述鎖元數(shù)據(jù)包括更新所述鎖的狀態(tài)。
7.如權(quán)利要求1所述的方法,其中識(shí)別所述鎖租用是否期滿的過(guò)程包括在存儲(chǔ)中維護(hù)至少一個(gè)心跳數(shù)據(jù)結(jié)構(gòu),所述心跳數(shù)據(jù)結(jié)構(gòu)包括擁有者數(shù)據(jù),識(shí)別所述心跳的當(dāng)前擁有者;狀態(tài)數(shù)據(jù),識(shí)別所述心跳的當(dāng)前狀態(tài);脈沖數(shù)據(jù),識(shí)別所述心跳的上次更新的時(shí)間;以及如果所述脈沖數(shù)據(jù)在選定的時(shí)間段內(nèi)沒(méi)有改變,則允許所述心跳被修改。
8.如權(quán)利要求7所述的方法,所述心跳數(shù)據(jù)結(jié)構(gòu)進(jìn)一步包括識(shí)別所述心跳的版本的產(chǎn)生數(shù)據(jù)。
9.如權(quán)利要求8所述的方法,進(jìn)一步包括維護(hù)與多個(gè)共享資源中的一個(gè)相關(guān)聯(lián)的鎖數(shù)據(jù)結(jié)構(gòu),所述鎖數(shù)據(jù)結(jié)構(gòu)包括識(shí)別心跳的 數(shù)據(jù)。
10.如權(quán)利要求9所述的方法,其中識(shí)別所述心跳的所述數(shù)據(jù)包括識(shí)別所述心跳的當(dāng) 前擁有者的擁有者數(shù)據(jù)和識(shí)別所述心跳的位置的地址數(shù)據(jù)中的一個(gè)。
11.一種在第一節(jié)點(diǎn)從第二節(jié)點(diǎn)接收釋放鎖的請(qǐng)求的方法,所述方法包括 檢查所述第一節(jié)點(diǎn)的本地鎖元數(shù)據(jù);如果所述本地鎖元數(shù)據(jù)包括指示所述鎖正以排他模式被擁有的信息,則向所述第二節(jié) 點(diǎn)發(fā)送指示所述鎖正被使用的消息;如果所述本地鎖元數(shù)據(jù)包括指示所述鎖正由所述第一節(jié)點(diǎn)持有但是沒(méi)有被使用的信 息,則將所述鎖的信息從所述本地鎖元數(shù)據(jù)移除,并且更新對(duì)應(yīng)于所述鎖的心跳區(qū)中的信 息,以將所述鎖授予給所述第二節(jié)點(diǎn);以及向所述第二節(jié)點(diǎn)返回指示所述鎖空閑的消息, 其中所述釋放請(qǐng)求是經(jīng)由IP網(wǎng)絡(luò)接收的。
12.如權(quán)利要求11所述的方法,其中,如果所述本地鎖元數(shù)據(jù)不包括關(guān)于所述鎖的信 息,則向所述第二節(jié)點(diǎn)返回指示所述第一節(jié)點(diǎn)不是所述鎖的擁有者的消息。
13.如權(quán)利要求12所述的方法,其中一旦接收到所述消息,所述第二節(jié)點(diǎn)再次重新讀 取所述心跳區(qū)中的所述鎖元數(shù)據(jù),以確定所述鎖的狀態(tài)是否有任何改變。
14.如權(quán)利要求13所述的方法,其中如果在第一次讀取和所述重新讀取之間所述鎖的 狀態(tài)沒(méi)有變化,則嘗試破解所述鎖。
15.如權(quán)利要求13所述的方法,其中如果在第一次讀取和所述重新讀取之間所述鎖的 狀態(tài)已變化,則確定所述鎖是否是空閑的。
16.如權(quán)利要求11所述的方法,其中所述心跳區(qū)包括至少一個(gè)心跳數(shù)據(jù)結(jié)構(gòu),所述心 跳數(shù)據(jù)結(jié)構(gòu)包括擁有者數(shù)據(jù),識(shí)別所述心跳的當(dāng)前擁有者; 狀態(tài)數(shù)據(jù),識(shí)別所述心跳的當(dāng)前狀態(tài); 脈沖數(shù)據(jù),識(shí)別所述心跳的上次更新的時(shí)間。
17.如權(quán)利要求16所述的方法,進(jìn)一步包括如果所述脈沖數(shù)據(jù)在選定的時(shí)間段內(nèi)沒(méi)有改變,則允許所述心跳被修改。
18.—種在網(wǎng)絡(luò)上的共享資源上管理鎖的方法,所述方法包括維護(hù)用于節(jié)點(diǎn)的心跳區(qū),其中所述共享資源可由所述節(jié)點(diǎn)訪問(wèn),并且在所述網(wǎng)絡(luò)上的 共享存儲(chǔ)上維護(hù)所述心跳區(qū),所述心跳區(qū)包括用來(lái)存儲(chǔ)所述節(jié)點(diǎn)的心跳的空間和用來(lái)存儲(chǔ) 所述鎖的鎖元數(shù)據(jù)的空間;在所述節(jié)點(diǎn)中維護(hù)本地鎖元數(shù)據(jù),以在所述鎖由所述節(jié)點(diǎn)擁有時(shí)存儲(chǔ)所述鎖的狀態(tài);以及其中,當(dāng)所述節(jié)點(diǎn)嘗試獲取所述鎖時(shí),在所述本地鎖元數(shù)據(jù)中進(jìn)行檢查以確定所述鎖 是否已由所述節(jié)點(diǎn)所擁有,如果所述鎖不由所述節(jié)點(diǎn)所擁有,則探查所述共享存儲(chǔ)中的所 述鎖元數(shù)據(jù)以檢索所述鎖的狀態(tài)和所述鎖的當(dāng)前擁有者,如果所述狀態(tài)指示所述鎖正由另一節(jié)點(diǎn)以管理模式持有,則請(qǐng)求所述另一節(jié)點(diǎn)將所述鎖授予給所述節(jié)點(diǎn),其中將所述鎖授予給所述節(jié)點(diǎn)而不使用互斥原語(yǔ),其中所述管理模式意指所述鎖正由所述節(jié)點(diǎn)擁有,但是所述鎖未被所述節(jié)點(diǎn)使用。
19.如權(quán)利要求18所述的方法,其中如果所述鎖已由所述節(jié)點(diǎn)擁有,則更新所述鎖元數(shù)據(jù)中的所述狀態(tài)和所述節(jié)點(diǎn)中的所述本地鎖元數(shù)據(jù),以指示所述鎖正由所述節(jié)點(diǎn)排他持 有。
20.如權(quán)利要求19所述的方法,其中當(dāng)所述節(jié)點(diǎn)不再需要所述鎖時(shí),更新在所述鎖元數(shù)據(jù)和所述本地鎖元數(shù)據(jù)中的所述鎖的狀態(tài),以指示所述鎖正由所述節(jié)點(diǎn)以所述管理模式 擁有。
全文摘要
本發(fā)明涉及使用網(wǎng)絡(luò)和基于碟片上的方案的混合鎖定。公開(kāi)了一種由節(jié)點(diǎn)獲取在多個(gè)互連節(jié)點(diǎn)的系統(tǒng)中的共享資源上的鎖的方法。競(jìng)爭(zhēng)共享資源上的鎖的每個(gè)節(jié)點(diǎn)維護(hù)節(jié)點(diǎn)當(dāng)前擁有的鎖的列表。在共享存儲(chǔ)上維護(hù)鎖元數(shù)據(jù),該共享存儲(chǔ)可以被競(jìng)爭(zhēng)共享資源上的鎖的所有節(jié)點(diǎn)訪問(wèn)。在對(duì)應(yīng)于每個(gè)節(jié)點(diǎn)的共享資源上維護(hù)心跳區(qū),這樣節(jié)點(diǎn)可以注冊(cè)其活性。在共享存儲(chǔ)的鎖元數(shù)據(jù)中維護(hù)鎖狀態(tài)。鎖狀態(tài)可以指示鎖被排他持有、鎖空閑或鎖處于管理模式。如果鎖是以管理模式被持有的,則可以不使用諸如SCSI保留的互斥原語(yǔ),將鎖的所有權(quán)轉(zhuǎn)移給另一節(jié)點(diǎn)。
文檔編號(hào)H04L29/08GK101800763SQ20091025409
公開(kāi)日2010年8月11日 申請(qǐng)日期2009年12月18日 優(yōu)先權(quán)日2009年2月5日
發(fā)明者丹尼爾·J·斯凱爾斯, 李金遠(yuǎn), 穆拉利·維萊阿努爾, 馬揚(yáng)克·拉瓦特 申請(qǐng)人:威睿公司