一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本申請(qǐng)涉及計(jì)算機(jī)存儲(chǔ)技術(shù)領(lǐng)域,尤其涉及一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法及裝置。
【背景技術(shù)】
[0002]分布式數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)量較小的維度表一般以全復(fù)制的方式分布在系統(tǒng)的各個(gè)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)上,這樣可以大大提升分布表與維度表之間的關(guān)聯(lián)操作的效率,所有的關(guān)聯(lián)算子均可以在本地完成后再在上層合并。
[0003]對(duì)于復(fù)制表數(shù)據(jù)的更改,即DML操作(數(shù)據(jù)操作語(yǔ)言,Data Manipulat1nLanguage)需要保證其在所有節(jié)點(diǎn)上執(zhí)行的一致性,如insert ,delete和update等操作。在分布式系統(tǒng)下,由于多臺(tái)數(shù)據(jù)庫(kù)服務(wù)器組成的集群,某一臺(tái)節(jié)點(diǎn)出現(xiàn)故障的概率相對(duì)比較高,所以為了保證系統(tǒng)的可用性,通常犧牲數(shù)據(jù)強(qiáng)一致性來(lái)達(dá)到最終一致性。
[0004]在分布式數(shù)據(jù)庫(kù)領(lǐng)域,解決數(shù)據(jù)一致性的傳統(tǒng)方法一般是借助于兩階段提交協(xié)議(Two-Phase Commit Protocol),主要包括如下兩個(gè)階段:
[0005]I)請(qǐng)求階段(commit-request phase):主要是協(xié)調(diào)者將請(qǐng)求通知所有參與者,參與者將同意(執(zhí)行成功)或者取消(執(zhí)行失敗)返回給協(xié)調(diào)者;
[0006]2)提交階段(commit phase):協(xié)調(diào)者根據(jù)所有參與者的結(jié)果進(jìn)行決策,所有均成功則通知各參與者提交事務(wù),否則通知所有參與者取消事務(wù);參與者在收到消息后執(zhí)行相應(yīng)操作。
[0007]但上述方法中兩個(gè)階段均需要參與者全部返回消息,雖然有超時(shí)機(jī)制,但對(duì)于客戶(hù)端而言,一次請(qǐng)求需要同步等待的代價(jià)依然較大,實(shí)際執(zhí)行效率較低。
[0008]現(xiàn)有技術(shù)不足在于:
[0009]借助兩階段提交協(xié)議解決數(shù)據(jù)一致性的方式執(zhí)行效率較低。
【發(fā)明內(nèi)容】
[0010]本申請(qǐng)實(shí)施例提出了一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法及裝置,以解決現(xiàn)有技術(shù)中借助兩階段提交協(xié)議解決數(shù)據(jù)一致性的方式執(zhí)行效率較低的技術(shù)問(wèn)題。
[0011]本申請(qǐng)實(shí)施例提供了一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法,包括如下步驟:
[0012]領(lǐng)導(dǎo)者leader節(jié)點(diǎn)接收客戶(hù)端發(fā)送的數(shù)據(jù)操作語(yǔ)言DML操作指令;
[0013]所述leader節(jié)點(diǎn)將所述DML操作指令追加到本地日志log中,并將包括所述DML操作指令的日志同步復(fù)制至跟隨者follower節(jié)點(diǎn);
[0014]所述follower節(jié)點(diǎn)將所述leader節(jié)點(diǎn)發(fā)送的DML操作指令追加到本地日志log中;
[0015]所述leader節(jié)點(diǎn)和所述follower節(jié)點(diǎn)的本地狀態(tài)機(jī)分別從各自的本地log中依次讀取所述DML操作指令并放到數(shù)據(jù)庫(kù)中執(zhí)行。
[0016]本申請(qǐng)實(shí)施例提供了一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的裝置,包括:
[0017]第一接收模塊,用于領(lǐng)導(dǎo)者leader節(jié)點(diǎn)接收客戶(hù)端發(fā)送的數(shù)據(jù)操作語(yǔ)言DML操作指令;
[0018]第一處理模塊,用于所述leader節(jié)點(diǎn)將所述DML操作指令追加到本地日志log中;
[0019]發(fā)送模塊,用于所述leader節(jié)點(diǎn)將包括所述DML操作指令的日志發(fā)送至跟隨者foil ower 節(jié)點(diǎn);
[0020]第二接收模塊,用于所述follower節(jié)點(diǎn)接收所述leader節(jié)點(diǎn)發(fā)送的包括所述DML操作指令的日志;
[0021 ]第二處理模塊,用于所述follower節(jié)點(diǎn)將所述DML操作指令追加到本地日志log中;
[0022]執(zhí)行模塊,用于所述leader節(jié)點(diǎn)和所述follower節(jié)點(diǎn)的本地狀態(tài)機(jī)分別從各自的本地log中依次讀取所述DML操作指令并放到數(shù)據(jù)庫(kù)中執(zhí)行。
[0023]有益效果如下:
[0024]由于本申請(qǐng)實(shí)施例由leader節(jié)點(diǎn)作為客戶(hù)端接口和內(nèi)部通信的發(fā)起者,避免了分布式系統(tǒng)中因?yàn)楣收蠈?dǎo)致的角色混亂等現(xiàn)象出現(xiàn),由leader節(jié)點(diǎn)統(tǒng)一復(fù)制日志到其他follower節(jié)點(diǎn),確保數(shù)據(jù)一致性;并且,由于leader節(jié)點(diǎn)復(fù)制日志到其他follower節(jié)點(diǎn)與節(jié)點(diǎn)上本地狀態(tài)機(jī)執(zhí)行操作可以為后臺(tái)異步操作,客戶(hù)端需要同步等待的開(kāi)銷(xiāo)大大降低,從而提高了整個(gè)系統(tǒng)正常運(yùn)行的吞吐量。
【附圖說(shuō)明】
[0025]下面將參照附圖描述本申請(qǐng)的具體實(shí)施例,其中:
[0026]圖1示出了本申請(qǐng)實(shí)施例中實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法實(shí)施的流程示意圖;
[0027]圖2示出了本申請(qǐng)實(shí)施例中復(fù)制狀態(tài)機(jī)的結(jié)構(gòu)示意圖;
[0028]圖3示出了本申請(qǐng)實(shí)施例中節(jié)點(diǎn)選舉的過(guò)程示意圖;
[0029]圖4示出了本申請(qǐng)實(shí)施例中日志結(jié)構(gòu)及復(fù)制過(guò)程的示意圖;
[0030]圖5示出了本申請(qǐng)實(shí)施例中客戶(hù)端與server端交互的過(guò)程示意圖;
[0031]圖6示出了本申請(qǐng)實(shí)施例中實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0032]為了使本申請(qǐng)的技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖對(duì)本申請(qǐng)的示例性實(shí)施例進(jìn)行進(jìn)一步詳細(xì)的說(shuō)明,顯然,所描述的實(shí)施例僅是本申請(qǐng)的一部分實(shí)施例,而不是所有實(shí)施例的窮舉。并且在不沖突的情況下,本說(shuō)明中的實(shí)施例及實(shí)施例中的特征可以互相結(jié)合。
[0033]發(fā)明人在發(fā)明過(guò)程中注意到:
[0034]分布式系統(tǒng)一致性理論一直是業(yè)界研究的重點(diǎn),過(guò)去的一段時(shí)間里,Paxos—直是分布式協(xié)議的標(biāo)準(zhǔn),Google大數(shù)據(jù)三駕馬車(chē)(MapReduce,BigTable,GFS)中的Chubby Lock服務(wù)使用Paxos作為其一致性算法。
[0035]開(kāi)源系統(tǒng)Apache Hadoop中對(duì)應(yīng)Chubby的開(kāi)源組件Zookeeper也實(shí)現(xiàn)了維護(hù)系統(tǒng)元數(shù)據(jù)、狀態(tài)一致性的組件,廣泛用于Hdf s,HBase和MapReduce中。
[0036]Paxos算法的理論闡述比較復(fù)雜、難以理解,所以在工業(yè)上完整的實(shí)現(xiàn)并不常見(jiàn)。Chubby目前只在Google內(nèi)部系統(tǒng)中使用,而Zookeeper也只是模仿Chubby實(shí)現(xiàn)了FastPaxos的部分功能,目前只是在分布式NoSQL系統(tǒng)中使用較為廣泛。
[0037]針對(duì)現(xiàn)有技術(shù)的不足,本申請(qǐng)實(shí)施例提出了一種實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法及裝置,將Raft協(xié)議的核心算法應(yīng)用到實(shí)際的分布式數(shù)據(jù)庫(kù)系統(tǒng)中,高效、高可用的保證分布式數(shù)據(jù)庫(kù)數(shù)據(jù)一致性,下面進(jìn)行說(shuō)明。
[0038]圖1示出了本申請(qǐng)實(shí)施例實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法實(shí)施的流程示意圖,如圖所示,所述實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法可以包括如下步驟:
[0039]步驟101、領(lǐng)導(dǎo)者leader節(jié)點(diǎn)接收客戶(hù)端發(fā)送的數(shù)據(jù)操作語(yǔ)言DML操作指令;
[0040]步驟102、所述leader節(jié)點(diǎn)將所述DML操作指令追加到本地日志log中,并將包括所述DML操作指令的日志同步復(fù)制至跟隨者follower節(jié)點(diǎn);
[0041 ] 步驟103、所述f oil ower節(jié)點(diǎn)將所述I eader節(jié)點(diǎn)發(fā)送的DML操作指令追加到本地日志log中;
[0042]步驟104、所述leader節(jié)點(diǎn)和所述follower節(jié)點(diǎn)的本地狀態(tài)機(jī)分別從各自的本地log中依次讀取所述DML操作指令并放到數(shù)據(jù)庫(kù)中執(zhí)行。
[0043]本申請(qǐng)實(shí)施例所提供的實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法及裝置,leader節(jié)點(diǎn)接收到客戶(hù)端發(fā)送的數(shù)據(jù)操作語(yǔ)言DML操作指令后,將所述DML操作指令追加到本地日志log中,并將包括所述DML操作指令的日志發(fā)送至跟隨者follower節(jié)點(diǎn);所述follower節(jié)點(diǎn)將所述DML操作指令追加到本地日志log中,所有節(jié)點(diǎn)(包括所述leader節(jié)點(diǎn)和所述follower節(jié)點(diǎn))的本地狀態(tài)機(jī)從各自的本地log中順次讀取所述DML操作指令并放到數(shù)據(jù)庫(kù)中執(zhí)行。
[0044]由于本申請(qǐng)實(shí)施例由leader節(jié)點(diǎn)作為客戶(hù)端接口和內(nèi)部通信的發(fā)起者,避免了分布式系統(tǒng)中因?yàn)楣收蠈?dǎo)致的角色混亂等現(xiàn)象出現(xiàn),由leader節(jié)點(diǎn)統(tǒng)一復(fù)制日志到其他follower節(jié)點(diǎn),本申請(qǐng)實(shí)施例通過(guò)保證日志的一致性來(lái)實(shí)現(xiàn)本地狀態(tài)機(jī)操作的一致性;并且,由于leader節(jié)點(diǎn)復(fù)制日志到其他follower節(jié)點(diǎn)與節(jié)點(diǎn)上本地狀態(tài)機(jī)執(zhí)行操作可以為后臺(tái)異步操作,客戶(hù)端需要同步等待的開(kāi)銷(xiāo)大大降低,從而提高了整個(gè)系統(tǒng)正常運(yùn)行的吞吐量。
[0045]實(shí)施中,在所述領(lǐng)導(dǎo)者leader節(jié)點(diǎn)接收客戶(hù)端發(fā)送的數(shù)據(jù)操作語(yǔ)言DML操作指令之后、所述leader節(jié)點(diǎn)將所述DML操作指令追加到本地日志log之前,所述方法可以進(jìn)一步包括:
[0046]所述leader節(jié)點(diǎn)執(zhí)行所述DML操作指令到本地?cái)?shù)據(jù)庫(kù),確定所述DML操作指令為可執(zhí)行后執(zhí)行回滾rollback操作。
[0047]本申請(qǐng)實(shí)施例所提供的實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)操作一致性的方法,leader節(jié)點(diǎn)接收客戶(hù)端發(fā)送的DML操作指令;leader節(jié)點(diǎn)先直接執(zhí)行該DML操作到本地?cái)?shù)據(jù)庫(kù),如果執(zhí)行出現(xiàn)異常,則直接返回客戶(hù)端異常信息,如果執(zhí)行成功,則rollback該條操作(此時(shí)不提交commit)。
[0048]所述leader節(jié)點(diǎn)把該條DML操作指令追加到本地日志log中,并將包括DML操作指令的日志同步復(fù)制至follower節(jié)點(diǎn),返回客戶(hù)端成功信息;所述follower節(jié)點(diǎn)將leader節(jié)點(diǎn)發(fā)送的DML操作指令追加到本地日志log中。
[0049]所有server節(jié)點(diǎn)的本地狀態(tài)機(jī)從本地log中順序依次讀取DML操作指令并放到數(shù)據(jù)庫(kù)中執(zhí)行并commit。
[0050]本申請(qǐng)實(shí)施例增加了測(cè)試環(huán)節(jié),以驗(yàn)證客戶(hù)端發(fā)送的DML操作指令是否為可以正常執(zhí)行的指令,如果為正常指令再執(zhí)行后續(xù)同步操作,如果為不正常指令則無(wú)需進(jìn)行后續(xù)同步操作,直接反饋客戶(hù)端異常信息,以確保同步的日志的可靠性。
[00