專(zhuān)利名稱(chēng):一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)集群技術(shù)領(lǐng)域,適用于高可用性集群(High-avaiIabiIityclusters),尤其適用于一種基于磁盤(pán)服務(wù)鎖的高可用性系統(tǒng)的裂腦預(yù)防的方法和裝置。
背景技術(shù):
隨著通信網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,電信、金融、電子政務(wù)等關(guān)鍵領(lǐng)域?qū)Ψ?wù)器可用性的要求越來(lái)越高,高可用集群系統(tǒng)日益被越來(lái)越多的用戶(hù)接受和廣泛使用。為了避免因服務(wù)器或交換機(jī)的故障而使業(yè)務(wù)停止造成的巨大的經(jīng)濟(jì)損失,通過(guò)高可用性(HighAvailability,HA)系統(tǒng)可以大大減少了業(yè)務(wù)系統(tǒng)的常規(guī)維護(hù)和業(yè)務(wù)因軟件、硬件等故障影響的停止時(shí)間。當(dāng)前高可用集群系統(tǒng)主要通過(guò)網(wǎng)絡(luò)或串口等連接作為集群通信的私有心跳網(wǎng)絡(luò),負(fù)責(zé)交換同步節(jié)點(diǎn)間的信息,監(jiān)測(cè)集群中各個(gè)節(jié)點(diǎn)的運(yùn)行情況。一般來(lái)說(shuō),集群有工作機(jī)和備份機(jī),當(dāng)備份機(jī)不能在一定時(shí)間內(nèi)收到工作機(jī)的心跳信息,備份機(jī)則認(rèn)為工作機(jī)發(fā)生了故障,接管了工作機(jī)上的業(yè)務(wù)并繼續(xù)對(duì)外提供服務(wù)。高可用集群通過(guò)上述過(guò)程提高了業(yè)務(wù)的可用性,但是當(dāng)心跳網(wǎng)絡(luò)故障時(shí),可能會(huì)導(dǎo)致工作機(jī)和備份機(jī)同時(shí)提供服務(wù),會(huì)出現(xiàn)裂腦(Split Brain, SB),導(dǎo)致數(shù)據(jù)損壞。在實(shí)際的實(shí)施案例中,發(fā)明人發(fā)現(xiàn)網(wǎng)絡(luò)容易受到網(wǎng)卡、交換機(jī)、心跳線路以及驅(qū)動(dòng)等的影響。尤其在長(zhǎng)時(shí)間運(yùn)作的業(yè)務(wù)中,網(wǎng)卡故障、交換機(jī)掉電、網(wǎng)線被拔或驅(qū)動(dòng)異常也時(shí)有發(fā)生,嚴(yán)重的時(shí)候會(huì)出現(xiàn)集群心跳網(wǎng)絡(luò)全部斷開(kāi),集群被分為多個(gè)。這時(shí)非常容易出現(xiàn)同一個(gè)服務(wù)同時(shí)在兩節(jié)點(diǎn)上運(yùn)行,導(dǎo)致客戶(hù)的數(shù)據(jù)丟失或被破壞,這是高可用集群普遍存在的一個(gè)安全隱患問(wèn)題。為了保障用戶(hù)的數(shù)據(jù)不受破壞和服務(wù)可持續(xù)性,在集群心跳網(wǎng)絡(luò)斷開(kāi)或異常時(shí),防止集群裂腦是必不可少的。目前市場(chǎng)中為了解決此問(wèn)題,通用做法都是采用將節(jié)點(diǎn)重啟系統(tǒng)或?qū)⒐蚕泶鎯?chǔ)對(duì)其他節(jié)點(diǎn)進(jìn)行隔離。但發(fā)明人發(fā)現(xiàn)這些方法并不能滿足市場(chǎng)的要求,在實(shí)際的實(shí)施當(dāng)中,備用節(jié)點(diǎn)上同樣運(yùn)行著其他重要的業(yè)務(wù),客戶(hù)不允許操作系統(tǒng)重啟或整一塊共享存儲(chǔ)被隔離。在解決集群防止裂腦的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有的技術(shù)存在如下的問(wèn)題:集群心跳網(wǎng)絡(luò)中斷時(shí),無(wú)法區(qū)別是心跳網(wǎng)絡(luò)故障,還是節(jié)點(diǎn)死機(jī),容易做出錯(cuò)誤的判斷,從而產(chǎn)生裂腦;在上述判斷中,能夠檢測(cè)到工作機(jī)仍然活著,但無(wú)法確定服務(wù)是否停止成功,存在短暫裂腦的可能,造成數(shù)據(jù)損壞;在上述判斷中,如果判斷節(jié)點(diǎn)死機(jī)了,存在多個(gè)節(jié)點(diǎn)同時(shí)啟動(dòng)服務(wù),產(chǎn)生裂腦,造成數(shù)據(jù)被破壞的可能。
發(fā)明內(nèi)容
本發(fā)明實(shí)例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法和裝置,在不需要將節(jié)點(diǎn)系統(tǒng)重啟或共享存儲(chǔ)隔離的情況下,仍然能夠在集群心跳網(wǎng)絡(luò)中斷或異常時(shí),實(shí)現(xiàn)防止集群裂腦發(fā)生,提高集群的高可用性。
一方面,提供了一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,包括:當(dāng)心跳網(wǎng)絡(luò)中斷時(shí),能夠迅速區(qū)別是心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)的情況,避免做出誤判,防止裂腦;如果是心跳網(wǎng)絡(luò)故障,持續(xù)檢測(cè)一段時(shí)間后,該服務(wù)鎖沒(méi)有釋放,其他節(jié)點(diǎn)則不會(huì)再啟動(dòng)服務(wù),避免工作機(jī)節(jié)點(diǎn)服務(wù)沒(méi)有停止完成,備份機(jī)已啟動(dòng)而造成短暫的裂腦問(wèn)題;如果是工作機(jī)死機(jī),多個(gè)節(jié)點(diǎn)同時(shí)去搶占服務(wù)鎖,只有唯一搶占成功的節(jié)點(diǎn)才有啟動(dòng)服務(wù)的權(quán)限,從而防止裂腦發(fā)生。另一方面,提供了一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,包括:節(jié)點(diǎn)檢測(cè)判斷模塊,用于檢測(cè)所有節(jié)點(diǎn)的心跳,判斷出所有節(jié)點(diǎn)的當(dāng)前的狀態(tài)。當(dāng)心跳網(wǎng)絡(luò)中斷時(shí),判別心跳網(wǎng)絡(luò)故障與工作節(jié)點(diǎn)死機(jī)的情況。磁盤(pán)服務(wù)鎖查詢(xún)模塊,用于當(dāng)心跳網(wǎng)絡(luò)故障時(shí),其他節(jié)點(diǎn)可以通過(guò)查詢(xún)磁盤(pán)服務(wù)鎖是否釋放或已失效而做出對(duì)應(yīng)策略,避免發(fā)生工作機(jī)的服務(wù)沒(méi)有停止成功,備份機(jī)已啟動(dòng)造成的短暫裂腦發(fā)生。搶奪磁盤(pán)服務(wù)鎖模塊,用于在工作節(jié)點(diǎn)死機(jī)或因心跳網(wǎng)絡(luò)故障后主機(jī)釋放服務(wù)鎖的情況下,多個(gè)節(jié)點(diǎn)同時(shí)去搶占服務(wù)鎖,只有唯一搶占成功的節(jié)點(diǎn)才可以啟動(dòng)服務(wù),防止裂腦發(fā)生。本發(fā)明實(shí)施提供了上述一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法和裝置,在心跳網(wǎng)絡(luò)中斷時(shí),有效判別心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)的情況;通過(guò)查詢(xún)磁盤(pán)服務(wù)鎖可以正確獲取服務(wù)是否已停止成功,從而避免了存在的短暫裂腦問(wèn)題;在多個(gè)節(jié)點(diǎn)通過(guò)搶占服務(wù)鎖,只有唯一搶占成功的節(jié)點(diǎn)才可以啟動(dòng)服務(wù),防止裂腦發(fā)生。本發(fā)明實(shí)施提供的技術(shù)解決方案成功解決了目前在不需要將系統(tǒng)重啟或共享存儲(chǔ)隔離的情況下,集群在心跳網(wǎng)絡(luò)中斷或異常時(shí),難以克服和避免的裂腦問(wèn)題。
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將用實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹。圖1為本發(fā)明提供的高可用雙節(jié)點(diǎn)帶磁盤(pán)服務(wù)鎖的集群系統(tǒng)拓?fù)鋱D;圖2為本發(fā)明提供的磁盤(pán)服務(wù)鎖內(nèi)部結(jié)構(gòu)圖;圖3為本發(fā)明提供的高可用多節(jié)點(diǎn)集群系統(tǒng)拓?fù)鋱D;圖4為本發(fā)明實(shí)施例一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法流程圖;圖5為本發(fā)明實(shí)施例一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法中情景之一的流程圖;圖6為本發(fā)明實(shí)施例一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法中情景之二的流程圖;圖7為本發(fā)明實(shí)施例一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法中情景之三的流程圖;圖8為本發(fā)明實(shí)施例一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法中情景之四的流程圖;圖9為本發(fā)明實(shí)施例二提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法流程圖;圖10為本發(fā)明實(shí)施例三提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置示意圖一;
圖11為本發(fā)明實(shí)施例三提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置示意圖二 ;
具體實(shí)施例方式下面將結(jié)合附圖和實(shí)施例對(duì)本發(fā)明進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他的實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。為了解決在集群心跳網(wǎng)絡(luò)中斷時(shí),因不能有效判斷其他節(jié)點(diǎn)及其運(yùn)行服務(wù)狀態(tài)而容易做出錯(cuò)誤的策略,進(jìn)而產(chǎn)生裂腦,破壞數(shù)據(jù)的問(wèn)題。本發(fā)明實(shí)施例提供了一種基于磁盤(pán)服務(wù)鎖,在不需要將系統(tǒng)重啟或存儲(chǔ)隔離的情況下,仍然有效地防裂腦的方法和裝置。如圖1所示,為有代表性的雙機(jī)高可用帶磁盤(pán)服務(wù)鎖的集群系統(tǒng)拓?fù)鋱D,系統(tǒng)有兩臺(tái)節(jié)點(diǎn),服務(wù)器節(jié)點(diǎn)A和B,業(yè)務(wù)通過(guò)公有網(wǎng)絡(luò)對(duì)外提供服務(wù),節(jié)點(diǎn)間通過(guò)私有網(wǎng)絡(luò)進(jìn)行交換節(jié)點(diǎn)信息,監(jiān)控節(jié)點(diǎn)上的服務(wù)運(yùn)行狀態(tài),其中私有網(wǎng)絡(luò)一般是兩條或以上的直連網(wǎng)線或串口線。節(jié)點(diǎn)A定時(shí)將極小量的數(shù)據(jù)寫(xiě)磁盤(pán)分區(qū)中,同時(shí)由節(jié)點(diǎn)B讀取,同樣的,節(jié)點(diǎn)B也如此,本發(fā)明裝置通過(guò)此原理檢測(cè)節(jié)點(diǎn)的狀態(tài)。而集群中的每一個(gè)服務(wù)在磁盤(pán)分區(qū)中有對(duì)應(yīng)的一把服務(wù)鎖,節(jié)點(diǎn)在啟動(dòng)服務(wù)前先搶到該服務(wù)鎖,節(jié)點(diǎn)在停止服務(wù)后釋放此服務(wù)鎖。當(dāng)節(jié)點(diǎn)持續(xù)一個(gè)時(shí)間常量,沒(méi)有更新心跳,對(duì)應(yīng)的節(jié)點(diǎn)所占用的服務(wù)鎖將失效。運(yùn)行在兩臺(tái)服務(wù)器中的集群軟件包含本發(fā)明的裝置。如圖2所示,為雙機(jī)高可用帶磁盤(pán)服務(wù)鎖的集群系統(tǒng)對(duì)應(yīng)的磁盤(pán)服務(wù)鎖的結(jié)構(gòu)圖,包括內(nèi)容有分區(qū)唯一的分區(qū)標(biāo)識(shí)、集群的節(jié)點(diǎn)和服務(wù)信息、服務(wù)鎖以及節(jié)點(diǎn)信息等。如圖3所示,高可用多節(jié)點(diǎn)集群系統(tǒng)拓?fù)鋱D,在多節(jié)點(diǎn)高可用帶磁盤(pán)服務(wù)鎖的集群系統(tǒng)中,與雙機(jī)系統(tǒng)類(lèi)似地,各個(gè)節(jié)點(diǎn)分別定時(shí)將極小量的數(shù)據(jù)寫(xiě)到同一磁盤(pán)分區(qū)中的對(duì)應(yīng)的區(qū)域,同時(shí),讀取其他所有節(jié)點(diǎn)寫(xiě)入的數(shù)據(jù),各個(gè)節(jié)點(diǎn)根據(jù)讀取的數(shù)據(jù)自動(dòng)生成一份一致的節(jié)點(diǎn)狀態(tài)列表。而集群中的每一個(gè)服務(wù)在磁盤(pán)分區(qū)中有對(duì)應(yīng)的一把服務(wù)鎖,節(jié)點(diǎn)在啟動(dòng)服務(wù)前先搶到該服務(wù)鎖,節(jié)點(diǎn)在停止服務(wù)后釋放此服務(wù)鎖。當(dāng)節(jié)點(diǎn)持續(xù)一個(gè)時(shí)間常量,沒(méi)有更新心跳,對(duì)應(yīng)的節(jié)點(diǎn)所占用的服務(wù)鎖將失效。當(dāng)工作節(jié)點(diǎn)死機(jī)或服務(wù)停止后,同一個(gè)服務(wù)域其他的節(jié)點(diǎn)都可以通過(guò)搶奪服務(wù)鎖而接管服務(wù)。而運(yùn)行在各個(gè)節(jié)點(diǎn)的服務(wù)器中的集群軟件包含本發(fā)明的裝置。以下的描述的實(shí)施例內(nèi)容中,同時(shí)涵蓋了雙機(jī)和多節(jié)點(diǎn)的高可用性系統(tǒng)。如圖4所示,本發(fā)明實(shí)施一提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,包括:步驟401,當(dāng)集群心跳網(wǎng)絡(luò)中斷時(shí),區(qū)別是心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)。在本實(shí)施例中,當(dāng)集群心跳網(wǎng)絡(luò)中斷時(shí),區(qū)別是心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)的過(guò)程包括:檢測(cè)心跳斷開(kāi)的節(jié)點(diǎn)在磁盤(pán)的信息在最近一個(gè)時(shí)間常量t內(nèi)是否有更新;根據(jù)更新的時(shí)間判斷心跳斷開(kāi)的節(jié)點(diǎn)是否在線,從而區(qū)別心跳網(wǎng)絡(luò)中斷的原因是心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)。其中檢測(cè)的時(shí)間常量t略小于接收到最后一個(gè)網(wǎng)絡(luò)心跳到達(dá)到判定心跳網(wǎng)絡(luò)中斷的時(shí)間常量T,這樣當(dāng)時(shí)間常量t內(nèi)的磁盤(pán)信息都沒(méi)有更新,就可以有效力說(shuō)明該節(jié)點(diǎn)網(wǎng)絡(luò)與存儲(chǔ)同時(shí)是崩潰了,我們可以認(rèn)定。最為關(guān)鍵的是存儲(chǔ)與系統(tǒng)斷開(kāi),應(yīng)用無(wú)法寫(xiě)入數(shù)據(jù),不會(huì)對(duì)數(shù)據(jù)造成影響。一般來(lái)說(shuō),時(shí)間常量t越長(zhǎng)越好,但這與高可用要求的故障時(shí)間短相悖,所以常量t 一般略小于時(shí)間常量T即可;如果在時(shí)間常量t內(nèi)的磁盤(pán)信息仍然正常更新,我們可以證明該節(jié)點(diǎn)是由于集群私有網(wǎng)絡(luò)故障而導(dǎo)致了該節(jié)點(diǎn)的心跳全部斷開(kāi)的。在本實(shí)施例中,如果采用的通過(guò)公有網(wǎng)絡(luò)PING心跳斷開(kāi)節(jié)點(diǎn)的IP來(lái)判斷節(jié)點(diǎn)的狀態(tài),在系統(tǒng)不允許PING(即系統(tǒng)不會(huì)回應(yīng)icmp的請(qǐng)求包)、交換機(jī)端口損壞、網(wǎng)絡(luò)風(fēng)暴等等情況下,都不能有效地判斷節(jié)點(diǎn)的狀態(tài),存在很大的安全風(fēng)險(xiǎn)隱患。發(fā)明人通過(guò)磁盤(pán)讀寫(xiě)信息可以更準(zhǔn)確地檢測(cè)節(jié)點(diǎn)的狀態(tài),并且檢測(cè)時(shí)間相對(duì)較長(zhǎng)且不影響業(yè)務(wù)的切換時(shí)間,這是其他通過(guò)網(wǎng)絡(luò)檢測(cè)節(jié)點(diǎn)狀態(tài)的方法無(wú)法做到的。在本實(shí)施例中,值得注意的是上述中的磁盤(pán)信息,并不是有關(guān)于集群的信息,而只是一個(gè)不會(huì)回卷的時(shí)間戳。因?yàn)榧旱男畔⒘亢艽?,?duì)磁盤(pán)的IO產(chǎn)生比較大的影響。而本發(fā)明只需要該時(shí)間戳的更新來(lái)判別出節(jié)點(diǎn)的狀態(tài)的而非集群和服務(wù)的狀態(tài)。所以本發(fā)明中使用的數(shù)據(jù)量極少,并非集群的心跳。在本實(shí)施例中,如果通過(guò)步驟401判斷出心跳斷開(kāi)的節(jié)點(diǎn)是死機(jī),就可以由集群其他備份工作節(jié)點(diǎn)進(jìn)入步驟403搶鎖,嘗試去接受服務(wù),如圖5所示;如果通過(guò)步驟401判斷出心跳斷開(kāi)的節(jié)點(diǎn)是網(wǎng)絡(luò)故障,則集群其他備份工作節(jié)點(diǎn)進(jìn)入了步驟402進(jìn)行查詢(xún)服務(wù)鎖是否已釋放,進(jìn)而下一步操作。步驟402,在節(jié)點(diǎn)心跳全斷了,但節(jié)點(diǎn)仍然在線的情況下,檢測(cè)在一個(gè)時(shí)間常量S內(nèi)該節(jié)點(diǎn)占用的磁盤(pán)服務(wù)鎖是否已釋放。在本實(shí)施例中,通過(guò)步驟401判斷出心跳斷開(kāi)的節(jié)點(diǎn)是網(wǎng)絡(luò)故障,此時(shí)存在很大的可能性是心跳斷開(kāi)節(jié)點(diǎn)的工作公有網(wǎng)絡(luò)發(fā)生異常,會(huì)導(dǎo)致該節(jié)點(diǎn)上的服務(wù)停止。一般來(lái)說(shuō),節(jié)點(diǎn)的工作公有網(wǎng)絡(luò)出現(xiàn)了故障都將服務(wù)轉(zhuǎn)移,而服務(wù)停止的時(shí)間一般比上述判別節(jié)點(diǎn)心跳死的時(shí)間常量要長(zhǎng),因此,很容易出現(xiàn)一邊還在停止服務(wù),一邊已在啟動(dòng)服務(wù),產(chǎn)生了裂腦,短暫性的數(shù)據(jù)受損,磁盤(pán)陣列出現(xiàn)只讀(read-only,R0)。對(duì)于多節(jié)點(diǎn)的集群更為容易出現(xiàn)這類(lèi)問(wèn)題。正確的做法,只有通過(guò)心跳斷開(kāi)的節(jié)點(diǎn)服務(wù)停止完成后,才可以啟動(dòng)服務(wù),并且只能有一個(gè)節(jié)點(diǎn)啟動(dòng)。但心跳斷開(kāi)了,節(jié)點(diǎn)將服務(wù)停止完成后仍然不能告知其他節(jié)點(diǎn)。但通過(guò)磁盤(pán)服務(wù)鎖就可以解決這一難以克服的問(wèn)題,當(dāng)故障節(jié)點(diǎn)將服務(wù)停止完成后,就會(huì)釋放磁盤(pán)服務(wù)鎖。其他節(jié)點(diǎn)就可以檢測(cè)到,從而可以獲知服務(wù)已停止成功。備份節(jié)點(diǎn)可以通過(guò)磁盤(pán)服務(wù)鎖安全可靠地接管服務(wù)。在本實(shí)施例中,檢測(cè)的時(shí)間常量S為兩倍的服務(wù)停止超時(shí)時(shí)間,如果在一個(gè)時(shí)間常量S內(nèi)心跳斷開(kāi)節(jié)點(diǎn)占用的磁盤(pán)服務(wù)鎖仍然沒(méi)有釋放,可能存在兩種情況,一是心跳斷開(kāi)的節(jié)點(diǎn)上的服務(wù)正常運(yùn)行,二是該服務(wù)無(wú)法停止,服務(wù)不可轉(zhuǎn)移。對(duì)于這兩種情況,備份節(jié)點(diǎn)都不需要做出處理,并放棄接管服務(wù)。在本實(shí)施例中,如果通過(guò)步驟402在一個(gè)時(shí)間常量?jī)?nèi)心跳斷開(kāi)節(jié)點(diǎn)占用的磁盤(pán)服務(wù)鎖已釋放了,則其他備份節(jié)點(diǎn)可以進(jìn)入步驟403進(jìn)行搶鎖,如圖6和圖7所示;如果一個(gè)時(shí)間常量?jī)?nèi)心跳斷開(kāi)節(jié)點(diǎn)占用的磁盤(pán)服務(wù)鎖沒(méi)有釋放,則其他備份節(jié)點(diǎn)放棄接管服務(wù),如圖8所示。步驟403,在心跳斷開(kāi)節(jié)點(diǎn)死機(jī)或其占用的服務(wù)鎖已釋放的情況下,進(jìn)行搶奪磁盤(pán)服務(wù)鎖。在本實(shí)施例中,通過(guò)步驟401和步驟402判別允許搶奪磁盤(pán)服務(wù)鎖,但只有唯一節(jié)點(diǎn)會(huì)搶奪服務(wù)鎖成功,并且搶奪服務(wù)鎖成功的節(jié)點(diǎn)才有啟動(dòng)該服務(wù)的權(quán)限。對(duì)于多節(jié)點(diǎn),只有搶奪服務(wù)鎖的機(jī)制才能保證只有一個(gè)節(jié)點(diǎn)能啟動(dòng)服務(wù),防止裂腦。搶奪磁盤(pán)服務(wù)鎖的機(jī)制包括:在加鎖之前,各個(gè)節(jié)點(diǎn)都要按順序去搶奪磁盤(pán)分區(qū)中的三個(gè)搶占點(diǎn),如果搶占點(diǎn)I沒(méi)有節(jié)點(diǎn)先占了,則繼續(xù)搶奪搶占點(diǎn)2,搶占點(diǎn)3 ;如果搶占點(diǎn)I被占用了,則要休眠ls,再去搶奪搶占法2,搶占點(diǎn)2已被先占了,則搶奪失??;如果則前兩個(gè)中成功搶奪一個(gè)或以上的才能搶奪搶占點(diǎn)3,搶奪搶占點(diǎn)2失敗的同樣需要休眠2s ;如果搶占點(diǎn)3已被占,則搶奪服務(wù)鎖失敗,至少三個(gè)搶占點(diǎn)中要獲取兩個(gè)才能勝出。勝出的節(jié)點(diǎn)才有權(quán)對(duì)磁盤(pán)服務(wù)鎖進(jìn)行加鎖,并還原各個(gè)搶占點(diǎn)。通過(guò)多數(shù)搶奪,延時(shí)的優(yōu)勝劣汰的算法成功地解決多節(jié)點(diǎn)共同競(jìng)爭(zhēng)的問(wèn)題。本實(shí)施例中,通過(guò)多次搶奪,延時(shí)的優(yōu)勝劣汰的機(jī)制,決出唯一的勝出節(jié)點(diǎn),勝出的節(jié)點(diǎn)才可以啟動(dòng)對(duì)應(yīng)的服務(wù),防止裂腦的發(fā)生。本實(shí)施例中,通過(guò)上述過(guò)程,在心跳網(wǎng)絡(luò)中斷的情況下,有效判別節(jié)點(diǎn)死機(jī)還是網(wǎng)絡(luò)故障,避免將網(wǎng)絡(luò)故障誤判為節(jié)點(diǎn)死機(jī),啟動(dòng)了服務(wù)而產(chǎn)生裂腦的風(fēng)險(xiǎn);在上述過(guò)程中,當(dāng)網(wǎng)絡(luò)故障造成的心跳斷開(kāi)時(shí),避免了在服務(wù)在停止過(guò)程中,但備份節(jié)點(diǎn)不去接管服務(wù)的問(wèn)題;通過(guò)磁盤(pán)服務(wù)鎖,也可以準(zhǔn)備獲知服務(wù)是否停止成功,從而防止一邊仍在停止過(guò)程,一邊已啟動(dòng)服務(wù)的問(wèn)題;在啟動(dòng)服務(wù)之前通過(guò)上述中的搶奪服務(wù)鎖的機(jī)制,有效避免多節(jié)點(diǎn)存在的共同競(jìng)爭(zhēng)搶奪磁盤(pán)服務(wù)鎖的問(wèn)題,防止裂腦的發(fā)生。在本實(shí)施例中,對(duì)雙機(jī)而言,服務(wù)A在節(jié)點(diǎn)I上運(yùn)行,則認(rèn)為節(jié)點(diǎn)I是服務(wù)A的工作節(jié)點(diǎn),相應(yīng)地,另外一個(gè)節(jié)點(diǎn)就是備份節(jié)點(diǎn)。如果兩節(jié)點(diǎn)都有服務(wù),則同一節(jié)點(diǎn)既是工作節(jié)點(diǎn)也是備份節(jié)點(diǎn)。對(duì)于多節(jié)點(diǎn),服務(wù)所在節(jié)點(diǎn)為工作節(jié)點(diǎn),相應(yīng)地,服務(wù)域中其他的節(jié)點(diǎn)為備份節(jié)點(diǎn)。本發(fā)明實(shí)施例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,在心跳網(wǎng)絡(luò)中斷的情況下,能夠準(zhǔn)確判別是節(jié)點(diǎn)死機(jī)還是網(wǎng)絡(luò)故障,其他節(jié)點(diǎn)仍然能夠準(zhǔn)確獲知服務(wù)是否已停止成功,避免裂腦產(chǎn)生的同時(shí),也可以安全可靠地接管服務(wù)。本發(fā)明實(shí)施例提供的技術(shù)方案解決了目前在不需要將系統(tǒng)重啟或共享存儲(chǔ)隔離的情況下,在集群心跳網(wǎng)絡(luò)中斷時(shí),難以克服和避免的裂腦問(wèn)題。如圖9所示,本發(fā)明實(shí)例二提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,包括:步驟901,在集群心跳網(wǎng)絡(luò)中斷時(shí),通過(guò)網(wǎng)絡(luò)都無(wú)法判別出節(jié)點(diǎn)的狀態(tài),但磁盤(pán)節(jié)點(diǎn)更新的信息,可以有效地判別出節(jié)點(diǎn)仍然在線。步驟901與步驟401功能類(lèi)似,只是這里判別出了網(wǎng)絡(luò)故障導(dǎo)致了心跳異常,在此不再一一贅述。本實(shí)施例中,通過(guò)步驟901判別心跳全部斷開(kāi),但出節(jié)點(diǎn)仍然在線,則要進(jìn)入步驟902.
步驟902,在一個(gè)時(shí)間常量S如果沒(méi)有釋放鎖,可能存在兩種情況,一是心跳斷開(kāi)的節(jié)點(diǎn)上的服務(wù)正常運(yùn)行,二是該服務(wù)無(wú)法停止,服務(wù)不可轉(zhuǎn)移。因此,備份節(jié)點(diǎn)認(rèn)為服務(wù)仍然是正常的,并放棄接管服務(wù),避免產(chǎn)生裂腦。本實(shí)施例中,通過(guò)步驟902在一個(gè)時(shí)間常量S如果沒(méi)有釋放鎖,則可以放棄接管服務(wù)了。但為了增強(qiáng)集群的可高用性,在集群心跳全部斷開(kāi)的情況下,實(shí)際的環(huán)境中,有可能維護(hù)人員要經(jīng)過(guò)一兩天才能獲知故障然后去維護(hù),也有些沒(méi)有告警的環(huán)境,因?yàn)闃I(yè)務(wù)能正常在運(yùn)行,很可能不知道現(xiàn)場(chǎng)的集群已出現(xiàn)了異常。為了更好地解決在集群心跳網(wǎng)絡(luò)中斷的情況的問(wèn)題,本實(shí)施例中還包括了步驟903.
步驟903,在心跳網(wǎng)絡(luò)中斷的情況下,各個(gè)節(jié)點(diǎn)仍然可以通過(guò)查詢(xún)各個(gè)服務(wù)鎖,而持續(xù)地監(jiān)控各個(gè)服務(wù)的狀態(tài)。本實(shí)施例中,通過(guò)步驟903可以查詢(xún)到各個(gè)服務(wù)鎖在心跳全部斷開(kāi)之后的服務(wù)的狀態(tài)。當(dāng)各個(gè)節(jié)點(diǎn)的心跳斷開(kāi)時(shí),各個(gè)節(jié)點(diǎn)的服務(wù)仍然可能故障,需要其他可用的節(jié)點(diǎn)進(jìn)行接管服務(wù)。通過(guò)步驟903可以接管能夠正常停止故障服務(wù)的業(yè)務(wù)繼續(xù)對(duì)外提供服務(wù),事實(shí)上,這將實(shí)現(xiàn)了服務(wù)高可用性的最大化。在保證安全的并不影響其他業(yè)務(wù)的情況下,使得服務(wù)高可用最大化是一個(gè)集群系統(tǒng)最根本的原則。本實(shí)施例中,通過(guò)步驟903,進(jìn)一步地解決了步驟402和步驟403中因?yàn)樵谝粋€(gè)時(shí)間常量S內(nèi)釋放了服務(wù)鎖,并且由一個(gè)節(jié)點(diǎn)搶奪服務(wù)鎖成功,并啟動(dòng)服務(wù),但啟動(dòng)服務(wù)失敗時(shí),該服務(wù)將無(wú)法由其他節(jié)點(diǎn)接管的問(wèn)題。因此,本實(shí)施例是對(duì)實(shí)施例一的功能進(jìn)一步補(bǔ)充和完善。步驟904,通過(guò)三個(gè)搶占點(diǎn)最大程度地解決了多個(gè)節(jié)點(diǎn)同時(shí)加鎖的問(wèn)題,決出唯一勝出者獲得啟動(dòng)服務(wù)的權(quán)限。本實(shí)施例中,步驟904與步驟403是類(lèi)似的,但在這里,因?yàn)槭窃诩盒奶繑嚅_(kāi)后持續(xù)很長(zhǎng)的時(shí)間,很可能要經(jīng)過(guò)多次地服務(wù)倒換,由不同的節(jié)點(diǎn)進(jìn)行接管,步驟904的搶奪服務(wù)鎖機(jī)制為防止裂腦提供了很重要的保障。在此不再一一贅述了。在本實(shí)施例中,對(duì)雙機(jī)而言,服務(wù)A在節(jié)點(diǎn)I上運(yùn)行,則認(rèn)為節(jié)點(diǎn)I是服務(wù)A的工作節(jié)點(diǎn),相應(yīng)地,另外一個(gè)節(jié)點(diǎn)就是備份節(jié)點(diǎn)。如果兩節(jié)點(diǎn)都有服務(wù),則同一節(jié)點(diǎn)既是工作節(jié)點(diǎn)也是備份節(jié)點(diǎn)。對(duì)于多節(jié)點(diǎn),服務(wù)所在節(jié)點(diǎn)為工作節(jié)點(diǎn),相應(yīng)地,服務(wù)域中其他的節(jié)點(diǎn)為備份節(jié)點(diǎn)。本發(fā)明實(shí)施例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,在心跳網(wǎng)絡(luò)中斷后,判別是網(wǎng)絡(luò)故障后,各個(gè)節(jié)點(diǎn)仍然可以持續(xù)監(jiān)控各個(gè)服務(wù)鎖的狀態(tài),繼續(xù)可以接管可以正常停止的故障業(yè)務(wù)對(duì)外提供服務(wù),實(shí)現(xiàn)服務(wù)高可用性的最大化。本發(fā)明實(shí)施例提供的技術(shù)方案解決了目前在不需要將系統(tǒng)重啟或共享存儲(chǔ)隔離的情況下,在集群心跳網(wǎng)絡(luò)中斷后,仍然繼續(xù)可以盡可能地接管故障節(jié)點(diǎn)的服務(wù)。如圖10所示,本發(fā)明實(shí)例三提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,包括:節(jié)點(diǎn)狀態(tài)檢測(cè)判別模塊1001,用于更新本節(jié)點(diǎn)的磁盤(pán)信息的同時(shí),讀取其他節(jié)點(diǎn)的信息并記錄下來(lái),作為判別節(jié)點(diǎn)狀態(tài)的依據(jù)。本實(shí)施例中,節(jié)點(diǎn)狀態(tài)檢測(cè)判別模塊1001首先通過(guò)讀取系統(tǒng)信息自動(dòng)生成一個(gè)永不會(huì)回卷的時(shí)間戳,并更新到磁盤(pán)中提供給其他節(jié)點(diǎn)讀?。煌瑫r(shí)讀取其他節(jié)點(diǎn)的在磁盤(pán)中的更新了的時(shí)間戳,并記錄下來(lái),作為判別節(jié)點(diǎn)狀態(tài)的依據(jù)。根據(jù)各個(gè)節(jié)點(diǎn)的磁盤(pán)信息是定時(shí)去更新的并且時(shí)間戳是不會(huì)回卷的,因此,檢測(cè)模塊通過(guò)一個(gè)時(shí)間常量t各節(jié)點(diǎn)更新的時(shí)間戳的時(shí)間間隔就可以判別出各個(gè)節(jié)點(diǎn)的狀態(tài)。本實(shí)施例中,值得注意的是為了不影響實(shí)際的業(yè)務(wù)正常的讀寫(xiě)IO及增加系統(tǒng)的負(fù)擔(dān),上述的磁盤(pán)信息要求的數(shù)據(jù)量極少(為最小的磁盤(pán)IO讀寫(xiě)單位:一個(gè)扇區(qū)),并且采用不帶緩存的讀寫(xiě)的技術(shù),實(shí)現(xiàn)低時(shí)延。本裝置是經(jīng)過(guò)大量反復(fù)測(cè)試的,尤其在磁盤(pán)IO壓力很大情況下,模擬滿負(fù)荷的條件下,仍然保持穩(wěn)定的讀寫(xiě)更新磁盤(pán)信息。使得模塊1001檢測(cè)節(jié)點(diǎn)狀態(tài)的準(zhǔn)確度提供了保障。本實(shí)施例中,通過(guò)節(jié)點(diǎn)狀態(tài)檢測(cè)模塊判別節(jié)點(diǎn)的狀態(tài),而現(xiàn)有的技術(shù)中在集群心跳網(wǎng)絡(luò)中斷后,可以通過(guò)業(yè)務(wù)公有網(wǎng)絡(luò)判別節(jié)點(diǎn)的狀態(tài),如果能夠PING到了 IP,則認(rèn)為節(jié)點(diǎn)依然在線,不接管服務(wù),但不確定服務(wù)的狀態(tài),是否處于停止的過(guò)程;如果不能PING到IP,則認(rèn)為對(duì)方節(jié)點(diǎn)死機(jī),就會(huì)嘗試去啟動(dòng)服務(wù),在實(shí)際應(yīng)用環(huán)境中,有很多實(shí)例證明,這是不可靠,因?yàn)榇藭r(shí)實(shí)際的網(wǎng)絡(luò)很可能處于異?;蚨氯那闆r下,PING不到該節(jié)點(diǎn)也是很有可能的,這樣直接產(chǎn)生了裂腦。節(jié)點(diǎn)狀態(tài)檢測(cè)模塊就是可以解決了此問(wèn)題,網(wǎng)絡(luò)容易受到其他因素的影響,但對(duì)節(jié)點(diǎn)本身來(lái)說(shuō),讀寫(xiě)磁盤(pán)依然是很正常的,不容易受到了干擾,就是有最壞的時(shí)間,到了干擾,節(jié)點(diǎn)狀態(tài)檢測(cè)模塊在一個(gè)時(shí)間常量t,依然可以兼容和排除干擾,以避免不穩(wěn)定的因素。本實(shí)施例中,通過(guò)節(jié)點(diǎn)狀態(tài)檢測(cè)模塊判別節(jié)點(diǎn)的狀態(tài),可以準(zhǔn)確地判別節(jié)點(diǎn)的狀態(tài),并且?guī)缀醪粫?huì)增加和影響系統(tǒng)上運(yùn)行的業(yè)務(wù)。當(dāng)集群心跳網(wǎng)絡(luò)中斷時(shí),通過(guò)模塊1001判別如果是節(jié)點(diǎn)死機(jī),則啟動(dòng)搶奪服務(wù)鎖模塊;如果判別只是網(wǎng)絡(luò)故障,則啟動(dòng)磁盤(pán)服務(wù)鎖檢測(cè)模塊。磁盤(pán)服務(wù)鎖檢測(cè)模塊1002,用于檢測(cè)服務(wù)是否已經(jīng)加鎖或釋放,同時(shí)檢測(cè)服務(wù)鎖是否有效的。本實(shí)施例中,各個(gè)節(jié)點(diǎn)都是通過(guò)磁盤(pán)服務(wù)鎖檢測(cè)模塊來(lái)判斷對(duì)應(yīng)的服務(wù)是否已被加鎖,從而各個(gè)節(jié)點(diǎn)都可以獲知各個(gè)服務(wù)分別在哪個(gè)節(jié)點(diǎn)上運(yùn)行。節(jié)點(diǎn)在啟動(dòng)服務(wù)之前要先加鎖,服務(wù)停止成功后再解鎖,每一個(gè)服務(wù)均有一把服務(wù)鎖,這樣才保證一個(gè)服務(wù)只能在一個(gè)節(jié)點(diǎn)上運(yùn)行,不管心跳好還是心跳全斷了。本實(shí)施例中,值得注意的是本發(fā)明中的磁盤(pán)服務(wù)鎖不會(huì)出現(xiàn)“死鎖”,通常鎖機(jī)制都會(huì)因?yàn)榧渔i的一方異?;蛩劳龆鵁o(wú)法解鎖,而造成“死鎖”,其他節(jié)點(diǎn)無(wú)法去加鎖,進(jìn)一步會(huì)導(dǎo)致服務(wù)無(wú)法接管。但本發(fā)明中磁盤(pán)服務(wù)鎖引入了“有效期”,但判別加鎖的節(jié)點(diǎn)死機(jī),則對(duì)應(yīng)地服務(wù)鎖都將失效。其他節(jié)點(diǎn)就可以加鎖,接管服務(wù)。本實(shí)施例中,根據(jù)模塊1001判別出集群心跳網(wǎng)絡(luò)斷開(kāi)了,但心跳斷開(kāi)的工作節(jié)點(diǎn)仍然在線,但這種情況下,而備份節(jié)點(diǎn)無(wú)法獲知其服務(wù)狀態(tài),是否在停止服務(wù)。一個(gè)保守的策略就是不接管服務(wù),但在這種情況下,事實(shí)告訴我們,工作節(jié)點(diǎn)的服務(wù)往往是異常了。這種的策略將影響了集群的高可用性,現(xiàn)有技術(shù)中因?yàn)闊o(wú)法解決該問(wèn)題,只能通過(guò)將該節(jié)點(diǎn)的存儲(chǔ)隔離或?qū)⑵湎到y(tǒng)重啟,以保證同時(shí)只有一個(gè)節(jié)點(diǎn)啟動(dòng)服務(wù)。但這里會(huì)帶出了很多問(wèn)題與風(fēng)險(xiǎn),并不能滿足市場(chǎng)的需求,在此不再一一贅述。本實(shí)施例中,通過(guò)模塊1002,在一個(gè)時(shí)間常量S內(nèi)如果能服務(wù)鎖釋放了,就可以安全地接管服務(wù),啟動(dòng)搶奪服務(wù)鎖模塊。因?yàn)闄z測(cè)的時(shí)間常量S為兩倍的服務(wù)停止超時(shí)時(shí)間,如果在一個(gè)時(shí)間常量S內(nèi)心跳斷開(kāi)節(jié)點(diǎn)占用的磁盤(pán)服務(wù)鎖仍然沒(méi)有釋放,可能存在兩種情況,一是心跳斷開(kāi)的節(jié)點(diǎn)上的服務(wù)正常運(yùn)行,二是該服務(wù)無(wú)法停止,服務(wù)不可轉(zhuǎn)移。對(duì)于這兩種情況,備份節(jié)點(diǎn)都不需要做出處理,并放棄接管服務(wù)。通過(guò)服務(wù)鎖,節(jié)點(diǎn)可以獲知工作節(jié)點(diǎn)的服務(wù)已停止成功,但無(wú)法停止。并且,這不需要將工作節(jié)點(diǎn)的存儲(chǔ)隔離或?qū)⑵湎到y(tǒng)重啟,不影響系統(tǒng)上其他正常的服務(wù)或應(yīng)用服務(wù),當(dāng)網(wǎng)絡(luò)恢復(fù)正常時(shí),又可以安全地加入到集群當(dāng)中。搶奪服務(wù)鎖模塊1003,采用了多次搶奪,延時(shí)的優(yōu)勝劣汰的機(jī)制,用于避免多個(gè)節(jié)點(diǎn)同時(shí)加鎖啟動(dòng)服務(wù)而產(chǎn)生的裂腦問(wèn)題。本實(shí)施例中,搶奪服務(wù)鎖模塊1003,包括了多次搶奪,搶奪失敗者延時(shí)優(yōu)勝劣汰的機(jī)制決出唯一的獲勝者以及加鎖和解鎖三部分的實(shí)現(xiàn)。在多節(jié)點(diǎn)的環(huán)境中,心跳網(wǎng)絡(luò)主要是通過(guò)局域網(wǎng)絡(luò)進(jìn)行通信的,當(dāng)局域網(wǎng)的網(wǎng)絡(luò)異常,就會(huì)將多節(jié)點(diǎn)集群劃分多個(gè)集群,每集群都有節(jié)點(diǎn)嘗試去啟動(dòng)服務(wù),這時(shí)候就存在同時(shí)去搶奪服務(wù)鎖的情況,為了避免同時(shí)搶奪的問(wèn)題,本發(fā)明采用了多次搶奪,搶奪失敗者延時(shí)優(yōu)勝劣汰的機(jī)制,可以最大程度地避免此問(wèn)題。本實(shí)施例中,通過(guò)搶奪機(jī)制,決出唯一的勝利者才能去加鎖并且啟動(dòng)服務(wù)。而當(dāng)服務(wù)停止成功,就相應(yīng)去解鎖。通過(guò)啟動(dòng)服務(wù)前去加鎖,就可以通告其他節(jié)點(diǎn),避免其他節(jié)點(diǎn)去嘗試啟動(dòng)服務(wù)。通過(guò)停止服務(wù)完成后解鎖,通告其他節(jié)點(diǎn),可以讓其他節(jié)點(diǎn)去接管服務(wù)。本發(fā)明服務(wù)鎖的裝置,就是使用最簡(jiǎn)單的設(shè)計(jì),發(fā)揮最大的作用。進(jìn)一步地,如圖11所示,本發(fā)明實(shí)例三提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,還將包括:磁盤(pán)服務(wù)鎖查詢(xún)模塊1103,用于提供對(duì)其他模塊或進(jìn)程進(jìn)行查詢(xún),查詢(xún)的內(nèi)容包括節(jié)點(diǎn)的當(dāng)前狀態(tài)和服務(wù)鎖的當(dāng)前占用者等信息。在本實(shí)施例中,為了進(jìn)一步地實(shí)現(xiàn)服務(wù)高可用的最大化,在心跳網(wǎng)絡(luò)中斷后,當(dāng)工作節(jié)點(diǎn)的服務(wù)故障后仍然可以由其他備份節(jié)點(diǎn)接管。磁盤(pán)服務(wù)鎖查詢(xún)模塊1103,提供了節(jié)點(diǎn)狀態(tài)和服務(wù)鎖的當(dāng)然狀態(tài)查詢(xún)的接口,當(dāng)心跳全部斷開(kāi)后,各個(gè)節(jié)點(diǎn)無(wú)法準(zhǔn)確通過(guò)其他路徑了解其他節(jié)點(diǎn)的服務(wù)狀態(tài)。但通過(guò)查詢(xún)磁盤(pán)服務(wù)鎖的當(dāng)前狀態(tài),就可以了解到各個(gè)節(jié)點(diǎn)上服務(wù)上的狀態(tài)。顯然的是,各個(gè)節(jié)點(diǎn)上的服務(wù)存在故障時(shí),很多服務(wù)是可以停止成功的,但也存在有服務(wù)是停止不成功的。通過(guò)磁盤(pán)服務(wù)鎖,卻可以保障停止成功的服務(wù)可以由其他節(jié)點(diǎn)接管,不能停止的服務(wù)不會(huì)發(fā)生裂腦。在本實(shí)施例中,模塊1103提供僅僅是查詢(xún)接口,節(jié)點(diǎn)狀態(tài)和服務(wù)鎖的狀態(tài)結(jié)果都是由磁盤(pán)服務(wù)鎖檢測(cè)模塊1102去提供。所以,本裝置具有很高統(tǒng)一性,各個(gè)模塊相對(duì)獨(dú)立,但每一個(gè)功能所調(diào)用的模塊接口是一樣的,保障什么時(shí)候都只有一份統(tǒng)一的數(shù)據(jù),對(duì)于同一時(shí)候點(diǎn),各個(gè)節(jié)點(diǎn)模塊中的數(shù)據(jù)也是一致的。只有這樣,才能使各個(gè)節(jié)點(diǎn)在行動(dòng)上保持一致。在本實(shí)施例中,顯然地,根據(jù)不同的需要,模塊1103可以提供各種不同的查詢(xún)接口,還可以不同的操作,如加鎖或解鎖等等的操作接口。在本實(shí)施例中,對(duì)雙機(jī)而言,服務(wù)A在節(jié)點(diǎn)I上運(yùn)行,則認(rèn)為節(jié)點(diǎn)I是服務(wù)A的工作節(jié)點(diǎn),相應(yīng)地,另外一個(gè)節(jié)點(diǎn)就是備份節(jié)點(diǎn)。如果兩節(jié)點(diǎn)都有服務(wù),則同一節(jié)點(diǎn)既是工作節(jié)點(diǎn)也是備份節(jié)點(diǎn)。對(duì)于多節(jié)點(diǎn),服務(wù)所在節(jié)點(diǎn)為工作節(jié)點(diǎn),相應(yīng)地,服務(wù)域中其他的節(jié)點(diǎn)為備份節(jié)點(diǎn)。本發(fā)明實(shí)施例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝胃,在集群心跳網(wǎng)絡(luò)中斷的情況下,能夠準(zhǔn)備判別是節(jié)點(diǎn)機(jī)死機(jī)還是網(wǎng)絡(luò)故障,如果心跳斷開(kāi)的節(jié)點(diǎn)死機(jī),則可以搶奪服務(wù)鎖,進(jìn)而啟動(dòng)服務(wù);如果心跳斷開(kāi)的節(jié)點(diǎn)是網(wǎng)絡(luò)故障,則檢測(cè)服務(wù)鎖在一個(gè)時(shí)間常量S內(nèi)是否釋放,如果已釋放,則可以搶奪服務(wù)鎖,進(jìn)而啟動(dòng)服務(wù);如果沒(méi)有釋放,則放棄啟動(dòng)服務(wù);通過(guò)查詢(xún)功能,還可以接管再次出現(xiàn)故障的節(jié)點(diǎn)。本發(fā)明實(shí)施例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,在心跳網(wǎng)絡(luò)中斷的情況下,能夠準(zhǔn)確判別是節(jié)點(diǎn)死機(jī)還是網(wǎng)絡(luò)故障,其他節(jié)點(diǎn)仍然能夠準(zhǔn)確獲知服務(wù)是否已停止成功,避免裂腦產(chǎn)生的同時(shí),也可以安全可靠地接管服務(wù)。在心跳網(wǎng)絡(luò)中斷后,判別是網(wǎng)絡(luò)故障后,各個(gè)節(jié)點(diǎn)仍然可以持續(xù)監(jiān)控各個(gè)服務(wù)鎖的狀態(tài),繼續(xù)可以接管可以正常停止的故障業(yè)務(wù)對(duì)外提供服務(wù),實(shí)現(xiàn)服務(wù)高可用性的最大化。本發(fā)明實(shí)施例提供的技術(shù)方案解決了目前在不需要將系統(tǒng)重啟或共享存儲(chǔ)隔離的情況下,在集群心跳網(wǎng)絡(luò)中斷后,仍然繼續(xù)可以盡可能地接管故障節(jié)點(diǎn)的服務(wù)。本發(fā)明實(shí)施例提供一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法和裝置,都可以直接應(yīng)用在高可用性的集群中。結(jié)合本文所公開(kāi)的實(shí)施描述的方法或算法步驟可以直接應(yīng)用于硬件、處理器執(zhí)行的軟件模塊,或者二者綜合來(lái)實(shí)施。以上所述,僅為本發(fā)明的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,包括: 在心跳網(wǎng)絡(luò)中斷時(shí),備份節(jié)點(diǎn)通過(guò)磁盤(pán)服務(wù)鎖的工作節(jié)點(diǎn)更新的時(shí)間戳判別工作節(jié)點(diǎn)是死機(jī)還是因網(wǎng)絡(luò)故障而導(dǎo)致心跳斷開(kāi); 所述工作節(jié)點(diǎn)是因網(wǎng)絡(luò)故障而導(dǎo)致心跳斷開(kāi)時(shí),所述的備份節(jié)點(diǎn)檢測(cè)在一個(gè)時(shí)間常量S內(nèi)工作節(jié)點(diǎn)占用的服務(wù)鎖是否已釋放; 所述工作節(jié)點(diǎn)占用的服務(wù)已釋放,所述的備份節(jié)點(diǎn)可以進(jìn)行搶奪磁盤(pán)服務(wù)鎖,獲勝者將啟動(dòng)對(duì)應(yīng)的服務(wù)。
2.根據(jù)權(quán)利要求1所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包括: 在心跳網(wǎng)絡(luò)中斷時(shí),所述的備份節(jié)點(diǎn)通過(guò)磁盤(pán)服務(wù)鎖判別所述的工作節(jié)點(diǎn)是否死機(jī);所述的工作節(jié)點(diǎn)已死機(jī),所述的備份節(jié)點(diǎn)可以進(jìn)行搶奪磁盤(pán)服務(wù)鎖,獲勝者進(jìn)行加鎖并啟動(dòng)對(duì)應(yīng)的服務(wù)。
3.根據(jù)權(quán)利要求1所述一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包括: 在心跳網(wǎng)絡(luò)中斷時(shí),所述的備份節(jié)點(diǎn)通過(guò)磁盤(pán)服務(wù)鎖判別所述的工作節(jié)點(diǎn)是否死機(jī); 所述的工作節(jié)點(diǎn)沒(méi)有死機(jī),是因?yàn)榫W(wǎng)絡(luò)故障而導(dǎo)致的心跳斷開(kāi),所述的備份節(jié)點(diǎn)檢測(cè)在一個(gè)時(shí)間常量S內(nèi)工作節(jié)點(diǎn)占用的服務(wù)鎖已釋放,所述的備份節(jié)點(diǎn)可以進(jìn)行搶奪磁盤(pán)服務(wù)鎖,獲勝者將啟動(dòng)對(duì)應(yīng)的服務(wù)。
4.根據(jù)權(quán)利要求3所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包 括: 所述的工作節(jié)點(diǎn)沒(méi)有死機(jī),是因?yàn)榫W(wǎng)絡(luò)故障而導(dǎo)致的心跳網(wǎng)絡(luò)斷開(kāi),所述的備份節(jié)點(diǎn)檢測(cè)在一個(gè)時(shí)間常量S內(nèi)工作節(jié)點(diǎn)占用的服務(wù)鎖沒(méi)有釋放,所述的備份節(jié)點(diǎn)放棄啟動(dòng)對(duì)應(yīng)的服務(wù)。
5.根據(jù)權(quán)利要求4所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包括: 所述的備份節(jié)點(diǎn)放棄啟動(dòng)對(duì)應(yīng)的服務(wù)后,還可以繼續(xù)提供查詢(xún)檢測(cè)該服務(wù)的磁盤(pán)服務(wù)鎖是否因故障而停止成功,并釋放鎖的,所述的備份節(jié)點(diǎn)仍然可以加鎖啟動(dòng)服務(wù)。
6.根據(jù)權(quán)利要求2和5所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包括: 所述的備份節(jié)點(diǎn)成功接管對(duì)應(yīng)的服務(wù)后,成為工作節(jié)點(diǎn),當(dāng)工作節(jié)點(diǎn)因故障而停止成功后,所述的其他備份節(jié)點(diǎn)仍然可以加鎖啟動(dòng)服務(wù)。
7.根據(jù)權(quán)利要求3和5所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,還包括: 所述的備份節(jié)點(diǎn)成功接管對(duì)應(yīng)的服務(wù)后,成為工作節(jié)點(diǎn),當(dāng)工作節(jié)點(diǎn)因故障而停止成功后,通過(guò)查詢(xún)磁盤(pán)服務(wù)鎖的狀態(tài),所述的其他備份節(jié)點(diǎn)仍然可以加鎖啟動(dòng)服務(wù),直到最后一個(gè)備份節(jié)點(diǎn)故障而停止服務(wù)。
8.根據(jù)權(quán)利要求5所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,所述的查詢(xún)接口,包括: 查詢(xún)節(jié)點(diǎn)的當(dāng)前狀態(tài),包括節(jié)點(diǎn)距離節(jié)點(diǎn)死機(jī)的大致時(shí)間; 查詢(xún)磁盤(pán)服務(wù)鎖的當(dāng)前狀態(tài),包括每個(gè)節(jié)點(diǎn)上的服務(wù)及每個(gè)服務(wù)所在節(jié)點(diǎn)。
9.根據(jù)權(quán)利要求1所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法,其特征在于,搶奪磁盤(pán)服務(wù)鎖,包括: 加鎖前,先按順序搶奪三個(gè)搶占點(diǎn); 每一個(gè)搶占點(diǎn)只能一個(gè)搶奪成功的,搶奪成功的,繼續(xù)搶奪其他的,不成功將延時(shí); 至少獲取二個(gè)或以上的為獲勝者,并且是唯一。
10.一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,包括: 節(jié)點(diǎn)狀態(tài)檢測(cè)判別模塊,用于更新本節(jié)點(diǎn)的磁盤(pán)信息的同時(shí),讀取其他節(jié)點(diǎn)的信息并記錄下來(lái),作為判別節(jié)點(diǎn)狀態(tài)的依據(jù); 磁盤(pán)服務(wù)鎖檢測(cè)模塊,用于檢測(cè)服務(wù)是否已經(jīng)加鎖或釋放,同時(shí)檢測(cè)服務(wù)鎖是否有效的; 搶奪服務(wù)鎖模塊,采用了多次搶奪,延時(shí)的優(yōu)勝劣汰的機(jī)制,用于加鎖和解鎖,解決多個(gè)節(jié)點(diǎn)同時(shí)搶奪的問(wèn)題。
磁盤(pán)服務(wù)鎖查詢(xún)模塊,用于提供查詢(xún)的內(nèi)容包括節(jié)點(diǎn)的當(dāng)前狀態(tài)和服務(wù)鎖的當(dāng)前占用者等信息的接口。
11.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,節(jié)點(diǎn)狀態(tài)檢測(cè)判別模塊,還包括: 用于更新本節(jié)點(diǎn)的磁盤(pán)信息的同時(shí),讀取其他節(jié)點(diǎn)的信息并記錄下來(lái),作為判別節(jié)點(diǎn)狀態(tài)的依據(jù); 各個(gè)節(jié)點(diǎn)根據(jù)系統(tǒng)的配置生成一個(gè)永不`會(huì)回卷的時(shí)間戳更新到磁盤(pán),并由其他節(jié)點(diǎn)讀取,不直接傳遞集群的信息,但也可以拓展傳遞集群指令; 節(jié)點(diǎn)在一個(gè)時(shí)間常量t內(nèi)沒(méi)有更新對(duì)應(yīng)的時(shí)間戳,則認(rèn)為此節(jié)點(diǎn)死機(jī)。
12.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,磁盤(pán)服務(wù)鎖檢測(cè)模塊,還包括: 用于檢測(cè)服務(wù)是否已經(jīng)加鎖或釋放,同時(shí)檢測(cè)服務(wù)鎖是否有效的; 服務(wù)啟動(dòng)前必須加鎖成功,服務(wù)成功停止完成才能解鎖; 服務(wù)鎖是有有效期的,只要占用服務(wù)鎖的節(jié)點(diǎn)死機(jī),則該服務(wù)鎖失效,不存在死鎖的情況。
13.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,搶奪服務(wù)鎖模塊,還包括: 采用了多次搶奪,延時(shí)的優(yōu)勝劣汰的機(jī)制,用于加鎖和解鎖,解決多個(gè)節(jié)點(diǎn)同時(shí)搶奪的問(wèn)題; 加鎖前,至少搶奪兩個(gè)或以上的搶占點(diǎn),才能加鎖。
14.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,還包括: 在心跳全部斷開(kāi)時(shí),通過(guò)檢測(cè)所述工作節(jié)點(diǎn)在一個(gè)時(shí)間常量t內(nèi)無(wú)時(shí)間戳更新則判別死機(jī),則調(diào)用搶奪服務(wù)鎖模塊,加鎖成功后啟動(dòng)服務(wù)。
15.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,還包括: 在心跳全部斷開(kāi)時(shí),通過(guò)檢測(cè)所述工作節(jié)點(diǎn)在一個(gè)時(shí)間常量t內(nèi)時(shí)間戳更新正常,而磁盤(pán)服務(wù)鎖檢測(cè)模塊在一個(gè)時(shí)間常量S內(nèi)檢測(cè)服務(wù)鎖已釋放,則調(diào)用搶奪服務(wù)鎖模塊,力口鎖成功后啟動(dòng)服務(wù)。
16.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,還包括: 在心跳全部斷開(kāi)時(shí),通過(guò)檢測(cè)工作節(jié)點(diǎn)在一個(gè)時(shí)間常量t內(nèi)時(shí)間戳更新正常,而磁盤(pán)服務(wù)鎖檢測(cè)模塊在一個(gè)時(shí)間常量S內(nèi)檢測(cè)服務(wù)鎖尚且沒(méi)有釋放,則放棄啟動(dòng)服務(wù)。
17.根據(jù)權(quán)利要求10所述的一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的裝置,其特征在于,還包括: 在心跳全部斷開(kāi)一個(gè)時(shí)間常量S后,通過(guò)磁盤(pán)服務(wù)鎖查詢(xún)模塊提供的查詢(xún)功能,可以持續(xù)監(jiān)控各個(gè)節(jié)點(diǎn)和服務(wù)鎖的狀態(tài),在節(jié)點(diǎn)死機(jī)或因故障而成功停止解鎖的,所述的其他備份節(jié)點(diǎn)可以調(diào)用搶奪磁盤(pán)服務(wù)鎖模塊進(jìn)行加鎖,并接管服務(wù),直到最后一個(gè)備份節(jié)點(diǎn)故障而 服務(wù)停止。
全文摘要
本發(fā)明公開(kāi)一種基于磁盤(pán)服務(wù)鎖的裂腦預(yù)防的方法和裝置,屬于計(jì)算機(jī)集群技術(shù)領(lǐng)域,適用于高可用性集群。為解決在集群心跳網(wǎng)絡(luò)中斷時(shí),無(wú)法準(zhǔn)確判別其他節(jié)點(diǎn)及其運(yùn)行服務(wù)的狀態(tài),而出現(xiàn)無(wú)法接管服務(wù)或難以避免裂腦的問(wèn)題,尤其是不使用將系統(tǒng)重啟或存儲(chǔ)隔離的技術(shù)的情況下。本發(fā)明實(shí)施例提供的技術(shù)方案包括在心跳網(wǎng)絡(luò)中斷時(shí),有效判別是心跳網(wǎng)絡(luò)故障還是節(jié)點(diǎn)死機(jī)的情況;通過(guò)查詢(xún)磁盤(pán)服務(wù)鎖能夠正確獲取服務(wù)是否已停止成功,從而避免了存在的短暫裂腦問(wèn)題;在多個(gè)節(jié)點(diǎn)同時(shí)搶奪服務(wù)鎖,只有唯一搶奪成功的節(jié)點(diǎn)才可以啟動(dòng)服務(wù),防止裂腦發(fā)生。
文檔編號(hào)H04L12/24GK103209095SQ201310081528
公開(kāi)日2013年7月17日 申請(qǐng)日期2013年3月13日 優(yōu)先權(quán)日2013年3月13日
發(fā)明者莫慶良, 蔡強(qiáng), 董春青, 袁泉 申請(qǐng)人:廣東新支點(diǎn)技術(shù)服務(wù)有限公司