本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法和服務(wù)器。
背景技術(shù):
隨著互聯(lián)網(wǎng)數(shù)據(jù)的快速增長(zhǎng),數(shù)據(jù)庫(kù)作為互聯(lián)網(wǎng)數(shù)據(jù)的存儲(chǔ)介質(zhì),承擔(dān)著越來(lái)越多的數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)訪問(wèn)任務(wù)。在分布式的數(shù)據(jù)存儲(chǔ)系統(tǒng)中,同一數(shù)據(jù)具有多個(gè)副本,存儲(chǔ)在不同的服務(wù)器中。數(shù)據(jù)一致性是互聯(lián)網(wǎng)服務(wù)的一個(gè)重要指標(biāo)。數(shù)據(jù)一致性,即同一數(shù)據(jù)的多個(gè)副本保持一致。
現(xiàn)有的分布式數(shù)據(jù)存儲(chǔ)架構(gòu)所采用的數(shù)據(jù)一致性協(xié)議中,當(dāng)數(shù)據(jù)寫入一半以上的服務(wù)器時(shí),認(rèn)為數(shù)據(jù)寫入成功。而由于集群中服務(wù)器資源有限,數(shù)據(jù)一致性所占用的服務(wù)器資源較多,導(dǎo)致服務(wù)可用性降低,不利于業(yè)務(wù)請(qǐng)求的高效率處理。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述背景技術(shù)部分的一個(gè)或多個(gè)技術(shù)問(wèn)題,本申請(qǐng)實(shí)施例提供了應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法和服務(wù)器。
第一方面,本申請(qǐng)實(shí)施例提供了一種應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法,分布式服務(wù)器集群包括多個(gè)節(jié)點(diǎn),該方法包括:服務(wù)器集群中的主節(jié)點(diǎn)接收數(shù)據(jù)寫入請(qǐng)求,數(shù)據(jù)寫入請(qǐng)求包括待寫入數(shù)據(jù);主節(jié)點(diǎn)將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組,每個(gè)分組包括至少一個(gè)節(jié)點(diǎn);主節(jié)點(diǎn)響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息;其中,若分組中不包含主節(jié)點(diǎn),分組響應(yīng)于分組中的至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在一些實(shí)施例中,若分組中包含主節(jié)點(diǎn),分組響應(yīng)于主節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在一些實(shí)施例中,若分組中包含主節(jié)點(diǎn)和至少一個(gè)從節(jié)點(diǎn),分組響應(yīng)于主節(jié)點(diǎn)和分組內(nèi)的至少一個(gè)從節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在一些實(shí)施例中,上述方法還包括:響應(yīng)于向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量低于半數(shù),或在預(yù)設(shè)時(shí)間內(nèi)超過(guò)半數(shù)的分組中每個(gè)分組中所有節(jié)點(diǎn)均未收到主節(jié)點(diǎn)廣播的心跳消息,服務(wù)器集群中的一個(gè)從節(jié)點(diǎn)作為候選節(jié)點(diǎn)向各分組發(fā)出選舉請(qǐng)求;響應(yīng)于候選節(jié)點(diǎn)接收到超過(guò)半數(shù)的分組中每個(gè)分組的所有節(jié)點(diǎn)的同意消息,將候選節(jié)點(diǎn)切換為新的主節(jié)點(diǎn)。
在一些實(shí)施例中,上述方法還包括:按照各節(jié)點(diǎn)部署的物理位置將服務(wù)器集群中的多個(gè)節(jié)點(diǎn)劃分為多個(gè)分組。
在一些實(shí)施例中,上述方法還包括:主節(jié)點(diǎn)響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向反饋確認(rèn)消息的各分組發(fā)送數(shù)據(jù)同步確認(rèn)消息。
第二方面,本申請(qǐng)實(shí)施例提供了一種應(yīng)用于分布式數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器,包括:接收單元,用于接收數(shù)據(jù)寫入請(qǐng)求,數(shù)據(jù)寫入請(qǐng)求包括待寫入數(shù)據(jù);廣播單元,用于將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組,每個(gè)分組包括至少一個(gè)節(jié)點(diǎn),且至少一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn);發(fā)送單元,用于響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息;其中,若分組中不包含服務(wù)器集群中的主節(jié)點(diǎn),分組用于響應(yīng)于分組中的至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在一些實(shí)施例中,上述服務(wù)器還包括:請(qǐng)求單元,用于響應(yīng)于向主反饋確認(rèn)消息的分組數(shù)量低于半數(shù),或在預(yù)設(shè)時(shí)間內(nèi)超過(guò)半數(shù)的分組中每個(gè)分組中所有主節(jié)點(diǎn)均未收到主節(jié)點(diǎn)廣播的心跳消息,作為候選節(jié)點(diǎn)向各分組發(fā)出選舉請(qǐng)求;以及切換單元,用于響應(yīng)于接收到超過(guò)半數(shù)的分組中每個(gè)分組的所有節(jié)點(diǎn)的同意消息,切換為新的主節(jié)點(diǎn)。
在一些實(shí)施例中,上述服務(wù)器還包括:確認(rèn)單元,配置用于響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向反饋確認(rèn)消息的各分組發(fā)送數(shù)據(jù)同步確認(rèn)消息。
本申請(qǐng)?zhí)峁┑膽?yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法和服務(wù)器,通過(guò)服務(wù)器集群中的主節(jié)點(diǎn)接收數(shù)據(jù)寫入請(qǐng)求,之后主節(jié)點(diǎn)將數(shù)據(jù)寫入請(qǐng)求廣播至集群中的各個(gè)分組,其中每個(gè)分組包括至少一個(gè)節(jié)點(diǎn),在主節(jié)點(diǎn)收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息時(shí),向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息,其中,若分組中不包含主節(jié)點(diǎn),則該分組在其中至少一個(gè)節(jié)點(diǎn)成功寫入待寫入數(shù)據(jù)之后,所述分組向主節(jié)點(diǎn)反饋確認(rèn)消息,從而減少了保證數(shù)據(jù)一致性所需的節(jié)點(diǎn)數(shù)量,進(jìn)而在保證數(shù)據(jù)一致性的同時(shí)提升了服務(wù)可用性。
附圖說(shuō)明
通過(guò)閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例詳細(xì)描述,本申請(qǐng)的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:
圖1是本申請(qǐng)的數(shù)據(jù)存儲(chǔ)方法可以應(yīng)用于其中的示例性系統(tǒng)架構(gòu);
圖2是根據(jù)本申請(qǐng)的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)實(shí)施例的流程圖;
圖3是圖2所示的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)具體示例的原理示意圖;
圖4是根據(jù)本申請(qǐng)的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的另一個(gè)實(shí)施例的流程圖;
圖5是圖3所示的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)具體示例的原理示意圖;
圖6是應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;
圖7是適于用來(lái)實(shí)現(xiàn)本申請(qǐng)實(shí)施例的分布式服務(wù)器集群中的服務(wù)器的計(jì)算機(jī)系統(tǒng)的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本申請(qǐng)作進(jìn)一步的詳細(xì)說(shuō)明??梢岳斫獾氖?,此處所描述的具體實(shí)施例僅僅用于解釋相關(guān)發(fā)明,而非對(duì)該發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與有關(guān)發(fā)明相關(guān)的部分。
需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來(lái)詳細(xì)說(shuō)明本申請(qǐng)。
圖1示出了本申請(qǐng)的數(shù)據(jù)存儲(chǔ)方法可以應(yīng)用于其中的示例性系統(tǒng)架構(gòu)100。
如圖1所示,系統(tǒng)架構(gòu)100包括客戶端101、網(wǎng)絡(luò)102以及分布式數(shù)據(jù)服務(wù)器集群103。網(wǎng)絡(luò)102用以在客戶端101和服務(wù)器集群103之間提供通信鏈路的介質(zhì),以及在服務(wù)器集群103位于不同地理位置的機(jī)房之間提供通信鏈路的介質(zhì)。網(wǎng)絡(luò)103可以包括各種連接類型,例如有線、無(wú)線通信鏈路或者光纖電纜等等。
用戶110可以通過(guò)客戶端101向分布式數(shù)據(jù)服務(wù)器集群103寫入數(shù)據(jù)或請(qǐng)求讀取數(shù)據(jù)。客戶端101可以配置于終端設(shè)備(例如具有顯示屏的計(jì)算機(jī))中,用戶110在通過(guò)終端設(shè)備的輸入接口輸入數(shù)據(jù)讀寫請(qǐng)求,終端設(shè)備將數(shù)據(jù)讀寫請(qǐng)求發(fā)送至分布式數(shù)據(jù)服務(wù)器集群103。
分布式數(shù)據(jù)服務(wù)器集群103可以是為客戶端101的應(yīng)用提供數(shù)據(jù)服務(wù)的服務(wù)器集群,或者說(shuō),可以是為某一在線業(yè)務(wù)提供數(shù)據(jù)服務(wù)器的服務(wù)器集群,包括多臺(tái)服務(wù)器1030。服務(wù)器集群103中的多臺(tái)服務(wù)器1030可以在位于不同地理位置的數(shù)據(jù)中心,例如圖1中服務(wù)器集群103中的服務(wù)器1030可以分別位于北京機(jī)房、上海機(jī)房和廣州機(jī)房中。各個(gè)服務(wù)器1030之間可以通過(guò)網(wǎng)絡(luò)連接。服務(wù)器集群103可以接收用戶110通過(guò)客戶端101發(fā)出的數(shù)據(jù)讀寫請(qǐng)求,并對(duì)數(shù)據(jù)讀寫請(qǐng)求進(jìn)行處理,例如可以將用戶寫入的數(shù)據(jù)更新至多臺(tái)服務(wù)器中,然后向客戶端返回寫數(shù)據(jù)成功的消息。
需要說(shuō)明的是,本申請(qǐng)實(shí)施例所提供的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法一般由服務(wù)器集群103執(zhí)行,應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器一般設(shè)置于服務(wù)器集群中。
應(yīng)該理解,圖1中的客戶端、網(wǎng)絡(luò)和服務(wù)器集群中的服務(wù)器的數(shù)目?jī)H僅是示意性的。根據(jù)實(shí)現(xiàn)需要,可以具有任意數(shù)目的客戶端、網(wǎng)絡(luò)和服務(wù)器。
繼續(xù)參考圖2,其示出了根據(jù)本申請(qǐng)的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)實(shí)施例的流程圖。在這里,數(shù)據(jù)服務(wù)器集群包括多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以是一臺(tái)服務(wù)器。該應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法,包括以下步驟:
步驟201,服務(wù)器集群中的主節(jié)點(diǎn)接收數(shù)據(jù)寫入請(qǐng)求。
在本實(shí)施例中,數(shù)據(jù)服務(wù)器集群可以采用分布式存儲(chǔ)架構(gòu),各節(jié)點(diǎn)部署于不同的地理位置,其中包括一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。主節(jié)點(diǎn)可以處理所有的客戶端交互,將客戶端寫入的數(shù)據(jù)同步至從節(jié)點(diǎn),從從節(jié)點(diǎn)讀取客戶端請(qǐng)求的數(shù)據(jù)。從節(jié)點(diǎn)可以接收主節(jié)點(diǎn)發(fā)送的日志同步消息或心跳(heartbeat)消息,進(jìn)行日志同步、數(shù)據(jù)讀取等操作,并向主節(jié)點(diǎn)返回響應(yīng)消息。一般地,在一個(gè)服務(wù)器集群中,包含一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。
主節(jié)點(diǎn)可以接收客戶端發(fā)送的數(shù)據(jù)寫入請(qǐng)求。該數(shù)據(jù)寫入請(qǐng)求中包括待寫入的數(shù)據(jù)??蛇x地,數(shù)據(jù)寫入請(qǐng)求還可以包括客戶端的用戶標(biāo)識(shí)、客戶端的設(shè)備標(biāo)識(shí)、請(qǐng)求時(shí)間等,用戶標(biāo)識(shí)和設(shè)備標(biāo)識(shí)可以用來(lái)在寫入數(shù)據(jù)前對(duì)客戶端的權(quán)限進(jìn)行判別和驗(yàn)證。
在實(shí)際業(yè)務(wù)場(chǎng)景中,數(shù)據(jù)寫入請(qǐng)求可以例如為錄入用戶信息的請(qǐng)求,包括更改用戶名稱、密碼的請(qǐng)求,用戶可以在客戶端執(zhí)行用戶信息的錄入,并由客戶端所在的設(shè)備發(fā)送至服務(wù)器集群中的主節(jié)點(diǎn)。主節(jié)點(diǎn)可以通過(guò)網(wǎng)絡(luò)接收該請(qǐng)求。
步驟202,主節(jié)點(diǎn)將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組。
為了保證服務(wù)器集群中的一些節(jié)點(diǎn)設(shè)備故障或網(wǎng)絡(luò)故障時(shí)正常提供數(shù)據(jù)服務(wù),主節(jié)點(diǎn)需要將待寫入的數(shù)據(jù)同步至一些從節(jié)點(diǎn),以保證服務(wù)可用性。同時(shí),需要將服務(wù)器集群中同一數(shù)據(jù)的所有備份都修改為最新的數(shù)據(jù)值,以避免出現(xiàn)數(shù)據(jù)一致性問(wèn)題。
在本實(shí)施例中,主節(jié)點(diǎn)可以將接收到的數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組。具體來(lái)說(shuō),主節(jié)點(diǎn)在接收到數(shù)據(jù)寫入請(qǐng)求之后,可以發(fā)出廣播消息,通知與主節(jié)點(diǎn)建立了數(shù)據(jù)通信的分組將數(shù)據(jù)寫入。每個(gè)分組包括至少一個(gè)節(jié)點(diǎn),主節(jié)點(diǎn)所在的分組可以只包含主節(jié)點(diǎn),也可以包含主節(jié)點(diǎn)和至少一個(gè)從節(jié)點(diǎn),其他分組可以包含一個(gè)或多個(gè)從節(jié)點(diǎn),并且,至少存在一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn)。
在本實(shí)施例中,主節(jié)點(diǎn)可以與服務(wù)器集群中的超過(guò)半數(shù)的分組建立并保持?jǐn)?shù)據(jù)通信。進(jìn)一步地,主節(jié)點(diǎn)可以按照配置好的數(shù)據(jù)一致性協(xié)議與各分組建立并保持?jǐn)?shù)據(jù)通信。在該數(shù)據(jù)一致性協(xié)議中,若主節(jié)點(diǎn)與超過(guò)半數(shù)的分組中每個(gè)分組的至少一個(gè)從節(jié)點(diǎn)建立了數(shù)據(jù)通信,則認(rèn)為該服務(wù)器集群可以滿足數(shù)據(jù)一致性的要求。主節(jié)點(diǎn)可以定時(shí)地向與其建立了數(shù)據(jù)通信的分組中的從節(jié)點(diǎn)發(fā)送心跳消息,從節(jié)點(diǎn)在收到心跳消息后向主節(jié)點(diǎn)返回響應(yīng)消息,在主節(jié)點(diǎn)收到響應(yīng)消息后確定該從節(jié)點(diǎn)所在分組與主節(jié)點(diǎn)之間的數(shù)據(jù)通信正常。
主節(jié)點(diǎn)可以將上述數(shù)據(jù)寫入請(qǐng)求廣播至與其保持?jǐn)?shù)據(jù)通信的各個(gè)分組中,也即可以將上述數(shù)據(jù)寫入請(qǐng)求廣播至與其保持?jǐn)?shù)據(jù)通信的、分別屬于超過(guò)半數(shù)的分組中的各個(gè)從節(jié)點(diǎn)。如果一個(gè)分組內(nèi)至少一個(gè)從節(jié)點(diǎn)收到了該數(shù)據(jù)寫入請(qǐng)求,則可以確定該分組已經(jīng)接收到了該數(shù)據(jù)寫入請(qǐng)求。
步驟203,主節(jié)點(diǎn)響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息。
在接收到主節(jié)點(diǎn)廣播的數(shù)據(jù)寫入請(qǐng)求之后,各與主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)通信的從節(jié)點(diǎn)可以將數(shù)據(jù)寫入請(qǐng)求中的待寫入數(shù)據(jù)寫入內(nèi)存中,之后向主節(jié)點(diǎn)返回寫入成功的確認(rèn)消息,這時(shí)可以確定該從節(jié)點(diǎn)所在的分組向主節(jié)點(diǎn)反饋了確認(rèn)消息,也即可以確定該從節(jié)點(diǎn)所在的分組已經(jīng)寫成功。這里的確認(rèn)消息可以是確認(rèn)數(shù)據(jù)已成功寫入的消息。
具體地,當(dāng)一個(gè)分組內(nèi)不包含主節(jié)點(diǎn)時(shí),該分組響應(yīng)于分組中的至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。也就是說(shuō),對(duì)于除了包含主節(jié)點(diǎn)的分組之外的其他分組,若組內(nèi)至少有一個(gè)從節(jié)點(diǎn)成功將待寫入數(shù)據(jù)寫入內(nèi)存,并發(fā)送了寫入成功的確認(rèn)消息,則認(rèn)為該分組已經(jīng)成功寫入數(shù)據(jù),或者說(shuō)認(rèn)為該分組完成了數(shù)據(jù)同步。在超過(guò)半數(shù)的分組成功寫入數(shù)據(jù)或完成了數(shù)據(jù)同步之后,可以確定服務(wù)器集群已經(jīng)成功寫入數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)的一致性,并且可以保證節(jié)點(diǎn)故障時(shí)數(shù)據(jù)不丟失,這時(shí),主節(jié)點(diǎn)可以向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息。
在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,若向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量不超過(guò)半數(shù),則可以確定主節(jié)點(diǎn)、從節(jié)點(diǎn)或網(wǎng)絡(luò)出現(xiàn)異常,這時(shí),主節(jié)點(diǎn)可以向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入失敗的通知消息。
對(duì)于包含主節(jié)點(diǎn)的分組,可以默認(rèn)該分組已成功寫入數(shù)據(jù),即可以確定該分組向主節(jié)點(diǎn)反饋了確認(rèn)消息。
在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,若分組中包含主節(jié)點(diǎn),則該分組可以響應(yīng)于主節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。也就是說(shuō),主節(jié)點(diǎn)所在的分組在主節(jié)點(diǎn)將待寫入數(shù)據(jù)寫入內(nèi)存后,主節(jié)點(diǎn)所在的分組即寫成功。主節(jié)點(diǎn)可以監(jiān)測(cè)數(shù)據(jù)寫入主節(jié)點(diǎn)內(nèi)存后返回的參數(shù),作為上述反饋的確認(rèn)消息,在檢測(cè)到該參數(shù)后確定主節(jié)點(diǎn)所在的分組已寫成功。
在本實(shí)施例的另一些可選的實(shí)現(xiàn)方式中,若分組中包含主節(jié)點(diǎn),則該分組可以響應(yīng)于主節(jié)點(diǎn)和分組內(nèi)的至少一個(gè)從節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。也就是說(shuō),主節(jié)點(diǎn)所在分組中還包括至少一個(gè)從節(jié)點(diǎn)時(shí),主節(jié)點(diǎn)和分組內(nèi)的至少一個(gè)從節(jié)點(diǎn)將待寫入數(shù)據(jù)寫入內(nèi)存后,主節(jié)點(diǎn)所在的分組即寫成功。同樣地,主節(jié)點(diǎn)可以監(jiān)測(cè)數(shù)據(jù)寫入主節(jié)點(diǎn)內(nèi)存后返回的參數(shù),作為上述反饋的確認(rèn)消息,在同分組內(nèi)的一個(gè)從節(jié)點(diǎn)也成功將待寫入數(shù)據(jù)寫入內(nèi)存并反饋確認(rèn)消息之后,才確定主節(jié)點(diǎn)所在的分組已寫成功。這樣,增加了主節(jié)點(diǎn)所在分組中的至少一個(gè)從節(jié)點(diǎn)作為數(shù)據(jù)同步節(jié)點(diǎn),能夠增強(qiáng)數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)一致性。
在上述實(shí)施例中,在超過(guò)半數(shù)的分組寫成功之后,可以確定數(shù)據(jù)服務(wù)器集群已成功完成了待寫入數(shù)據(jù)的寫入。這時(shí),主節(jié)點(diǎn)可以向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送通知消息,以告知客戶端數(shù)據(jù)寫入請(qǐng)求已處理完畢并寫入成功??蛻舳丝梢越邮赵撏ㄖ⒉⒊尸F(xiàn)給用戶。
本申請(qǐng)上述實(shí)施例提供的應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法,通過(guò)服務(wù)器集群中的主節(jié)點(diǎn)接收數(shù)據(jù)寫入請(qǐng)求,之后主節(jié)點(diǎn)將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組,并響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息,其中,不包含主節(jié)點(diǎn)的分組響應(yīng)于分組中至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋上述確認(rèn)消息,并且,至少一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn)??梢岳梅纸M間數(shù)據(jù)一致的方式,保證每個(gè)分組中至少一個(gè)節(jié)點(diǎn)寫入待寫入數(shù)據(jù),相較于傳統(tǒng)的需要超過(guò)半數(shù)節(jié)點(diǎn)同步待寫入數(shù)據(jù)的分布式數(shù)據(jù)存儲(chǔ)方法,減少了需同步數(shù)據(jù)的節(jié)點(diǎn)數(shù)量,從而使可故障節(jié)點(diǎn)的數(shù)量增大,提升了服務(wù)可用性。
在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述方法還可以包括:按照各節(jié)點(diǎn)部署的物理位置將服務(wù)器集群中的多個(gè)節(jié)點(diǎn)劃分為多個(gè)分組。例如可以如圖1所示架構(gòu)中按照各節(jié)點(diǎn)所在的機(jī)房進(jìn)行分組,每個(gè)機(jī)房的節(jié)點(diǎn)為一個(gè)分組。
進(jìn)一步地,單個(gè)分組內(nèi)的節(jié)點(diǎn)數(shù)量小于服務(wù)器集群中節(jié)點(diǎn)總數(shù)的一半,這樣,可以避免單個(gè)機(jī)房故障時(shí)數(shù)據(jù)不一致和服務(wù)不可用。
在本實(shí)施的一些可選的實(shí)現(xiàn)方式中,上述數(shù)據(jù)存儲(chǔ)方法還可以包括:主節(jié)點(diǎn)響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向反饋確認(rèn)消息的各分組發(fā)送數(shù)據(jù)同步確認(rèn)消息。即主節(jié)點(diǎn)在收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息后,可以發(fā)送數(shù)據(jù)同步確認(rèn)消息給各反饋取認(rèn)消息的分組,具體地,可以發(fā)送數(shù)據(jù)同步確認(rèn)消息給各分組中反饋確認(rèn)消息的從節(jié)點(diǎn),以完成數(shù)據(jù)同步確認(rèn)。
依據(jù)上述實(shí)施例提供的數(shù)據(jù)存儲(chǔ)方法,數(shù)據(jù)服務(wù)器集群依照以下基于分組的數(shù)據(jù)一致性協(xié)議進(jìn)行數(shù)據(jù)存儲(chǔ):主節(jié)點(diǎn)需要與超過(guò)半數(shù)的分組保持?jǐn)?shù)據(jù)通信,當(dāng)一個(gè)分組中至少存在一個(gè)節(jié)點(diǎn)與主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)通信時(shí),認(rèn)為該分組與主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)通信。
請(qǐng)參考圖3,其示出了圖2所示的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)具體示例的原理示意圖,也示出了服務(wù)器集群的上述基于分組的數(shù)據(jù)一致性協(xié)議的數(shù)據(jù)存儲(chǔ)的一個(gè)應(yīng)用場(chǎng)景的示意圖。
如圖3所示,數(shù)據(jù)服務(wù)器集群包括分組1、分組2、分組3、分組4、分組5共5個(gè)分組,各分組可以分別位于不同的機(jī)房。分組1包括主節(jié)點(diǎn)m和一個(gè)從節(jié)點(diǎn)s1,分組2包括3個(gè)從節(jié)點(diǎn)s2、s3、s4,分組3包括1個(gè)從節(jié)點(diǎn)s5、分組4包括2個(gè)從節(jié)點(diǎn)s6和s7,分組5包括2個(gè)從節(jié)點(diǎn)s8和s9。主節(jié)點(diǎn)m與分組2中的從節(jié)點(diǎn)s4和分組4中的從節(jié)點(diǎn)s7保持?jǐn)?shù)據(jù)通信。在寫數(shù)據(jù)時(shí),主節(jié)點(diǎn)m收到分組1的主節(jié)點(diǎn)m、分組2的從節(jié)點(diǎn)s4、分組4的從節(jié)點(diǎn)s7反饋的確認(rèn)消息“ok”,則可以向客戶端c發(fā)送寫入成功的通知消息“ok”?;蛘?,主節(jié)點(diǎn)m收到分組1的主節(jié)點(diǎn)m和從節(jié)點(diǎn)s1、分組2的從節(jié)點(diǎn)s4、分組4的從節(jié)點(diǎn)s7反饋的確認(rèn)消息“ok”,則可以向客戶端c發(fā)送寫入成功的通知消息“ok”。這時(shí),主節(jié)點(diǎn)m與分組1、分組2、分組4保持?jǐn)?shù)據(jù)通信,可以保證主節(jié)點(diǎn)m的數(shù)據(jù)可以實(shí)時(shí)進(jìn)行跨機(jī)房備份,業(yè)務(wù)的數(shù)據(jù)不會(huì)丟失并且在多個(gè)節(jié)點(diǎn)保持一致。
從圖3可以看出,本實(shí)施例的應(yīng)用場(chǎng)景中,與主節(jié)點(diǎn)保持通信的節(jié)點(diǎn)數(shù)量少于服務(wù)器集群中節(jié)點(diǎn)總數(shù)量的一半,在服務(wù)器集群中的一些節(jié)點(diǎn)故障時(shí),可以利用較少的節(jié)點(diǎn)來(lái)保證數(shù)據(jù)一致性,從而避免服務(wù)可用性受到較大影響。
請(qǐng)參考圖4,其示出了根據(jù)本申請(qǐng)的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的另一個(gè)實(shí)施例的流程圖,該應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法,包括以下步驟:
步驟401,服務(wù)器集群中的主節(jié)點(diǎn)接收數(shù)據(jù)寫入請(qǐng)求。
在本實(shí)施例中,數(shù)據(jù)服務(wù)器集群可以采用分布式存儲(chǔ)架構(gòu),各節(jié)點(diǎn)部署于不同的地理位置,其中包括一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。主節(jié)點(diǎn)可以接收客戶端發(fā)送的數(shù)據(jù)寫入請(qǐng)求。該數(shù)據(jù)寫入請(qǐng)求中包括待寫入的數(shù)據(jù)。可選地,數(shù)據(jù)寫入請(qǐng)求還可以包括客戶端的用戶標(biāo)識(shí)、客戶端的設(shè)備標(biāo)識(shí)、請(qǐng)求時(shí)間等,用戶標(biāo)識(shí)和設(shè)備標(biāo)識(shí)可以用來(lái)在寫入數(shù)據(jù)前對(duì)客戶端的權(quán)限進(jìn)行判別和驗(yàn)證。
步驟402,主節(jié)點(diǎn)將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組。
在本實(shí)施例中,主節(jié)點(diǎn)可以在接收到數(shù)據(jù)寫入請(qǐng)求后,在服務(wù)器集群內(nèi)廣播該數(shù)據(jù)寫入請(qǐng)求,請(qǐng)求其他節(jié)點(diǎn)備份待寫入數(shù)據(jù)。與主節(jié)點(diǎn)建立了數(shù)據(jù)通信的分組可以接收該數(shù)據(jù)寫入請(qǐng)求。在這里,每個(gè)分組包括至少一個(gè)節(jié)點(diǎn),主節(jié)點(diǎn)所在的分組可以只包含主節(jié)點(diǎn),也可以包含主節(jié)點(diǎn)和至少一個(gè)從節(jié)點(diǎn),其他分組可以包含一個(gè)或多個(gè)從節(jié)點(diǎn),并且,至少存在一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn)。
在本實(shí)施例中,主節(jié)點(diǎn)可以與服務(wù)器集群中的超過(guò)半數(shù)的分組保持?jǐn)?shù)據(jù)通信。進(jìn)一步地,主節(jié)點(diǎn)可以按照配置好的數(shù)據(jù)一致性協(xié)議與各分組建立并保持?jǐn)?shù)據(jù)通信。在該數(shù)據(jù)一致性協(xié)議中,若主節(jié)點(diǎn)與超過(guò)半數(shù)的分組中每個(gè)分組的至少一個(gè)從節(jié)點(diǎn)建立了數(shù)據(jù)通信,則認(rèn)為該服務(wù)器集群可以滿足數(shù)據(jù)一致性的要求。
步驟403,主節(jié)點(diǎn)響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息。
在接收到主節(jié)點(diǎn)廣播的數(shù)據(jù)寫入請(qǐng)求之后,各與主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)通信的從節(jié)點(diǎn)可以將數(shù)據(jù)寫入請(qǐng)求中的待寫入數(shù)據(jù)寫入內(nèi)存中,之后向主節(jié)點(diǎn)返回寫入成功的確認(rèn)消息,這時(shí)可以確定該從節(jié)點(diǎn)所在的分組向主節(jié)點(diǎn)反饋了確認(rèn)消息,也即可以確定該從節(jié)點(diǎn)所在的分組已經(jīng)寫成功。
當(dāng)一個(gè)分組內(nèi)不包含主節(jié)點(diǎn)時(shí),該分組了可以響應(yīng)于分組中的至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。也就是說(shuō),對(duì)于除了包含主節(jié)點(diǎn)的分組之外的其他分組,若組內(nèi)至少有一個(gè)從節(jié)點(diǎn)成功將待寫入數(shù)據(jù)寫入內(nèi)存,并發(fā)送了寫入成功的確認(rèn)消息,則認(rèn)為該分組已經(jīng)成功寫入數(shù)據(jù),該分組完成了數(shù)據(jù)的備份,這時(shí),主節(jié)點(diǎn)可以向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息。
若分組中包含主節(jié)點(diǎn),在一些可選的實(shí)現(xiàn)方式中,該分組可以響應(yīng)于主節(jié)點(diǎn)和分組內(nèi)的至少一個(gè)從節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息;在另一些可選的實(shí)現(xiàn)方式中,該分組可以響應(yīng)于主節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。也就是說(shuō),主節(jié)點(diǎn)所在分組可以在主節(jié)點(diǎn)成功寫入數(shù)據(jù)后反饋確認(rèn)消息,可以在主節(jié)點(diǎn)和至少一個(gè)從節(jié)點(diǎn)成功寫入數(shù)據(jù)后反饋確認(rèn)消息。
在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,若向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量不超過(guò)半數(shù),則可以確定主節(jié)點(diǎn)、從節(jié)點(diǎn)或網(wǎng)絡(luò)出現(xiàn)異常,這時(shí),主節(jié)點(diǎn)可以向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入失敗的通知消息。
步驟404,響應(yīng)于向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量低于半數(shù),或在預(yù)設(shè)時(shí)間內(nèi)超過(guò)半數(shù)的分組中每個(gè)分組中所有節(jié)點(diǎn)均未收到主節(jié)點(diǎn)廣播的心跳消息,服務(wù)器集群中的一個(gè)從節(jié)點(diǎn)作為候選節(jié)點(diǎn)向各分組發(fā)出選舉請(qǐng)求。
在本實(shí)施例中,當(dāng)向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量低于半數(shù)時(shí),或者在預(yù)設(shè)時(shí)間內(nèi)超過(guò)半數(shù)的分組中每個(gè)分組中所有節(jié)點(diǎn)均未收到主節(jié)點(diǎn)廣播的心跳消息時(shí),可以確定與主節(jié)點(diǎn)保持通信的分組數(shù)量少于半數(shù),這時(shí)為了保證數(shù)據(jù)一致性,服務(wù)器集群中的一個(gè)從節(jié)點(diǎn)成為候選節(jié)點(diǎn),向各分組發(fā)出選舉請(qǐng)求。
具體來(lái)說(shuō),一方面,若向主節(jié)點(diǎn)反饋確認(rèn)消息的分組數(shù)量未超過(guò)半數(shù),則可以確定與主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)通信的分組數(shù)量不超過(guò)半數(shù),數(shù)據(jù)的備份和一致性難以保證,這時(shí)其他從節(jié)點(diǎn)可以發(fā)出選舉請(qǐng)求。
另一方面,主節(jié)點(diǎn)與各分組內(nèi)的從節(jié)點(diǎn)之間的數(shù)據(jù)通信通過(guò)主節(jié)點(diǎn)發(fā)送的心跳消息來(lái)保持。每個(gè)從節(jié)點(diǎn)中配置了發(fā)起選舉的時(shí)鐘,在時(shí)鐘預(yù)設(shè)的時(shí)間內(nèi)從節(jié)點(diǎn)不會(huì)發(fā)出選舉請(qǐng)求。在收到主節(jié)點(diǎn)發(fā)送的心跳消息后,該從節(jié)點(diǎn)的時(shí)鐘被重置,重新開(kāi)始計(jì)時(shí)。若預(yù)設(shè)的時(shí)間內(nèi)從節(jié)點(diǎn)未受到主節(jié)點(diǎn)發(fā)送的心跳消息,則觸發(fā)從節(jié)點(diǎn)向其他節(jié)點(diǎn)發(fā)出選舉請(qǐng)求。
步驟405,響應(yīng)于候選節(jié)點(diǎn)接收到超過(guò)半數(shù)的分組中每個(gè)分組的所有節(jié)點(diǎn)的同意消息,將候選節(jié)點(diǎn)切換為新的主節(jié)點(diǎn)。
從節(jié)點(diǎn)發(fā)出選舉請(qǐng)求的同時(shí)成為候選節(jié)點(diǎn)。在本實(shí)施中,服務(wù)器集群中的其他節(jié)點(diǎn)在收到選舉請(qǐng)求后,可以向候選節(jié)點(diǎn)發(fā)送同意消息或拒絕消息。若候選節(jié)點(diǎn)受到超過(guò)半數(shù)的分組中每個(gè)分組的所有節(jié)點(diǎn)的同意消息,則候選節(jié)點(diǎn)切換為主節(jié)點(diǎn),原來(lái)的主節(jié)點(diǎn)切換為從節(jié)點(diǎn)。換言之,若超過(guò)半數(shù)的分組中的全部節(jié)點(diǎn)都投票給候選節(jié)點(diǎn),則候選節(jié)點(diǎn)就成為新的主節(jié)點(diǎn)。
按照上述數(shù)據(jù)存儲(chǔ)方法400,數(shù)據(jù)服務(wù)器集群基于如下基于分組的一致性協(xié)議進(jìn)行主節(jié)點(diǎn)選舉:若與一個(gè)節(jié)點(diǎn)收到集群中超過(guò)半數(shù)的分組中的所有節(jié)點(diǎn)的投票,則該節(jié)點(diǎn)成為新的主節(jié)點(diǎn)。
上述方法流程中的步驟401、步驟402和步驟403分別與前述實(shí)施例中的步驟201、步驟202和步驟205相同,上文針對(duì)步驟201、步驟202和步驟205的描述也適用于本實(shí)施中的步驟401、步驟402和步驟403,此處不再贅述。
可以看出,在圖2所示實(shí)施例的基礎(chǔ)上,圖4所示的實(shí)施例增加了主節(jié)點(diǎn)或網(wǎng)絡(luò)故障時(shí)選舉新的主節(jié)點(diǎn)的策略,即其中一個(gè)節(jié)點(diǎn)成為候選節(jié)點(diǎn)并得到大多數(shù)分組中每個(gè)分組的全部節(jié)點(diǎn)的投票后,該候選節(jié)點(diǎn)切換為新的主節(jié)點(diǎn),由此,本實(shí)施的應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法400可以在設(shè)備或網(wǎng)絡(luò)異常導(dǎo)致主節(jié)點(diǎn)與分組間的數(shù)據(jù)通信斷開(kāi)時(shí)及時(shí)切換主節(jié)點(diǎn),保證數(shù)據(jù)備份的可靠性。
請(qǐng)參考圖5,其示出了圖3所示的應(yīng)用于數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)方法的一個(gè)具體示例的原理示意圖,也即示出了也示出了服務(wù)器集群的上述基于分組的數(shù)據(jù)一致性協(xié)議的數(shù)據(jù)存儲(chǔ)方法中選舉主節(jié)點(diǎn)的一個(gè)應(yīng)用場(chǎng)景的示意圖。
如圖5所示,分布式數(shù)據(jù)服務(wù)器集群包括9個(gè)節(jié)點(diǎn)m(s0)、s1、s2、s3、s4、s5、s6、s7(m’)、s8、s9,分為5個(gè)分組,其中分組1包括節(jié)點(diǎn)m和s1,分組2包括節(jié)點(diǎn)s2、s3、s4,分組3包括節(jié)點(diǎn)s5,分組4包括節(jié)點(diǎn)s6和s7,分組5包括節(jié)點(diǎn)s8和s9。在分組1故障(例如分組1對(duì)應(yīng)的機(jī)房網(wǎng)絡(luò)異常)時(shí),主節(jié)點(diǎn)m無(wú)法與集群中的超過(guò)半數(shù)的分組保持?jǐn)?shù)據(jù)通信。這時(shí),節(jié)點(diǎn)s7可以發(fā)起選舉,向同一分組的其他節(jié)點(diǎn)s6以及其他分組發(fā)送選舉請(qǐng)求,在包括節(jié)點(diǎn)s7在內(nèi)的超過(guò)半數(shù)的分組中的所有節(jié)點(diǎn)均確認(rèn)投票給節(jié)點(diǎn)s7之后,節(jié)點(diǎn)s7切換為新的主節(jié)點(diǎn)。例如圖5中,分組2、分組3、分組5以及節(jié)點(diǎn)s7所在的分組中共4個(gè)分組的所有節(jié)點(diǎn)均確認(rèn)投票給節(jié)點(diǎn)s7,此時(shí)全部節(jié)點(diǎn)投票的分組數(shù)量超過(guò)半數(shù),則節(jié)點(diǎn)s7切換為主節(jié)點(diǎn)m’。
進(jìn)一步參考圖6,作為對(duì)上述各圖所示方法的實(shí)現(xiàn),本申請(qǐng)?zhí)峁┝艘环N應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器的一個(gè)實(shí)施例。
如圖6所示,本實(shí)施例的應(yīng)用于分布式服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器600包括:接收單元601、廣播單元602以及發(fā)送單元603。其中,接收單元601用于接收數(shù)據(jù)寫入請(qǐng)求,數(shù)據(jù)寫入請(qǐng)求包括待寫入數(shù)據(jù);廣播單元602用于將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的各個(gè)分組,每個(gè)分組包括至少一個(gè)節(jié)點(diǎn),且至少一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn);發(fā)送單元603用于響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息;其中,若分組中不包含服務(wù)器集群中的主節(jié)點(diǎn),分組用于響應(yīng)于分組中的至少一個(gè)節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在本實(shí)施例中,當(dāng)上述服務(wù)器600為服務(wù)器集群中的主節(jié)點(diǎn)時(shí),接收單元601可以從客戶端接收數(shù)據(jù)寫入請(qǐng)求,該數(shù)據(jù)寫入請(qǐng)求除了可以包括待寫入數(shù)據(jù)之外,還可以包括用戶標(biāo)識(shí)、客戶端的設(shè)備標(biāo)識(shí)、請(qǐng)求時(shí)間等。廣播單元602可以向服務(wù)器集群中的各個(gè)分組廣播接收單元601接收的數(shù)據(jù)寫入請(qǐng)求,以通知各分組進(jìn)行數(shù)據(jù)備份。與主服務(wù)器保持通信連接的分組中的服務(wù)器可以接收廣播單元602廣播的消息。發(fā)送單元603可以在超過(guò)半數(shù)的分組中每個(gè)分組的至少一個(gè)節(jié)點(diǎn)反饋確認(rèn)消息時(shí),確定待寫入數(shù)據(jù)已寫入超過(guò)半數(shù)的分組,這時(shí),可以向客戶端發(fā)送通知消息,告知客戶端數(shù)據(jù)已成功寫入。
在一些實(shí)施例中,若分組中包含主節(jié)點(diǎn),該主節(jié)點(diǎn)所在的分組響應(yīng)于主節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。在另一些實(shí)施例中,若分組包含主節(jié)點(diǎn)和至少一個(gè)從節(jié)點(diǎn),該主節(jié)點(diǎn)所在的分組響應(yīng)于主節(jié)點(diǎn)和分組內(nèi)的至少一個(gè)從節(jié)點(diǎn)將待寫入數(shù)據(jù)成功寫入內(nèi)存,向主節(jié)點(diǎn)反饋確認(rèn)消息。
在一些實(shí)施例中,上述服務(wù)器600還可以包括:請(qǐng)求單元和切換單元。當(dāng)服務(wù)器為服務(wù)器集群中的從節(jié)點(diǎn)時(shí),請(qǐng)求單元用于響應(yīng)于向主反饋確認(rèn)消息的分組數(shù)量低于半數(shù),或在預(yù)設(shè)時(shí)間內(nèi)超過(guò)半數(shù)的分組中每個(gè)分組中所有主節(jié)點(diǎn)均未收到主節(jié)點(diǎn)廣播的心跳消息,作為候選節(jié)點(diǎn)向各分組發(fā)出選舉請(qǐng)求;切換單元,用于響應(yīng)于接收到超過(guò)半數(shù)的分組中每個(gè)分組的所有節(jié)點(diǎn)的同意消息,切換為新的主節(jié)點(diǎn)。
在一些實(shí)施例中,上述服務(wù)器還包括確認(rèn)單元,配置用于響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向反饋確認(rèn)消息的各分組發(fā)送數(shù)據(jù)同步確認(rèn)消息。
應(yīng)當(dāng)理解,服務(wù)器600中記載的諸單元與參考圖2和圖4描述的方法中的各個(gè)步驟相對(duì)應(yīng)。由此,上文針對(duì)方法描述的操作和特征同樣適用于服務(wù)器600及其中包含的單元,在此不再贅述。
本申請(qǐng)實(shí)施例提供的應(yīng)用于分布式數(shù)據(jù)服務(wù)器集群的數(shù)據(jù)存儲(chǔ)服務(wù)器600,作為服務(wù)器集群中的主節(jié)點(diǎn),能夠接收客戶端發(fā)送的數(shù)據(jù)寫入請(qǐng)求,將數(shù)據(jù)寫入請(qǐng)求廣播至服務(wù)器集群中的多個(gè)分組,并在收到超過(guò)半數(shù)的分組中的至少一個(gè)節(jié)點(diǎn)反饋的確認(rèn)消息時(shí),向客戶端發(fā)送寫入成功的通知消息,可以減少保證數(shù)據(jù)一致性所需的節(jié)點(diǎn)數(shù)量,進(jìn)而提升了數(shù)據(jù)一致性前提下的服務(wù)可用性。
下面參考圖7,其示出了適于用來(lái)實(shí)現(xiàn)本申請(qǐng)實(shí)施例的分布式服務(wù)器集群中的服務(wù)器的計(jì)算機(jī)系統(tǒng)的結(jié)構(gòu)示意圖。圖7示出的服務(wù)器僅僅是一個(gè)示例,不應(yīng)對(duì)本申請(qǐng)實(shí)施例的功能和使用范圍帶來(lái)任何限制。
如圖7所示,計(jì)算機(jī)系統(tǒng)700包括中央處理單元(cpu)701,其可以根據(jù)存儲(chǔ)在只讀存儲(chǔ)器(rom)702中的程序或者從存儲(chǔ)部分708加載到隨機(jī)訪問(wèn)存儲(chǔ)器(ram)703中的程序而執(zhí)行各種適當(dāng)?shù)膭?dòng)作和處理。在ram703中,還存儲(chǔ)有系統(tǒng)700操作所需的各種程序和數(shù)據(jù)。cpu701、rom702以及ram703通過(guò)總線704彼此相連。輸入/輸出(i/o)接口705也連接至總線704。
以下部件連接至i/o接口705:包括鍵盤、鼠標(biāo)等的輸入部分706;包括諸如陰極射線管(crt)、液晶顯示器(lcd)等以及揚(yáng)聲器等的輸出部分707;包括硬盤等的存儲(chǔ)部分708;以及包括諸如lan卡、調(diào)制解調(diào)器等的網(wǎng)絡(luò)接口卡的通信部分709。通信部分709經(jīng)由諸如因特網(wǎng)的網(wǎng)絡(luò)執(zhí)行通信處理。驅(qū)動(dòng)器710也根據(jù)需要連接至i/o接口705??刹鹦督橘|(zhì)711,諸如磁盤、光盤、磁光盤、半導(dǎo)體存儲(chǔ)器等等,根據(jù)需要安裝在驅(qū)動(dòng)器710上,以便于從其上讀出的計(jì)算機(jī)程序根據(jù)需要被安裝入存儲(chǔ)部分708。
特別地,根據(jù)本公開(kāi)的實(shí)施例,上文參考流程圖描述的過(guò)程可以被實(shí)現(xiàn)為計(jì)算機(jī)軟件程序。例如,本公開(kāi)的實(shí)施例包括一種計(jì)算機(jī)程序產(chǎn)品,其包括承載在計(jì)算機(jī)可讀介質(zhì)上的計(jì)算機(jī)程序,該計(jì)算機(jī)程序包含用于執(zhí)行上述流程圖2或圖3所示的方法的程序代碼。在這樣的實(shí)施例中,該計(jì)算機(jī)程序可以通過(guò)通信部分709從網(wǎng)絡(luò)上被下載和安裝,和/或從可拆卸介質(zhì)711被安裝。在該計(jì)算機(jī)程序被中央處理單元(cpu)701執(zhí)行時(shí),執(zhí)行本申請(qǐng)的方法中限定的上述功能。需要說(shuō)明的是,本申請(qǐng)所述的計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)或者是上述兩者的任意組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)例如可以是——但不限于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、服務(wù)器或器件,或者任意以上的組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的更具體的例子可以包括但不限于:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)訪問(wèn)存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、可擦式可編程只讀存儲(chǔ)器(eprom或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(cd-rom)、光存儲(chǔ)器件、磁存儲(chǔ)器件、或者上述的任意合適的組合。在本申請(qǐng)中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、服務(wù)器或者器件使用或者與其結(jié)合使用。而在本申請(qǐng)中,計(jì)算機(jī)可讀的信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào),其中承載了計(jì)算機(jī)可讀的程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括但不限于電磁信號(hào)、光信號(hào)或上述的任意合適的組合。計(jì)算機(jī)可讀的信號(hào)介質(zhì)還可以是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)以外的任何計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、服務(wù)器或者器件使用或者與其結(jié)合使用的程序。計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括但不限于:無(wú)線、電線、光纜、rf等等,或者上述的任意合適的組合。
附圖中的流程圖和框圖,圖示了按照本申請(qǐng)各種實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段、或代碼的一部分,該模塊、程序段、或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來(lái)實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來(lái)實(shí)現(xiàn)。
描述于本申請(qǐng)實(shí)施例中所涉及到的單元可以通過(guò)軟件的方式實(shí)現(xiàn),也可以通過(guò)硬件的方式來(lái)實(shí)現(xiàn)。所描述的單元也可以設(shè)置在處理器中,例如,可以描述為:一種處理器包括獲取單元、統(tǒng)計(jì)單元、篩選單元、計(jì)算單元和確定單元。其中,這些單元的名稱在某種情況下并不構(gòu)成對(duì)該單元本身的限定,例如,接收單元還可以被描述為“接收數(shù)據(jù)寫入請(qǐng)求的單元”。
作為另一方面,本申請(qǐng)還提供了一種計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)可以是上述實(shí)施例中描述的服務(wù)器中所包含的;也可以是單獨(dú)存在,而未裝配入該服務(wù)器中。上述計(jì)算機(jī)可讀介質(zhì)承載有一個(gè)或者多個(gè)程序,當(dāng)上述一個(gè)或者多個(gè)程序被該服務(wù)器執(zhí)行時(shí),使得該服務(wù)器:接收數(shù)據(jù)寫入請(qǐng)求,所述數(shù)據(jù)寫入請(qǐng)求包括待寫入數(shù)據(jù);將所述數(shù)據(jù)寫入請(qǐng)求廣播至所述服務(wù)器集群中的各個(gè)分組,每個(gè)分組包括至少一個(gè)節(jié)點(diǎn)且至少一個(gè)分組包括至少兩個(gè)節(jié)點(diǎn);響應(yīng)于接收到超過(guò)半數(shù)的分組反饋的確認(rèn)消息,向發(fā)出所述數(shù)據(jù)寫入請(qǐng)求的客戶端發(fā)送寫入成功的通知消息;其中,若所述分組中不包含所述主節(jié)點(diǎn),所述分組響應(yīng)于所述分組中的至少一個(gè)節(jié)點(diǎn)將所述待寫入數(shù)據(jù)成功寫入內(nèi)存,向所述主節(jié)點(diǎn)反饋所述確認(rèn)消息。
以上描述僅為本申請(qǐng)的較佳實(shí)施例以及對(duì)所運(yùn)用技術(shù)原理的說(shuō)明。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,本申請(qǐng)中所涉及的發(fā)明范圍,并不限于上述技術(shù)特征的特定組合而成的技術(shù)方案,同時(shí)也應(yīng)涵蓋在不脫離上述發(fā)明構(gòu)思的情況下,由上述技術(shù)特征或其等同特征進(jìn)行任意組合而形成的其它技術(shù)方案。例如上述特征與本申請(qǐng)中公開(kāi)的(但不限于)具有類似功能的技術(shù)特征進(jìn)行互相替換而形成的技術(shù)方案。