本發(fā)明涉及網(wǎng)絡(luò)技術(shù)領(lǐng)域,特別涉及一種節(jié)點(diǎn)設(shè)備運(yùn)行方法及節(jié)點(diǎn)設(shè)備。
背景技術(shù):
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,基于集群為客戶端提供服務(wù)的方式越來越普遍。為了保證集群中各個(gè)節(jié)點(diǎn)設(shè)備保持一致性,節(jié)點(diǎn)設(shè)備運(yùn)行時(shí)一般可以應(yīng)用bft-raft(byzantinefaulttolerancealgorithm-raft,拜占庭容錯(cuò)筏算法)。
根據(jù)bft-raft,節(jié)點(diǎn)設(shè)備的工作狀態(tài)可以分為三種:跟隨狀態(tài)follower、候選狀態(tài)candidate和領(lǐng)導(dǎo)狀態(tài)leader。當(dāng)任一節(jié)點(diǎn)設(shè)備a運(yùn)行于跟隨狀態(tài)時(shí),可以根據(jù)該集群中運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備b所廣播的心跳信息,確定該節(jié)點(diǎn)設(shè)備b運(yùn)行正常,并基于節(jié)點(diǎn)設(shè)備b的指示復(fù)制日志。當(dāng)節(jié)點(diǎn)設(shè)備a在一段時(shí)間內(nèi)未接收到節(jié)點(diǎn)設(shè)備b的心跳信息,可以確定節(jié)點(diǎn)設(shè)備b運(yùn)行故障,并切換為候選狀態(tài)運(yùn)行,將投票請求廣播至集群中的各個(gè)節(jié)點(diǎn)設(shè)備,一旦接收到該集群中半數(shù)以上的節(jié)點(diǎn)設(shè)備的投票,節(jié)點(diǎn)設(shè)備a可以切換為領(lǐng)導(dǎo)狀態(tài)運(yùn)行,并將心跳信息廣播至集群中的各個(gè)節(jié)點(diǎn)設(shè)備、基于和客戶端的交互存儲日志、指示各個(gè)節(jié)點(diǎn)設(shè)備復(fù)制日志。需要說明的是,在運(yùn)行于候選狀態(tài)的節(jié)點(diǎn)設(shè)備a接收到心跳信息時(shí),如果該心跳信息攜帶的運(yùn)行周期信息小于該節(jié)點(diǎn)設(shè)備a的運(yùn)行周期信息,則節(jié)點(diǎn)設(shè)備a會(huì)忽略該心跳信息。
在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
由于一個(gè)集群可能分裂成網(wǎng)絡(luò)相隔離的兩個(gè)子集群,如,子集群a和子集群b,該子集群b中包括該集群中運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備a,且子集群a的節(jié)點(diǎn)設(shè)備數(shù)量小于子集群b的節(jié)點(diǎn)設(shè)備數(shù)量,則子集群a中的節(jié)點(diǎn)設(shè)備不能通過投票選出一個(gè)新的運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,因此子集群a的節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息隨時(shí)間遞增,當(dāng)子集群a與子集群b恢復(fù)網(wǎng)絡(luò)連接后,子集群a中的任一節(jié)點(diǎn)設(shè)備b可以接收到節(jié)點(diǎn)設(shè)備a的心跳信息,由于節(jié)點(diǎn)設(shè)備a的運(yùn)行周期信息小于節(jié)點(diǎn)設(shè)備b的運(yùn)行周期信息,則節(jié)點(diǎn)設(shè)備b會(huì)忽略該心跳信息,導(dǎo)致節(jié)點(diǎn)設(shè)備b無法加入原來的集群。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)的問題,本發(fā)明實(shí)施例提供了一種節(jié)點(diǎn)設(shè)備運(yùn)行方法及節(jié)點(diǎn)設(shè)備。所述技術(shù)方案如下:
一方面,提供了一種節(jié)點(diǎn)設(shè)備運(yùn)行方法,所述方法包括:
接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息;
如果當(dāng)前節(jié)點(diǎn)設(shè)備運(yùn)行于候選狀態(tài),從所述心跳信息中獲取運(yùn)行周期信息和最新日志索引;
如果所述心跳信息中的運(yùn)行周期信息小于所述當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息,且所述心跳信息中的最新日志索引大于等于所述當(dāng)前節(jié)點(diǎn)設(shè)備的最新日志索引,將所述當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息同步為所述心跳信息中的運(yùn)行周期信息,并將當(dāng)前工作狀態(tài)切換為跟隨狀態(tài)運(yùn)行或保持所述候選狀態(tài)。
另一方面,提供了一種節(jié)點(diǎn)設(shè)備,所述節(jié)點(diǎn)設(shè)備包括:
接收模塊,用于接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息;
獲取模塊,用于如果當(dāng)前節(jié)點(diǎn)設(shè)備運(yùn)行于候選狀態(tài),從所述心跳信息中獲取運(yùn)行周期信息和最新日志索引;
運(yùn)行模塊,用于如果所述心跳信息中的運(yùn)行周期信息小于所述當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息,且所述心跳信息中的最新日志索引大于等于所述當(dāng)前節(jié)點(diǎn)設(shè)備的最新日志索引,將所述當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息同步為所述心跳信息中的運(yùn)行周期信息,并將當(dāng)前工作狀態(tài)切換為跟隨狀態(tài)運(yùn)行或保持所述候選狀態(tài)。
本發(fā)明實(shí)施例通過在接收到心跳信息時(shí),獲取心跳中的運(yùn)行周期信息和最新日志索引,如果獲取的運(yùn)行周期信息小于自身的運(yùn)行周期信息,且獲取的最新日志索不小于自身的最新日志索引,則將自身的運(yùn)行周期信息同步為該心跳信息中的運(yùn)行周期信息,并將自身的工作狀態(tài)切換為跟隨狀態(tài)或保持候選狀態(tài),使得切換為跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備可以直接根據(jù)本次心跳信息與第二子集群合為一個(gè)系統(tǒng)工作,或者保持候選狀態(tài)的節(jié)點(diǎn)設(shè)備可以當(dāng)再次接收到心跳信息時(shí),依據(jù)自身的運(yùn)行周期信息和最新日志索引均不大于心跳信息中的對應(yīng)兩項(xiàng),切換為跟隨狀態(tài)運(yùn)行,進(jìn)而也能和第二子集群合為一個(gè)系統(tǒng)工作,提高了系統(tǒng)的工作可靠性。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備運(yùn)行的實(shí)施環(huán)境示意圖;
圖2是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備工作狀態(tài)的切換示意圖;
圖3是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備運(yùn)行方法的流程圖;
圖4是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備的模塊示意圖;
圖5是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備的模塊示意圖;
圖6是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備運(yùn)行的實(shí)施環(huán)境示意圖。參見圖1,該實(shí)施環(huán)境為一個(gè)由多個(gè)節(jié)點(diǎn)設(shè)備構(gòu)成的系統(tǒng),該系統(tǒng)也相當(dāng)于一個(gè)集群,節(jié)點(diǎn)設(shè)備2為該系統(tǒng)中運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,在節(jié)點(diǎn)設(shè)備2運(yùn)行正常時(shí),可以定時(shí)地向各個(gè)運(yùn)行于跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備廣播心跳信息,如,節(jié)點(diǎn)設(shè)備3、節(jié)點(diǎn)設(shè)備4,每個(gè)運(yùn)行于跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備在接收到心跳信息時(shí)可以確定節(jié)點(diǎn)設(shè)備1運(yùn)行正常,并重置定時(shí)器(一般為0.5-1秒之間的隨機(jī)值,這樣可以避免各個(gè)節(jié)點(diǎn)設(shè)備的定時(shí)器的計(jì)時(shí)時(shí)長相同可能造成反復(fù)選舉的情況),等待下一次心跳信息。
事實(shí)上,系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備的工作狀態(tài)是可以動(dòng)態(tài)切換的,參見圖2,本發(fā)明實(shí)施例提供了一種節(jié)點(diǎn)設(shè)備工作狀態(tài)的切換示意圖。一旦運(yùn)行于跟隨狀態(tài)(follower)的節(jié)點(diǎn)設(shè)備在定時(shí)器超時(shí)的情況下沒有接收到心跳信息,可以確定運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備運(yùn)行故障,并切換為候選狀態(tài)(candidate)運(yùn)行;進(jìn)而,節(jié)點(diǎn)設(shè)備可以重置定時(shí)器,并廣播投票請求,直到接收到該系統(tǒng)中半數(shù)以上的投票確認(rèn)消息切換為領(lǐng)導(dǎo)狀態(tài)(leader)運(yùn)行,或者接收到運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息時(shí)切換為跟隨狀態(tài)運(yùn)行,或者定時(shí)器超時(shí)的情況下保持候選狀態(tài)開始新一輪選舉;運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備可以在發(fā)現(xiàn)比自身具有更高運(yùn)行周期信息(term)的節(jié)點(diǎn)設(shè)備時(shí)切換為跟隨狀態(tài)運(yùn)行。
在該系統(tǒng)為客戶端提供服務(wù)時(shí),當(dāng)該系統(tǒng)中的任一節(jié)點(diǎn)設(shè)備接收到客戶端的服務(wù)命令時(shí),可以將該服務(wù)命令重定向至節(jié)點(diǎn)設(shè)備2,由節(jié)點(diǎn)設(shè)備2向各個(gè)節(jié)點(diǎn)設(shè)備廣播日志添加請求,該日志添加請求用于請求將該服務(wù)命令添加到日志中,如果節(jié)點(diǎn)設(shè)備2可以接收到各個(gè)節(jié)點(diǎn)設(shè)備對日志添加請求的確認(rèn)消息,可以響應(yīng)該客戶端的服務(wù)命令,將該服務(wù)命令添加到日志中,并向各個(gè)節(jié)點(diǎn)設(shè)備廣播日志復(fù)制指令,使得各個(gè)節(jié)點(diǎn)設(shè)備將該服務(wù)命令復(fù)制到日志中。在實(shí)際的應(yīng)用場景中,該系統(tǒng)可以是底層基于區(qū)塊鏈技術(shù)的交易系統(tǒng),該服務(wù)命令可以為客戶端的交易信息,每個(gè)節(jié)點(diǎn)設(shè)備所存儲的日志可以對應(yīng)一條區(qū)塊鏈,當(dāng)添加交易信息到日志中時(shí),實(shí)際是將該交易信息存儲到當(dāng)前區(qū)塊的下一區(qū)塊中,由于已存儲至區(qū)塊鏈中的數(shù)據(jù)不可更改,可以有效地防止交易信息被篡改,提高交易信息的安全性。
由于網(wǎng)絡(luò)中斷等原因,該系統(tǒng)中的各個(gè)節(jié)點(diǎn)設(shè)備可能分裂形成兩個(gè)網(wǎng)絡(luò)相隔的子集群,即第一子集群和第二子集群,且第一子集群的節(jié)點(diǎn)設(shè)備數(shù)量小于第二子集群的節(jié)點(diǎn)設(shè)備數(shù)量。該第二子集群中包括該系統(tǒng)中運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備2。進(jìn)而,該第二子集群中運(yùn)行于跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備可以依據(jù)該節(jié)點(diǎn)設(shè)備2定時(shí)廣播的心跳信息繼續(xù)正常工作;第一子集群由于和節(jié)點(diǎn)設(shè)備2的網(wǎng)絡(luò)中斷,其中運(yùn)行于跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備在定時(shí)器超時(shí)的情況下也不能接收到節(jié)點(diǎn)設(shè)備2的心跳信息,依據(jù)bft-raft的超時(shí)選舉機(jī)制,運(yùn)行于跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備會(huì)切換為候選狀態(tài)運(yùn)行,重置定時(shí)器,將自身的運(yùn)行周期信息加一,并廣播投票請求。然而,由于該第一子集群的節(jié)點(diǎn)設(shè)備數(shù)量小于系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的一半,因此該第一子集群中的任一節(jié)點(diǎn)設(shè)備都不能接收到大于該系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的一般的投票請求,導(dǎo)致直到各個(gè)節(jié)點(diǎn)和設(shè)備的計(jì)時(shí)器超時(shí),該第一子集群中也不能選出領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,則第一子集群中的節(jié)點(diǎn)設(shè)備會(huì)保持候選狀態(tài),但在定時(shí)器超時(shí)的情況下再次重置定時(shí)器,將自身的運(yùn)行周期信息加一,并廣播投票請求,如果第一子集群和第二子集群恢復(fù)網(wǎng)絡(luò)連接,依照現(xiàn)有技術(shù),即使該第一子集群中的節(jié)點(diǎn)設(shè)備接收到節(jié)點(diǎn)設(shè)備2的心跳信息,但由于該心跳信息中的運(yùn)行周期信息小于該第二子集群中的節(jié)點(diǎn)設(shè)備的投票請求,該第一子集群中的節(jié)點(diǎn)設(shè)備也會(huì)忽略節(jié)點(diǎn)設(shè)備2的心跳信息,并繼續(xù)等待其他節(jié)點(diǎn)設(shè)備的投票或者接收到有資格成為領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息,直到定時(shí)器再次超時(shí),如此循環(huán)。
圖3是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備運(yùn)行方法的流程圖,參見圖3,該方法可以應(yīng)用于圖1所示實(shí)施例的節(jié)點(diǎn)設(shè)備1,具體包括以下步驟:
301、節(jié)點(diǎn)設(shè)備1接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息。
其中,該節(jié)點(diǎn)設(shè)備1運(yùn)行于候選狀態(tài),可以在選舉開始時(shí)基于自身的運(yùn)行周期信息、最新日志索引(lastlogindex)和節(jié)點(diǎn)設(shè)備標(biāo)識生成投票請求,并廣播該投票請求。該運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備可以為圖1所示實(shí)施例中第二子集群中的節(jié)點(diǎn)設(shè)備2。由于該第一子集群的節(jié)點(diǎn)設(shè)備數(shù)量小于系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的一半,該第一子集群中的任一節(jié)點(diǎn)設(shè)備都不能接收到超過系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的一半的投票,則第一子集群中始終不能選出領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,進(jìn)而導(dǎo)致節(jié)點(diǎn)設(shè)備1始終運(yùn)行于候選狀態(tài),并在每次定時(shí)器超時(shí)后遞增自身的運(yùn)行周期信息,開始一輪新的選舉。心跳信息由第二子集群中的節(jié)點(diǎn)設(shè)備2定時(shí)廣播,可以攜帶該節(jié)點(diǎn)設(shè)備2的運(yùn)行周期信息、最新日志索引和節(jié)點(diǎn)設(shè)備標(biāo)識等。在第一子集群和第二子集群恢復(fù)網(wǎng)絡(luò)連接時(shí),該節(jié)點(diǎn)設(shè)備2所廣播的心跳信息可以被該運(yùn)行于候選狀態(tài)的節(jié)點(diǎn)設(shè)備接收到。
302、如果節(jié)點(diǎn)設(shè)備1運(yùn)行于候選狀態(tài),節(jié)點(diǎn)設(shè)備1從心跳信息中獲取運(yùn)行周期信息和最新日志索引。
其中,運(yùn)行周期信息是指發(fā)送該心跳信息的節(jié)點(diǎn)設(shè)備當(dāng)前所處的運(yùn)行周期號。每次進(jìn)行選舉時(shí),由跟隨狀態(tài)切換為候選狀態(tài)的節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息會(huì)加一,最終成為領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備可以將運(yùn)行周期信息攜帶在心跳信息中,并廣播給其他節(jié)點(diǎn)設(shè)備,接收到心跳信息的候選狀態(tài)的節(jié)點(diǎn)設(shè)備可以切換為跟隨狀態(tài)運(yùn)行,并將自身的運(yùn)行周期信息同步為該心跳信息中的運(yùn)行周期信息,因此,該運(yùn)行周期信息可以表征一個(gè)節(jié)點(diǎn)設(shè)備是否始終與運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備保持同步且運(yùn)行正常。最新日志索引是指發(fā)送該心跳信息的節(jié)點(diǎn)設(shè)備最新存儲的日志的索引,每次運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備添加新的日志后,該最新日志索引加一,且該運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備可以將日志復(fù)制指令廣播給其他節(jié)點(diǎn)設(shè)備,使得接收到日志復(fù)制指令的節(jié)點(diǎn)設(shè)備可以同步該領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的日志和最新日志索引,因此,該最新日志索引可以表征一個(gè)節(jié)點(diǎn)設(shè)備的日志完整性,顯然,運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備為在其系統(tǒng)中日志完整性最好的節(jié)點(diǎn)設(shè)備。
該步驟中,節(jié)點(diǎn)設(shè)備1可以分別按照運(yùn)行周期信息和最新日志索引在心跳信息中的協(xié)議位置,從心跳信息中分別提取出對應(yīng)協(xié)議位置的運(yùn)行周期信息和最新日志索引。
在實(shí)際的應(yīng)用場景中,為了避免有的網(wǎng)絡(luò)設(shè)備偽裝成領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備來發(fā)送心跳信息,提高系統(tǒng)的安全性,該心跳信息需攜帶系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備在響應(yīng)運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的投票請求時(shí)的簽名。當(dāng)接收到該心跳信息時(shí),如果節(jié)點(diǎn)設(shè)備1運(yùn)行于候選狀態(tài),可以從心跳信息中獲取多個(gè)簽名;如果多個(gè)簽名的數(shù)量大于系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的半數(shù),且多個(gè)簽名均驗(yàn)證通過,從心跳信息中獲取運(yùn)行周期信息和最新日志索引。該系統(tǒng)中的每個(gè)節(jié)點(diǎn)設(shè)備可以配置有自身的私鑰以及各個(gè)節(jié)點(diǎn)設(shè)備的公鑰。節(jié)點(diǎn)設(shè)備1可以從心跳信息中提取出各個(gè)節(jié)點(diǎn)設(shè)備的簽名作為該多個(gè)簽名,并采用已配置的任一節(jié)點(diǎn)設(shè)備的公鑰對該節(jié)點(diǎn)設(shè)備的簽名進(jìn)行驗(yàn)證,如果各個(gè)節(jié)點(diǎn)設(shè)備的簽名均驗(yàn)證通過,且驗(yàn)證通過的簽名數(shù)量大于該系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的一半,說明該心跳信息確實(shí)來自運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,則可以從心跳信息中獲取運(yùn)行周期信息和最新日志索引,并繼續(xù)執(zhí)行步驟302。
303、節(jié)點(diǎn)設(shè)備1判斷心跳信息中的運(yùn)行周期信息是否小于節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息,如果是,執(zhí)行步驟304,如果否,忽略該心跳信息。
該步驟中,為了印證該系統(tǒng)目前處于分裂后的子集群之間已恢復(fù)網(wǎng)絡(luò)連接,且第一子集群內(nèi)的節(jié)點(diǎn)設(shè)備正在進(jìn)行選舉的實(shí)施場景,考慮到第一子集群和第二子集群在初始分裂時(shí)系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息相同,則在分裂后該第一子集群不斷進(jìn)行選舉的過程中節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息會(huì)不斷遞增,而第二子集群由于節(jié)點(diǎn)設(shè)備2運(yùn)行正常,其中的節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息會(huì)保持不變,因此運(yùn)行周期信息可以作為上述實(shí)施場景的印證依據(jù)之一,如果心跳信息中的運(yùn)行周期信息小于該節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息,上述實(shí)施場景得到印證,則繼續(xù)執(zhí)行步驟304,如果該心跳信息中的運(yùn)行周期信息不小于節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息,說明不符合上述實(shí)施場景,可以忽略該心跳信息,但由于該條件符合選舉出新的領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的情況之一,則節(jié)點(diǎn)設(shè)備1也可以繼續(xù)執(zhí)行步驟304(事實(shí)上,該情況屬于系統(tǒng)中正常選舉的情況,本發(fā)明實(shí)施例不限定節(jié)點(diǎn)設(shè)備1如何處理)。
304、節(jié)點(diǎn)設(shè)備1判斷心跳信息中的最新日志索引是否大于等于當(dāng)前節(jié)點(diǎn)設(shè)備的最新日志索引,如果是,將節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息同步為心跳信息中的運(yùn)行周期信息,并將當(dāng)前工作狀態(tài)切換為跟隨狀態(tài)運(yùn)行,如果否,忽略該心跳信息。
考慮到在系統(tǒng)分裂之前,該系統(tǒng)中的各個(gè)節(jié)點(diǎn)設(shè)備的日志理應(yīng)與節(jié)點(diǎn)設(shè)備2的日志同步,因此第二子集群經(jīng)過為客戶端服務(wù)的一段時(shí)間,在兩個(gè)子集群恢復(fù)網(wǎng)絡(luò)連接之后,節(jié)點(diǎn)設(shè)備2所存儲的日志應(yīng)該不少于該節(jié)點(diǎn)設(shè)備1所存儲的日志,也因此可以將最新日志索引作為印證上述實(shí)施場景的依據(jù)之一,如果多個(gè)節(jié)點(diǎn)設(shè)備的投票請求中的最新日志索引均不小于節(jié)點(diǎn)設(shè)備1的最新日志索引,說明該投票請求對應(yīng)的節(jié)點(diǎn)設(shè)備已存儲的日志量等于或多于節(jié)點(diǎn)設(shè)備1的日志量,上述實(shí)施場景最終得到各項(xiàng)印證,因此節(jié)點(diǎn)設(shè)備1可以將節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息同步為心跳信息中的運(yùn)行周期信息,并切換為跟隨狀態(tài)運(yùn)行,如果該心跳信息中的最新日志索引小于節(jié)點(diǎn)設(shè)備1的最新日志索引,上述實(shí)施場景沒有得到印證,則可以忽略該心跳信息。
當(dāng)然,如果節(jié)點(diǎn)設(shè)備1切換為跟隨狀態(tài),還需要重置定時(shí)器,并且基于當(dāng)節(jié)點(diǎn)設(shè)備1的最新日志索引和心跳信息中的最新日志索引,確定節(jié)點(diǎn)設(shè)備1需要添加的日志索引;向運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備發(fā)送日志添加請求。該日志添加請求可以攜帶需要添加的日志索引,使得節(jié)點(diǎn)設(shè)備2接收到日志添加請求時(shí),可以將需要添加的日志索引對應(yīng)的日志返回給節(jié)點(diǎn)設(shè)備1。
事實(shí)上,節(jié)點(diǎn)設(shè)備1也可以將節(jié)點(diǎn)設(shè)備1的運(yùn)行周期信息同步為心跳信息中的運(yùn)行周期信息,并保持候選狀態(tài)運(yùn)行。該實(shí)現(xiàn)方式中,節(jié)點(diǎn)設(shè)備1可以直到再次接收到節(jié)點(diǎn)設(shè)備2的心跳信息時(shí)切換為跟隨狀態(tài)運(yùn)行,并同步該節(jié)點(diǎn)設(shè)備2的日志。
需要說明的是,本發(fā)明實(shí)施例對節(jié)點(diǎn)設(shè)備1執(zhí)行步驟303和304的時(shí)序不做具體限定,事實(shí)上,節(jié)點(diǎn)設(shè)備1也可以先對最新日志索引進(jìn)行判斷,再對運(yùn)行周期信息進(jìn)行判斷,或者,為了提高判斷效率,并盡快使得第一子集群和第二子集群合為一個(gè)系統(tǒng)工作,節(jié)點(diǎn)設(shè)備1也可以同時(shí)對最新日志索引和運(yùn)行周期信息進(jìn)行判斷,只要二者分別滿足上述各自的判斷條件,節(jié)點(diǎn)設(shè)備1即可將當(dāng)前工作狀態(tài)切換至跟隨狀態(tài)(或保持候選狀態(tài))。
基于上述節(jié)點(diǎn)設(shè)備運(yùn)行方法,原來為該第一子集群中的運(yùn)行于候選狀態(tài)的任一節(jié)點(diǎn)設(shè)備均能與該第二子集群合為一個(gè)系統(tǒng)工作。
本發(fā)明實(shí)施例通過在接收到心跳信息時(shí),獲取心跳中的運(yùn)行周期信息和最新日志索引,如果獲取的運(yùn)行周期信息小于自身的運(yùn)行周期信息,且獲取的最新日志索不小于自身的最新日志索引,則將自身的運(yùn)行周期信息同步為該心跳信息中的運(yùn)行周期信息,并將自身的工作狀態(tài)切換為跟隨狀態(tài)或保持候選狀態(tài),使得切換為跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備可以直接根據(jù)本次心跳信息與第二子集群合為一個(gè)系統(tǒng)工作,或者保持候選狀態(tài)的節(jié)點(diǎn)設(shè)備可以當(dāng)再次接收到心跳信息時(shí),依據(jù)自身的運(yùn)行周期信息和最新日志索引均不大于心跳信息中的對應(yīng)兩項(xiàng),切換為跟隨狀態(tài)運(yùn)行,進(jìn)而也能和第二子集群合為一個(gè)系統(tǒng)工作,提高了系統(tǒng)的工作可靠性。
305、節(jié)點(diǎn)設(shè)備1接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備所廣播的日志復(fù)制指令,基于該日志復(fù)制指令復(fù)制日志。
為了保證系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備都能存儲完整的日志,從而保證系統(tǒng)的一致性,該運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備可以在系統(tǒng)中的各個(gè)節(jié)點(diǎn)設(shè)備確定添加新的日志后廣播日志復(fù)制指令,使得該節(jié)點(diǎn)設(shè)備1可以接收到該日志復(fù)制指令,從而將該系統(tǒng)最新接收到的服務(wù)指令添加到日志中。當(dāng)然,基于bft-raft不僅解決節(jié)點(diǎn)設(shè)備一致性,而且解決了節(jié)點(diǎn)設(shè)備欺詐,數(shù)據(jù)被篡改、丟失或順序錯(cuò)亂的問題,該日志復(fù)制指令需攜帶系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備在響應(yīng)運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的投票請求時(shí)的簽名,使得節(jié)點(diǎn)設(shè)備1可以對該日志復(fù)制指令進(jìn)行驗(yàn)證,并在驗(yàn)證通過后進(jìn)行日志復(fù)制。
需要說明的是,在第一子集群和第二子集群在恢復(fù)網(wǎng)絡(luò)連接后,如果該系統(tǒng)中任一節(jié)點(diǎn)設(shè)備在定時(shí)器超時(shí)的情況下沒有接收到心跳信息,可以確定運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備運(yùn)行故障,則切換為候選狀態(tài),重置定時(shí)器,并廣播投票請求,直到接收到大于該系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的半數(shù)的投票請求時(shí)成為新的領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備,或者直到接收到新的領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息時(shí)切換為跟隨狀態(tài)。
圖4是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備的模塊示意圖。參見圖4,該節(jié)點(diǎn)設(shè)備具體包括:
接收模塊401,用于接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的心跳信息;
獲取模塊402,用于如果當(dāng)前節(jié)點(diǎn)設(shè)備運(yùn)行于候選狀態(tài),從心跳信息中獲取運(yùn)行周期信息和最新日志索引;
運(yùn)行模塊403,用于如果心跳信息中的運(yùn)行周期信息小于當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息,且心跳信息中的最新日志索引大于等于當(dāng)前節(jié)點(diǎn)設(shè)備的最新日志索引,并將當(dāng)前節(jié)點(diǎn)設(shè)備的運(yùn)行周期信息同步為心跳信息中的運(yùn)行周期信息,并將當(dāng)前工作狀態(tài)切換為跟隨狀態(tài)運(yùn)行或保持候選狀態(tài)。
本發(fā)明實(shí)施例通過在接收到心跳信息時(shí),獲取心跳中的運(yùn)行周期信息和最新日志索引,如果獲取的運(yùn)行周期信息小于自身的運(yùn)行周期信息,且獲取的最新日志索不小于自身的最新日志索引,則將自身的運(yùn)行周期信息同步為該心跳信息中的運(yùn)行周期信息,并將自身的工作狀態(tài)切換為跟隨狀態(tài)或保持候選狀態(tài),使得切換為跟隨狀態(tài)的節(jié)點(diǎn)設(shè)備可以直接根據(jù)本次心跳信息與第二子集群合為一個(gè)系統(tǒng)工作,或者保持候選狀態(tài)的節(jié)點(diǎn)設(shè)備可以當(dāng)再次接收到心跳信息時(shí),依據(jù)自身的運(yùn)行周期信息和最新日志索引均不大于心跳信息中的對應(yīng)兩項(xiàng),切換為跟隨狀態(tài)運(yùn)行,進(jìn)而也能和第二子集群合為一個(gè)系統(tǒng)工作,提高了系統(tǒng)的工作可靠性。
在一種可能實(shí)現(xiàn)方式中,獲取模塊402用于:
如果當(dāng)前節(jié)點(diǎn)設(shè)備運(yùn)行于候選狀態(tài),從心跳信息中獲取多個(gè)簽名;
如果多個(gè)簽名的數(shù)量大于系統(tǒng)中節(jié)點(diǎn)設(shè)備數(shù)量的半數(shù),且多個(gè)簽名均驗(yàn)證通過,從心跳信息中獲取運(yùn)行周期信息和最新日志索引。
在一種可能實(shí)現(xiàn)方式中,接收模塊401還用于:
接收運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備所廣播的日志復(fù)制指令,基于日志復(fù)制指令復(fù)制日志。
在一種可能實(shí)現(xiàn)方式中,基于圖4的節(jié)點(diǎn)設(shè)備組成,參見圖5,節(jié)點(diǎn)設(shè)備還包括:
確定模塊504,用于基于當(dāng)前節(jié)點(diǎn)設(shè)備的最新日志索引和心跳信息中的最新日志索引,確定當(dāng)前節(jié)點(diǎn)設(shè)備需要添加的日志索引;
發(fā)送模塊504,用于向運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備發(fā)送日志添加請求。
在一種可能實(shí)現(xiàn)方式中,心跳信息或日志復(fù)制指令攜帶系統(tǒng)中各個(gè)節(jié)點(diǎn)設(shè)備在響應(yīng)運(yùn)行于領(lǐng)導(dǎo)狀態(tài)的節(jié)點(diǎn)設(shè)備的投票請求時(shí)的簽名。
上述所有可選技術(shù)方案,可以采用任意結(jié)合形成本發(fā)明的可選實(shí)施例,在此不再一一贅述。
需要說明的是:上述實(shí)施例提供的節(jié)點(diǎn)設(shè)備在執(zhí)行節(jié)點(diǎn)設(shè)備運(yùn)行方法時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將節(jié)點(diǎn)設(shè)備的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的節(jié)點(diǎn)設(shè)備與節(jié)點(diǎn)設(shè)備運(yùn)行方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過程詳見方法實(shí)施例,這里不再贅述。
圖6是本發(fā)明實(shí)施例提供的一種節(jié)點(diǎn)設(shè)備結(jié)構(gòu)示意圖。參照圖6,該節(jié)點(diǎn)設(shè)備可以被提供為一個(gè)服務(wù)器,該節(jié)點(diǎn)設(shè)備600包括處理組件622,其進(jìn)一步包括一個(gè)或多個(gè)處理器,以及由存儲器632所代表的存儲器資源,用于存儲可由處理部件622的執(zhí)行的指令,例如應(yīng)用程序。存儲器632中存儲的應(yīng)用程序可以包括一個(gè)或一個(gè)以上的每一個(gè)對應(yīng)于一組指令的模塊。此外,處理組件622被配置為執(zhí)行指令,以執(zhí)行上述節(jié)點(diǎn)設(shè)備運(yùn)行方法。
節(jié)點(diǎn)設(shè)備600還可以包括一個(gè)電源組件626被配置為執(zhí)行節(jié)點(diǎn)設(shè)備600的電源管理,一個(gè)有線或無線網(wǎng)絡(luò)接口650被配置為將節(jié)點(diǎn)設(shè)備600連接到網(wǎng)絡(luò),和一個(gè)輸入輸出(i/o)接口658。節(jié)點(diǎn)設(shè)備600可以操作基于存儲在存儲器632的操作系統(tǒng),例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或類似。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計(jì)算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。