本申請(qǐng)涉及存儲(chǔ)技術(shù)領(lǐng)域,特別涉及一種心跳實(shí)現(xiàn)方法及裝置。
背景技術(shù):
在共享文件系統(tǒng)中,多個(gè)節(jié)點(diǎn)(例如,主機(jī))組成一個(gè)集群,該集群中的所有節(jié)點(diǎn)可以訪問(wèn)同一存儲(chǔ)空間,任一節(jié)點(diǎn)讀寫(xiě)該存儲(chǔ)空間中的文件時(shí),其它節(jié)點(diǎn)仍可以訪問(wèn)該文件,節(jié)點(diǎn)間通過(guò)分布式鎖協(xié)商讀寫(xiě)權(quán)限。
在共享文件系統(tǒng)中,采用讀寫(xiě)心跳機(jī)制來(lái)判定節(jié)點(diǎn)是否在線。具體的,在如圖1所示的共享文件系統(tǒng)中包括節(jié)點(diǎn)1(節(jié)點(diǎn)ID為1)、節(jié)點(diǎn)2(節(jié)點(diǎn)ID為2)和節(jié)點(diǎn)3(節(jié)點(diǎn)ID為3),這3個(gè)節(jié)點(diǎn)可以訪問(wèn)存儲(chǔ)空間中的同一邏輯盤(或稱為卷),從該邏輯盤的固定基地址位置開(kāi)始執(zhí)行讀寫(xiě)心跳操作,例如,該基地址位置為該邏輯盤4M字節(jié)位置,每一個(gè)節(jié)點(diǎn)寫(xiě)心跳的偏移地址為4字節(jié)(即寫(xiě)心跳內(nèi)容占用4字節(jié)),則各個(gè)節(jié)點(diǎn)寫(xiě)心跳的方法如下:
節(jié)點(diǎn)1在4M~(4M+4)字節(jié)位置寫(xiě)入本節(jié)點(diǎn)的sequence(順序)計(jì)數(shù)值1,節(jié)點(diǎn)2在(4M+4)~(4M+8)字節(jié)位置寫(xiě)入本節(jié)點(diǎn)的sequence計(jì)數(shù)值1,節(jié)點(diǎn)3在(4M+8)~(4M+12)字節(jié)位置寫(xiě)入本節(jié)點(diǎn)的sequence計(jì)數(shù)值1;然后,節(jié)點(diǎn)1在4M~(4M+4)字節(jié)位置將本節(jié)點(diǎn)的sequence計(jì)數(shù)值更新為2,節(jié)點(diǎn)2在(4M+4)~(4M+8)字節(jié)位置將本節(jié)點(diǎn)的sequence計(jì)數(shù)值更新為2,節(jié)點(diǎn)3在(4M+8)~(4M+12)字節(jié)位置將本節(jié)點(diǎn)的sequence計(jì)數(shù)值更新為2;以此類推。
每一個(gè)節(jié)點(diǎn)周期性的執(zhí)行上述寫(xiě)心跳操作,并且,周期性的執(zhí)行從該邏輯盤中讀取所有節(jié)點(diǎn)的sequence計(jì)數(shù)值的讀心跳操作,通過(guò)讀取到的sequence計(jì)數(shù)值來(lái)判斷其它節(jié)點(diǎn)是否在線。具體的判斷方法是:針對(duì)任一其它節(jié)點(diǎn),如果在預(yù)定時(shí)間內(nèi)該其它節(jié)點(diǎn)的sequence計(jì)數(shù)值發(fā)生了變化,則確定該其它節(jié)點(diǎn)在線,否則,確定該其它節(jié)點(diǎn)不在線。一般情況下,讀寫(xiě)心跳周期為2秒,上述預(yù)定時(shí)間可以為2秒的整數(shù)倍,例如,為4秒。
在上述的讀寫(xiě)心跳機(jī)制中,當(dāng)節(jié)點(diǎn)負(fù)載較大時(shí),可能會(huì)導(dǎo)致讀寫(xiě)心跳操作發(fā)生延時(shí),特別是寫(xiě)心跳操作會(huì)發(fā)生延時(shí),例如,將順序計(jì)數(shù)值寫(xiě)入邏輯盤的過(guò)程較慢、寫(xiě)不進(jìn)去等。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請(qǐng)?zhí)峁┮环N心跳實(shí)現(xiàn)方法及裝置。
具體地,本申請(qǐng)是通過(guò)如下技術(shù)方案實(shí)現(xiàn)的:
一方面,提供了一種心跳實(shí)現(xiàn)方法,該方法應(yīng)用于共享文件系統(tǒng)中的節(jié)點(diǎn),該方法包括:
按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,第一寫(xiě)心跳操作為向共享的存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值;
在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),將本節(jié)點(diǎn)的狀態(tài)從正常切換為非正常,停止執(zhí)行第一寫(xiě)心跳操作,獲取第一寫(xiě)心跳操作的最新順序計(jì)數(shù)值M,將本節(jié)點(diǎn)的心跳周期更新為第二值,其中,第二值大于第一值;
按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給除本節(jié)點(diǎn)以外的其它節(jié)點(diǎn),第二寫(xiě)心跳操作為向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值,其中,寫(xiě)入的順序計(jì)數(shù)值的起始值為M或M+1。
另一方面,還提供了一種心跳實(shí)現(xiàn)裝置,該裝置應(yīng)用于共享文件系統(tǒng)中的節(jié)點(diǎn)中,該裝置包括:
檢測(cè)單元,用于檢測(cè)本節(jié)點(diǎn)的負(fù)載情況;
狀態(tài)切換單元,用于在檢測(cè)單元檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),將本節(jié)點(diǎn)的狀態(tài)從正常切換為非正常;
寫(xiě)心跳執(zhí)行單元,用于按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,第一寫(xiě)心跳操作為向共享的存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值;還用于在檢測(cè)單元檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),停止執(zhí)行第一寫(xiě)心跳操作,獲取第一寫(xiě)心跳操作的最新順序計(jì)數(shù)值M,將本節(jié)點(diǎn)的心跳周期更新為第二值,按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給除本節(jié)點(diǎn)以外的其它節(jié)點(diǎn),第二寫(xiě)心跳操作為向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值,其中,寫(xiě)入的順序計(jì)數(shù)值的起始值為M或M+1,第二值大于第一值。
通過(guò)本申請(qǐng)的以上技術(shù)方案,在現(xiàn)有的寫(xiě)心跳操作(稱為第一寫(xiě)心跳操作)的基礎(chǔ)上,新增了一種向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值的寫(xiě)心跳操作(稱為第二寫(xiě)心跳操作),初始時(shí),節(jié)點(diǎn)會(huì)以第一值為周期執(zhí)行第一寫(xiě)心跳操作,在本節(jié)點(diǎn)的負(fù)載變大時(shí),節(jié)點(diǎn)不再按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,而是按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給其它節(jié)點(diǎn),其中,第二值大于第一值。由于在節(jié)點(diǎn)的負(fù)載較大時(shí),增大了心跳周期,而且,不再向存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值,而是向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值,因此,降低了讀寫(xiě)心跳的頻率,減少了讀寫(xiě)心跳占用的CPU資源和IO(輸入輸出)資源,而且,向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值的操作能夠更加及時(shí)快速的完成,避免了向存儲(chǔ)空間寫(xiě)入順序計(jì)數(shù)值存在的執(zhí)行過(guò)程較慢、寫(xiě)不進(jìn)去等造成的寫(xiě)心跳操作延時(shí)問(wèn)題。
附圖說(shuō)明
圖1是一種共享文件系統(tǒng)的架構(gòu)示意圖;
圖2是本申請(qǐng)一示例性實(shí)施例示出的心跳實(shí)現(xiàn)方法的流程圖;
圖3是圖1中的節(jié)點(diǎn)1在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí)執(zhí)行的流程圖;
圖4是圖1中的節(jié)點(diǎn)1在檢測(cè)到本節(jié)點(diǎn)的負(fù)載恢復(fù)正常時(shí)執(zhí)行的流程圖;
圖5是圖1中的節(jié)點(diǎn)3在檢測(cè)到節(jié)點(diǎn)2的狀態(tài)從Abnormal切換為Normal時(shí)執(zhí)行的流程圖;
圖6是本申請(qǐng)一示例性實(shí)施例示出的心跳實(shí)現(xiàn)裝置所在節(jié)點(diǎn)的硬件結(jié)構(gòu)示意圖;
圖7是本申請(qǐng)一示例性實(shí)施例示出的心跳實(shí)現(xiàn)裝置的一種結(jié)構(gòu)示意圖;
圖8是本申請(qǐng)一示例性實(shí)施例示出的心跳實(shí)現(xiàn)裝置的另一種結(jié)構(gòu)示意圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書(shū)中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書(shū)中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來(lái)描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來(lái)將同一類型的信息彼此區(qū)分開(kāi)。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
為了解決現(xiàn)有技術(shù)中存在的當(dāng)節(jié)點(diǎn)負(fù)載較大時(shí),會(huì)導(dǎo)致讀寫(xiě)心跳操作發(fā)生延時(shí)的問(wèn)題,本申請(qǐng)以下實(shí)施例中提供了一種心跳實(shí)現(xiàn)方法,以及一種可以應(yīng)用該方法的裝置。
在本申請(qǐng)實(shí)施例的心跳實(shí)現(xiàn)方法中,每一個(gè)節(jié)點(diǎn)的初始狀態(tài)均為正常(Normal),心跳周期的初始值為第一值,此時(shí),任一節(jié)點(diǎn)在掛載共享文件系統(tǒng)后,會(huì)按照第一值周期性的執(zhí)行現(xiàn)有技術(shù)的寫(xiě)心跳操作(為了描述方便,稱為第一寫(xiě)心跳操作),即,向共享的存儲(chǔ)空間中寫(xiě)入本節(jié)點(diǎn)的順序計(jì)數(shù)值,后續(xù),在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),會(huì)切換為執(zhí)行第二寫(xiě)心跳操作,即,向本節(jié)點(diǎn)中寫(xiě)入本節(jié)點(diǎn)的順序計(jì)數(shù)值。具體的,在執(zhí)行第二寫(xiě)心跳操作時(shí),可以將順序計(jì)數(shù)值寫(xiě)入本節(jié)點(diǎn)的內(nèi)存或本地磁盤等存儲(chǔ)介質(zhì)中。
具體的過(guò)程如圖2所示,包括以下步驟:
步驟S101,在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),將本節(jié)點(diǎn)的狀態(tài)從Normal切換為非正常(Abnormal),停止執(zhí)行第一寫(xiě)心跳操作,獲取第一寫(xiě)心跳操作的最新順序計(jì)數(shù)值M,將本節(jié)點(diǎn)的心跳周期更新為第二值,其中,第二值大于第一值;
在實(shí)際實(shí)施過(guò)程中,第二值T2大于第一值T1即可,優(yōu)選的,T2可以設(shè)置為T1的整數(shù)倍,即,2*T1、3*T1等。例如,T1可以為2秒,T2可以為10秒。
通常情況下,讀心跳操作和寫(xiě)心跳操作的周期相同,因此,本申請(qǐng)實(shí)施例中提到的心跳周期為讀心跳操作和寫(xiě)心跳操作共同的周期,當(dāng)心跳周期發(fā)生了更新時(shí),按照更新后的心跳周期,執(zhí)行寫(xiě)心跳操作和讀心跳操作。
步驟S102,按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給除本節(jié)點(diǎn)以外的其它節(jié)點(diǎn),其中,寫(xiě)入的順序計(jì)數(shù)值的起始值為M或M+1。
具體的,當(dāng)寫(xiě)入的順序計(jì)數(shù)值的起始值為M時(shí),首次執(zhí)行第二寫(xiě)心跳操作時(shí),將M寫(xiě)入上述存儲(chǔ)介質(zhì)中,并將M發(fā)送給其它節(jié)點(diǎn);然后,第二次執(zhí)行第二寫(xiě)心跳操作時(shí),將該存儲(chǔ)介質(zhì)中的M更新為M+1,并將M+1發(fā)送給其它節(jié)點(diǎn);之后,第三次執(zhí)行第二寫(xiě)心跳操作時(shí),將該存儲(chǔ)介質(zhì)中的M+1更新為M+2,并將M+2發(fā)送給其它節(jié)點(diǎn);以此類推。
本申請(qǐng)上述實(shí)施例的方法中,在現(xiàn)有的寫(xiě)心跳操作(稱為第一寫(xiě)心跳操作)的基礎(chǔ)上,新增了一種向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值的寫(xiě)心跳操作(稱為第二寫(xiě)心跳操作),初始時(shí),節(jié)點(diǎn)會(huì)以第一值為周期執(zhí)行第一寫(xiě)心跳操作,在本節(jié)點(diǎn)的負(fù)載變大時(shí),節(jié)點(diǎn)不再按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,而是按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給其它節(jié)點(diǎn),其中,第二值大于第一值。由于在節(jié)點(diǎn)的負(fù)載較大時(shí),增大了心跳周期,而且,不再向存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值,而是向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值,因此,降低了讀寫(xiě)心跳的頻率,減少了讀寫(xiě)心跳占用的CPU資源和IO資源,而且,向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值的操作能夠更加及時(shí)快速的完成,避免了向存儲(chǔ)空間寫(xiě)入順序計(jì)數(shù)值存在的執(zhí)行過(guò)程較慢、寫(xiě)不進(jìn)去等造成的寫(xiě)心跳操作延時(shí)問(wèn)題。
上述的共享文件系統(tǒng)具體可以為OCFS2(Oracle Cluster File System 2,Oracle集群文件系統(tǒng)2)、NFS(Network File System,網(wǎng)絡(luò)文件系統(tǒng))、以及VMFS(Virtual Machine File System,虛擬機(jī)文件系統(tǒng))等。
以圖1所示的共享文件操作系統(tǒng)為例,說(shuō)明本申請(qǐng)實(shí)施例的方法。該共享文件系統(tǒng)中包括3個(gè)節(jié)點(diǎn):節(jié)點(diǎn)1、節(jié)點(diǎn)2和節(jié)點(diǎn)3,這3個(gè)節(jié)點(diǎn)的初始狀態(tài)均為Normal,心跳周期的初始值為第一值T1,假設(shè)T1=2秒,第二值T2=10秒。節(jié)點(diǎn)1~節(jié)點(diǎn)3中的任一節(jié)點(diǎn)均需要維護(hù)所有其它節(jié)點(diǎn)的狀態(tài),狀態(tài)初始值為Normal。節(jié)點(diǎn)維護(hù)其它節(jié)點(diǎn)的狀態(tài)的方式可以有多種,例如,可以采用以下方式中的任一種:
方式一、每一個(gè)節(jié)點(diǎn)在本節(jié)點(diǎn)的狀態(tài)發(fā)生了改變時(shí),將變化后的新?tīng)顟B(tài)通知給其它節(jié)點(diǎn),該其它節(jié)點(diǎn)接收到該通知后,就可以對(duì)本地保存的節(jié)點(diǎn)狀態(tài)進(jìn)行更新;
方式二、每一個(gè)節(jié)點(diǎn)周期性的將本節(jié)點(diǎn)的狀態(tài)通知給其它節(jié)點(diǎn),該其它節(jié)點(diǎn)接收到該通知后,就可以對(duì)本地保存的節(jié)點(diǎn)狀態(tài)進(jìn)行更新;
方式三、將方式一和方式二結(jié)合,即,周期性通知,并且,在狀態(tài)發(fā)生變化時(shí)也會(huì)通知。
基于此,本申請(qǐng)實(shí)施例的心跳實(shí)現(xiàn)方法如下:
初始時(shí),節(jié)點(diǎn)1~節(jié)點(diǎn)3中的任一節(jié)點(diǎn)以2秒為周期執(zhí)行第一寫(xiě)心跳操作,并且,以2秒為周期執(zhí)行讀心跳操作。
此時(shí),在執(zhí)行讀心跳操作時(shí),在從存儲(chǔ)空間中讀取到所有節(jié)點(diǎn)的順序計(jì)數(shù)值之后,針對(duì)任一其它節(jié)點(diǎn),判斷該其它節(jié)點(diǎn)的順序計(jì)數(shù)值在第一預(yù)定時(shí)間內(nèi)是否發(fā)生了變化,若是,則確定該其它節(jié)點(diǎn)在線,否則,確定該其它節(jié)點(diǎn)不在線。其中,上述第一預(yù)定時(shí)間可以為第一值T1的整數(shù)倍,例如,該第一預(yù)定時(shí)間為4秒。
首先,節(jié)點(diǎn)1發(fā)生了過(guò)載。
節(jié)點(diǎn)1在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),會(huì)執(zhí)行如圖3所示的步驟:
步驟S201,在檢測(cè)到本節(jié)點(diǎn)的負(fù)載發(fā)生過(guò)載時(shí),將本節(jié)點(diǎn)的狀態(tài)從Normal切換為Abnormal,停止執(zhí)行第一寫(xiě)心跳操作,獲取第一寫(xiě)心跳操作的最新順序計(jì)數(shù)值M,將本節(jié)點(diǎn)的心跳周期更新為10秒;
在節(jié)點(diǎn)1的狀態(tài)切換為Abnormal時(shí),節(jié)點(diǎn)2和節(jié)點(diǎn)3可以通過(guò)上述方式一至方式三中的任一種方式,檢測(cè)到節(jié)點(diǎn)1的狀態(tài)變化,并將本地保存的節(jié)點(diǎn)1的狀態(tài)更新為Abnormal。此時(shí),節(jié)點(diǎn)1的狀態(tài)為Abnormal,節(jié)點(diǎn)2和節(jié)點(diǎn)3的狀態(tài)為Normal。
在步驟S201中,節(jié)點(diǎn)1可以通過(guò)獲取本節(jié)點(diǎn)的負(fù)載信息的方式來(lái)檢測(cè)本節(jié)點(diǎn)的負(fù)載是否過(guò)載,獲取的負(fù)載信息可以是與讀寫(xiě)心跳操作有關(guān)的一種或者多種信息的組合,例如,可以是IOPS(Input/Output Operations Per Second,每秒進(jìn)行讀寫(xiě)(I/O)操作的次數(shù))、CPU(中央處理單元)資源利用率、存儲(chǔ)資源利用率等負(fù)載信息中的一種或多種的組合。下面分別對(duì)這兩種情況加以介紹。
情況一、當(dāng)獲取一種負(fù)載信息時(shí)
在情況一中,該負(fù)載信息對(duì)應(yīng)于一個(gè)預(yù)設(shè)閾值,例如,當(dāng)該負(fù)載信息是IOPS時(shí),對(duì)應(yīng)的預(yù)設(shè)閾值為800,當(dāng)該負(fù)載信息是CPU資源利用率時(shí),對(duì)應(yīng)的預(yù)設(shè)閾值為90%,當(dāng)該負(fù)載信息為存儲(chǔ)資源利用率時(shí),對(duì)應(yīng)的預(yù)設(shè)閾值為85%。
這樣,檢測(cè)本節(jié)點(diǎn)的負(fù)載是否過(guò)載的方式為:判斷獲取到的負(fù)載信息的數(shù)值是否大于預(yù)設(shè)閾值,若是,則確定本節(jié)點(diǎn)的負(fù)載過(guò)載,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有過(guò)載。
情況二、當(dāng)獲取兩種以上負(fù)載信息時(shí)
在情況二中,每一種負(fù)載信息對(duì)應(yīng)于一個(gè)預(yù)設(shè)閾值,則,檢測(cè)本節(jié)點(diǎn)的負(fù)載是否過(guò)載的方式為:若獲取到的每一個(gè)負(fù)載信息的數(shù)值均大于對(duì)應(yīng)的預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載過(guò)載,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有過(guò)載。
步驟S201,以10秒為周期執(zhí)行第二寫(xiě)心跳操作,每次執(zhí)行第二寫(xiě)心跳操作時(shí),將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給節(jié)點(diǎn)2和節(jié)點(diǎn)3,其中,寫(xiě)入的順序計(jì)數(shù)值的起始值為M或M+1。
在步驟S201中節(jié)點(diǎn)1可以將順序計(jì)數(shù)值攜帶在心跳計(jì)數(shù)報(bào)文中發(fā)送給節(jié)點(diǎn)2和節(jié)點(diǎn)3。
另外,節(jié)點(diǎn)1還會(huì)以10秒為周期執(zhí)行讀心跳操作。
節(jié)點(diǎn)2和節(jié)點(diǎn)3在檢測(cè)到節(jié)點(diǎn)1的狀態(tài)從Normal切換為Abnormal時(shí),發(fā)現(xiàn)本節(jié)點(diǎn)的心跳周期為2秒,則會(huì)將本節(jié)點(diǎn)的心跳周期更新為10秒,以10秒為周期執(zhí)行第一寫(xiě)心跳操作;在接收到節(jié)點(diǎn)1發(fā)來(lái)的順序計(jì)數(shù)值之后,會(huì)保存該順序計(jì)數(shù)值,具體的,可以在內(nèi)存中保存節(jié)點(diǎn)1發(fā)來(lái)的順序計(jì)數(shù)值。
另外,節(jié)點(diǎn)2和節(jié)點(diǎn)3還會(huì)以10秒為周期執(zhí)行讀心跳操作。其中,節(jié)點(diǎn)2在從存儲(chǔ)空間中讀取到所有節(jié)點(diǎn)的順序計(jì)數(shù)值之后,針對(duì)節(jié)點(diǎn)1,會(huì)根據(jù)本節(jié)點(diǎn)2中保存的節(jié)點(diǎn)1的順序計(jì)數(shù)值,判斷節(jié)點(diǎn)1的順序計(jì)數(shù)值在第二預(yù)定時(shí)間內(nèi)是否發(fā)生了變化,若發(fā)生了變化,則確定節(jié)點(diǎn)1在線,否則,確定節(jié)點(diǎn)1不在線,針對(duì)節(jié)點(diǎn)3,依然會(huì)按照現(xiàn)有技術(shù),根據(jù)從存儲(chǔ)空間中讀取到的節(jié)點(diǎn)3的順序計(jì)數(shù)值進(jìn)行判斷,若判斷出發(fā)生了變化,則確定節(jié)點(diǎn)3在線,否則,確定節(jié)點(diǎn)3不在線。
節(jié)點(diǎn)3在從存儲(chǔ)空間中讀取到所有節(jié)點(diǎn)的順序計(jì)數(shù)值之后,針對(duì)節(jié)點(diǎn)1,會(huì)根據(jù)本節(jié)點(diǎn)3中保存的節(jié)點(diǎn)1的順序計(jì)數(shù)值,判斷節(jié)點(diǎn)1的順序計(jì)數(shù)值在第二預(yù)定時(shí)間內(nèi)是否發(fā)生了變化,若發(fā)生了變化,則確定節(jié)點(diǎn)1在線,否則,確定節(jié)點(diǎn)1不在線,針對(duì)節(jié)點(diǎn)2,依然會(huì)按照現(xiàn)有技術(shù),根據(jù)從存儲(chǔ)空間中讀取到的節(jié)點(diǎn)2的順序計(jì)數(shù)值進(jìn)行判斷,若判斷出發(fā)生了變化,則確定節(jié)點(diǎn)2在線,否則,確定節(jié)點(diǎn)2不在線。
其中,上述第二預(yù)定時(shí)間可以為第二值T2的整數(shù)倍,例如,當(dāng)T2=10秒時(shí),該第二預(yù)定時(shí)間可以為20秒。
然后,節(jié)點(diǎn)2也發(fā)生了過(guò)載。
節(jié)點(diǎn)2在檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),也會(huì)執(zhí)行如圖3所示的步驟。
節(jié)點(diǎn)1和節(jié)點(diǎn)3在檢測(cè)到節(jié)點(diǎn)2的狀態(tài)變?yōu)锳bnormal時(shí),會(huì)將本地保存的節(jié)點(diǎn)2的狀態(tài)更新為Abnormal。此時(shí),節(jié)點(diǎn)1和節(jié)點(diǎn)2的狀態(tài)均為Abnormal,節(jié)點(diǎn)3的狀態(tài)為Normal。
節(jié)點(diǎn)1在接收到節(jié)點(diǎn)2發(fā)來(lái)的順序計(jì)數(shù)值之后,會(huì)保存該順序計(jì)數(shù)值。這樣,節(jié)點(diǎn)1在執(zhí)行讀心跳操作時(shí),從存儲(chǔ)空間中讀取到所有節(jié)點(diǎn)的順序計(jì)數(shù)值之后,針對(duì)節(jié)點(diǎn)2,根據(jù)本節(jié)點(diǎn)1中保存的節(jié)點(diǎn)2的順序計(jì)數(shù)值,判斷節(jié)點(diǎn)2的順序計(jì)數(shù)值在第二預(yù)定時(shí)間內(nèi)是否發(fā)生了變化,若發(fā)生了變化,則確定節(jié)點(diǎn)2在線,否則,確定節(jié)點(diǎn)2不在線;針對(duì)節(jié)點(diǎn)3,依然會(huì)按照現(xiàn)有技術(shù),根據(jù)從存儲(chǔ)空間中讀取到的節(jié)點(diǎn)3的順序計(jì)數(shù)值進(jìn)行判斷,若判斷出發(fā)生了變化,則確定節(jié)點(diǎn)3在線,否則,確定節(jié)點(diǎn)3不在線。
節(jié)點(diǎn)3在接收到節(jié)點(diǎn)2發(fā)來(lái)的順序計(jì)數(shù)值之后,會(huì)保存該順序計(jì)數(shù)值。這樣,節(jié)點(diǎn)3在執(zhí)行讀心跳操作時(shí),從存儲(chǔ)空間中讀取到所有節(jié)點(diǎn)的順序計(jì)數(shù)值之后,針對(duì)節(jié)點(diǎn)1和節(jié)點(diǎn)2中的任一其它節(jié)點(diǎn),會(huì)根據(jù)本節(jié)點(diǎn)3中保存的該其它節(jié)點(diǎn)的順序計(jì)數(shù)值,判斷該其它節(jié)點(diǎn)的順序計(jì)數(shù)值在第二預(yù)定時(shí)間內(nèi)是否發(fā)生了變化,若發(fā)生了變化,則確定該其它節(jié)點(diǎn)在線,否則,確定該其它節(jié)點(diǎn)不在線。
之后,節(jié)點(diǎn)1的負(fù)載恢復(fù)正常。
節(jié)點(diǎn)1在檢測(cè)到本節(jié)點(diǎn)的負(fù)載恢復(fù)正常時(shí),會(huì)將本節(jié)點(diǎn)的狀態(tài)從Abnormal切換為Normal。節(jié)點(diǎn)2和節(jié)點(diǎn)3可以檢測(cè)到節(jié)點(diǎn)1的狀態(tài)變化,將本地保存的節(jié)點(diǎn)1的狀態(tài)更新為Normal,此時(shí),節(jié)點(diǎn)1和節(jié)點(diǎn)3的狀態(tài)為Normal,節(jié)點(diǎn)2的狀態(tài)為Abnormal。
與判斷本節(jié)點(diǎn)的負(fù)載是否過(guò)載類似,判斷本節(jié)點(diǎn)的負(fù)載是否恢復(fù)正常的方式為:
在上述情況一中,檢測(cè)本節(jié)點(diǎn)的負(fù)載是否恢復(fù)正常的方式為:判斷獲取到的負(fù)載信息的數(shù)值是否不大于預(yù)設(shè)閾值,若是,則確定本節(jié)點(diǎn)的負(fù)載恢復(fù)正常,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有恢復(fù)正常。
在上述情況二中,檢測(cè)本節(jié)點(diǎn)的負(fù)載是否恢復(fù)正常的方式為:若獲取到的每一個(gè)負(fù)載信息的數(shù)值均不大于對(duì)應(yīng)的預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載恢復(fù)正常,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有恢復(fù)正常。
節(jié)點(diǎn)1在Normal狀態(tài)時(shí),由于節(jié)點(diǎn)1當(dāng)前的心跳周期為10秒,并且當(dāng)前執(zhí)行的是第二寫(xiě)心跳周期,因此,會(huì)執(zhí)行如圖4所示的步驟:
步驟S301,判斷所有其它節(jié)點(diǎn)的狀態(tài)是否均為Normal,即,判斷本地保存的節(jié)點(diǎn)2和節(jié)點(diǎn)3的狀態(tài)是否均為Normal,若是,則執(zhí)行步驟S302,否則,執(zhí)行步驟S304;
步驟S302,停止執(zhí)行第二寫(xiě)心跳操作,獲取第二寫(xiě)心跳操作的最新順序計(jì)數(shù)值N,將本節(jié)點(diǎn)的心跳周期更新為2秒;
步驟S303,按照2秒周期性的執(zhí)行第一寫(xiě)心跳操作和讀心跳操作,其中,執(zhí)行第一寫(xiě)心跳操作時(shí)寫(xiě)入的順序計(jì)數(shù)值的起始值為N或N+1,之后退出本流程。
步驟S304,繼續(xù)按照10秒周期性的執(zhí)行第二寫(xiě)心跳操作和讀心跳操作,之后退出本流程。
由于節(jié)點(diǎn)1在步驟S301中判斷出節(jié)點(diǎn)2的狀態(tài)為Abnormal,節(jié)點(diǎn)3的狀態(tài)為Normal,因此,會(huì)執(zhí)行步驟S304,繼續(xù)以10秒為周期執(zhí)行第二寫(xiě)心跳操作和讀心跳操作。
后續(xù),節(jié)點(diǎn)2的負(fù)載也恢復(fù)正常。
節(jié)點(diǎn)2在檢測(cè)到本節(jié)點(diǎn)的負(fù)載恢復(fù)正常時(shí),也會(huì)將本節(jié)點(diǎn)的狀態(tài)從Abnormal切換為Normal,并且,由于節(jié)點(diǎn)2當(dāng)前的心跳周期為10秒,且當(dāng)前執(zhí)行的是第二寫(xiě)心跳周期,因此,也會(huì)執(zhí)行如圖4所示的流程。此時(shí),節(jié)點(diǎn)2會(huì)在步驟S301中判斷出節(jié)點(diǎn)1和節(jié)點(diǎn)3的狀態(tài)均為Normal,從而執(zhí)行步驟S302和步驟S303,切換為以2秒為周期執(zhí)行第一寫(xiě)心跳操作和讀心跳操作。
節(jié)點(diǎn)1和節(jié)點(diǎn)3可以檢測(cè)到節(jié)點(diǎn)2的狀態(tài)從Abnormal切換為Normal,從而將本地保存的節(jié)點(diǎn)2的狀態(tài)更新為Normal。
其中,節(jié)點(diǎn)1在檢測(cè)到節(jié)點(diǎn)2的狀態(tài)從Abnormal切換為Normal后,由于節(jié)點(diǎn)1當(dāng)前的狀態(tài)為Normal,當(dāng)前的心跳周期為10秒,且當(dāng)前執(zhí)行的是第二寫(xiě)心跳操作,因此,節(jié)點(diǎn)1會(huì)執(zhí)行如圖4所示的步驟。此時(shí),節(jié)點(diǎn)1會(huì)在步驟S301中判斷出節(jié)點(diǎn)2和節(jié)點(diǎn)3的狀態(tài)均為Normal,從而執(zhí)行步驟S302和步驟S303,切換以2秒為周期執(zhí)行第一寫(xiě)心跳操作和讀心跳操作。
節(jié)點(diǎn)3在檢測(cè)到節(jié)點(diǎn)2的狀態(tài)從Abnormal切換為Normal時(shí),由于節(jié)點(diǎn)3當(dāng)前的狀態(tài)為Normal,當(dāng)前的心跳周期為10秒,且當(dāng)前執(zhí)行的是第一寫(xiě)心跳操作,因此,節(jié)點(diǎn)3會(huì)執(zhí)行如圖5所示的步驟:
步驟S401,判斷所有其它節(jié)點(diǎn)的狀態(tài)是否均為Normal,即,判斷本地保存的節(jié)點(diǎn)1和節(jié)點(diǎn)2的狀態(tài)是否均為Normal,若是,則執(zhí)行步驟S402,否則,執(zhí)行步驟S403;
步驟S402,將本節(jié)點(diǎn)的心跳周期更新為2秒,之后退出本流程。
步驟S403,繼續(xù)按照當(dāng)前的心跳周期10秒,周期性的執(zhí)行第一寫(xiě)心跳操作和讀心跳操作,之后退出本流程。
由于節(jié)點(diǎn)3在步驟S401中判斷出節(jié)點(diǎn)1和節(jié)點(diǎn)2的狀態(tài)均為Normal,因此,會(huì)執(zhí)行步驟S402,從而以2秒為周期執(zhí)行第一寫(xiě)心跳操作和讀心跳操作。
由上可見(jiàn),節(jié)點(diǎn)在檢測(cè)到本節(jié)點(diǎn)的負(fù)載發(fā)生了過(guò)載時(shí),會(huì)以更大的第二值為周期執(zhí)行向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值的第二寫(xiě)心跳操作,另外,在檢測(cè)到本節(jié)點(diǎn)的負(fù)載恢復(fù)正常,并且所有其它節(jié)點(diǎn)的狀態(tài)均為Normal時(shí),才會(huì)恢復(fù)為以較小的第一值為周期執(zhí)行向存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值的第一寫(xiě)心跳操作。依據(jù)本節(jié)點(diǎn)的負(fù)載情況進(jìn)行第一寫(xiě)心跳操作與第二寫(xiě)心跳操作之間的切換,減少了讀寫(xiě)心跳的延時(shí),確保了共享文件系統(tǒng)的正常讀寫(xiě)心跳機(jī)制的實(shí)現(xiàn)。
與前述心跳實(shí)現(xiàn)方法的實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了心跳實(shí)現(xiàn)裝置的實(shí)施例。
本申請(qǐng)心跳實(shí)現(xiàn)裝置60的實(shí)施例可以應(yīng)用在共享文件系統(tǒng)中的任一節(jié)點(diǎn)上。裝置實(shí)施例可以通過(guò)軟件實(shí)現(xiàn),也可以通過(guò)硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為一個(gè)邏輯意義上的裝置,是通過(guò)其所在節(jié)點(diǎn)的處理器10將非易失性存儲(chǔ)器50中對(duì)應(yīng)的計(jì)算機(jī)程序指令讀取到內(nèi)存40中運(yùn)行形成的。從硬件層面而言,如圖6所示,為本申請(qǐng)心跳實(shí)現(xiàn)裝置所在節(jié)點(diǎn)的一種硬件結(jié)構(gòu)圖,除了圖6所示的處理器10、內(nèi)部總線20、網(wǎng)絡(luò)接口30、內(nèi)存40、以及非易失性存儲(chǔ)器50之外,實(shí)施例中裝置所在的節(jié)點(diǎn)通常根據(jù)該節(jié)點(diǎn)的實(shí)際功能,還可以包括其他硬件,對(duì)此不再贅述。
請(qǐng)參考圖7,本申請(qǐng)實(shí)施例的心跳實(shí)現(xiàn)裝置60中包括以下單元:檢測(cè)單元601、狀態(tài)切換單元602和寫(xiě)心跳執(zhí)行單元603,其中:
檢測(cè)單元601,用于檢測(cè)本節(jié)點(diǎn)的負(fù)載情況;
狀態(tài)切換單元602,用于在檢測(cè)單元601檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),將本節(jié)點(diǎn)的狀態(tài)從正常切換為非正常;
寫(xiě)心跳執(zhí)行單元603,用于按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,第一寫(xiě)心跳操作為向共享的存儲(chǔ)空間中寫(xiě)入順序計(jì)數(shù)值;還用于在檢測(cè)單元601檢測(cè)到本節(jié)點(diǎn)的負(fù)載過(guò)載時(shí),停止執(zhí)行第一寫(xiě)心跳操作,獲取第一寫(xiě)心跳操作的最新順序計(jì)數(shù)值M,將本節(jié)點(diǎn)的心跳周期更新為第二值,按照第二值周期性的執(zhí)行第二寫(xiě)心跳操作,并將寫(xiě)入的順序計(jì)數(shù)值發(fā)送給除本節(jié)點(diǎn)以外的其它節(jié)點(diǎn),第二寫(xiě)心跳操作為向本節(jié)點(diǎn)中寫(xiě)入順序計(jì)數(shù)值,其中,寫(xiě)入的順序計(jì)數(shù)值的起始值為M或M+1,第二值大于第一值。
其中,檢測(cè)單元601,還用于檢測(cè)其它節(jié)點(diǎn)的狀態(tài);
寫(xiě)心跳執(zhí)行單元603,還用于在檢測(cè)單元601檢測(cè)到任一其它節(jié)點(diǎn)的狀態(tài)從正常切換為非正常時(shí),若本節(jié)點(diǎn)的心跳周期為第一值,則將本節(jié)點(diǎn)的心跳周期更新為第二值。
如圖8所示,上述心跳實(shí)現(xiàn)裝置60中還包括:接收單元604和讀心跳執(zhí)行單元605,其中:
接收單元604,用于接收其它節(jié)點(diǎn)發(fā)來(lái)的順序計(jì)數(shù)值,保存該順序計(jì)數(shù)值;
讀心跳執(zhí)行單元605,用于在執(zhí)行讀心跳操作時(shí),判斷本節(jié)點(diǎn)中保存的該其它節(jié)點(diǎn)的順序計(jì)數(shù)值在預(yù)定時(shí)間內(nèi)是否發(fā)生了改變,若是,則確定該其它節(jié)點(diǎn)在線,否則,確定該其它節(jié)點(diǎn)不在線。
如圖8所示,上述心跳實(shí)現(xiàn)裝置60中還包括:判斷單元606,其中:
狀態(tài)切換單元602,還用于在檢測(cè)單元601檢測(cè)到本節(jié)點(diǎn)的負(fù)載恢復(fù)正常時(shí),將本節(jié)點(diǎn)的狀態(tài)從非正常切換為正常;
判斷單元605,用于當(dāng)本節(jié)點(diǎn)的狀態(tài)為正常時(shí),判斷所有其它節(jié)點(diǎn)的狀態(tài)是否均為正常;
寫(xiě)心跳執(zhí)行單元603,還用于若判斷單元605判斷出所有其它節(jié)點(diǎn)的狀態(tài)均為正常,則在本節(jié)點(diǎn)當(dāng)前執(zhí)行的是第二寫(xiě)心跳操作時(shí),停止執(zhí)行第二寫(xiě)心跳操作,獲取第二寫(xiě)心跳操作的最新順序計(jì)數(shù)值N,將本節(jié)點(diǎn)的心跳周期更新為第一值,按照第一值周期性的執(zhí)行第一寫(xiě)心跳操作,其中,執(zhí)行第一寫(xiě)心跳操作時(shí)寫(xiě)入的順序計(jì)數(shù)值的起始值為N或N+1;在本節(jié)點(diǎn)當(dāng)前執(zhí)行的是第一寫(xiě)心跳操作時(shí),若本節(jié)點(diǎn)的心跳周期為第二值,則將本節(jié)點(diǎn)的心跳周期更新為第一值。
如圖8所示,上述心跳實(shí)現(xiàn)裝置60中還包括:獲取單元607,用于獲取本節(jié)點(diǎn)的負(fù)載信息;則,
當(dāng)獲取單元607獲取一種負(fù)載信息時(shí),檢測(cè)單元601具體用于通過(guò)以下方式檢測(cè)本節(jié)點(diǎn)的負(fù)載是否過(guò)載:若獲取單元607獲取到的負(fù)載信息的數(shù)值大于預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載過(guò)載,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有過(guò)載;檢測(cè)單元601具體用于通過(guò)以下方式檢測(cè)本節(jié)點(diǎn)是否恢復(fù)正常:若獲取單元607獲取到的負(fù)載信息的數(shù)值不大于預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載恢復(fù)正常,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有恢復(fù)正常;
當(dāng)獲取單元607獲取兩種以上負(fù)載信息時(shí),檢測(cè)單元601具體用于通過(guò)以下方式檢測(cè)本節(jié)點(diǎn)的負(fù)載是否過(guò)載:若獲取單元607獲取到的每一個(gè)負(fù)載信息的數(shù)值均大于對(duì)應(yīng)的預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載過(guò)載,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有過(guò)載;檢測(cè)單元604具體用于通過(guò)以下方式檢測(cè)本節(jié)點(diǎn)是否恢復(fù)正常:若獲取單元607獲取到的每一個(gè)負(fù)載信息的數(shù)值均不大于對(duì)應(yīng)的預(yù)設(shè)閾值,則確定本節(jié)點(diǎn)的負(fù)載恢復(fù)正常,否則,確定本節(jié)點(diǎn)的負(fù)載沒(méi)有恢復(fù)正常。
上述裝置中各個(gè)單元的功能和作用的實(shí)現(xiàn)過(guò)程具體詳見(jiàn)上述方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過(guò)程,在此不再贅述。
對(duì)于裝置實(shí)施例而言,由于其基本對(duì)應(yīng)于方法實(shí)施例,所以相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本申請(qǐng)方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。