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