本發(fā)明涉及分布式數(shù)據(jù)庫領(lǐng)域,尤其涉及一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法及其系統(tǒng)。
背景技術(shù):
大數(shù)據(jù)時代,分布式數(shù)據(jù)庫成為數(shù)據(jù)存儲的必要基礎(chǔ)設(shè)施。分布式數(shù)據(jù)庫系統(tǒng)存在一些問題,其中,對于大多數(shù)應(yīng)用服務(wù)來說,可用性問題是一個基本問題。提供一定程度高可用性服務(wù),是分布式數(shù)據(jù)庫系統(tǒng)必備的特征之一。
目前有很多分布式數(shù)據(jù)庫系統(tǒng)的高可用性方案,常采用單節(jié)點高可用組件進行故障檢測和故障處理。該方案存在單點故障,在高可用性組件本身異常時,將無法提供高可用性服務(wù)。
對于高可用性組件(ha組件)多節(jié)點部署的分布式高可用性系統(tǒng),可以解決單點問題。但是,多個高可用性組件節(jié)點之間必須確定主備關(guān)系,只有主節(jié)點可以對故障進行處理,否則多個高可用性節(jié)點的操作很容易造成沖突。如果采用固定的主備角色關(guān)系,當(dāng)主節(jié)點異常,其它備節(jié)點將不能進行故障處理,因此,常見的該類方案采用動態(tài)的主備角色關(guān)系。通過一定的算法確定主備節(jié)點,當(dāng)主節(jié)點異常時,再從備節(jié)點中選出一個節(jié)點作為主節(jié)點。選主算法通常比較復(fù)雜,在網(wǎng)絡(luò)不穩(wěn)定的時候,易出現(xiàn)腦裂現(xiàn)象,即同一時刻存在多于一個的主節(jié)點。而理論上能保證一致性的算法,如常見的paxos算法、raft算法等,實現(xiàn)比較困難,容易產(chǎn)生死鎖。
在申請?zhí)枮?01410854727.6的專利公開文件中,提出了一種應(yīng)用于分布式數(shù)據(jù)庫的解決2pc模型單點故障問題的方法,包括:建立一列從協(xié)調(diào)者隊列,存入多個站點作為從協(xié)調(diào)者,其中每個從協(xié)調(diào)者的功能和協(xié)調(diào)者是相同的;協(xié)調(diào)者與多個參與者之間按照兩階段提交協(xié)議通過數(shù)據(jù)包進行通信;同時,協(xié)調(diào)者和所有從協(xié)調(diào)者之間每隔一時間段進行一次通信;若從協(xié)調(diào)者在這個時間段后沒有收到協(xié)調(diào)者發(fā)送的消息,則認為協(xié)調(diào)者發(fā)生阻塞,系統(tǒng)立即根據(jù)一定算 法從協(xié)調(diào)者隊列中選擇一從協(xié)調(diào)者作為新的協(xié)調(diào)者與多個參與者進行通信。但該方法不能完全地防止腦裂現(xiàn)象,且協(xié)調(diào)者之間需要定時互相通信,可能會降低效率。
技術(shù)實現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是:提供一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法及其系統(tǒng),可確定唯一的主節(jié)點。
為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法,包括:
各個ha組件發(fā)送寫請求給協(xié)調(diào)組件;
協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;
一ha組件獲取所述關(guān)聯(lián)信息;
所述一ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;
判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識。
本發(fā)明還涉及一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主系統(tǒng),包括:
發(fā)送模塊,用于各個ha組件發(fā)送寫請求給協(xié)調(diào)組件;
賦予模塊,用于協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;
第一獲取模塊,用于一ha組件獲取所述關(guān)聯(lián)信息;
第二獲取模塊,用于所述一ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;
判斷模塊,用于判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識。
本發(fā)明的有益效果在于:通過在分布式數(shù)據(jù)庫的總體架構(gòu)中引入?yún)f(xié)調(diào)組件,通過協(xié)調(diào)組件實現(xiàn)ha組件之間的相互通信,可提高ha組件的效率;根據(jù)協(xié)調(diào)組件的順序一致性等特性,賦予各個ha組件唯一的標識,可使各個ha組件根據(jù)所述標識的唯一性,確定出唯一的主節(jié)點,進而防止腦裂現(xiàn)象。
附圖說明
圖1為本發(fā)明一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法的流程圖;
圖2為本發(fā)明實施例一的分布式數(shù)據(jù)庫系統(tǒng)的架構(gòu)示意圖;
圖3為本發(fā)明實施例一的方法流程圖;
圖4為本發(fā)明一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主系統(tǒng)的結(jié)構(gòu)示意圖;
圖5為本發(fā)明實施例二的系統(tǒng)結(jié)構(gòu)示意圖。
標號說明:
1、數(shù)據(jù)庫集群;2、ha組件集群;3、數(shù)據(jù)庫代理;4、協(xié)調(diào)組件;
101、發(fā)送模塊;102、賦予模塊;103、第一獲取模塊;104、第二獲取模塊;105、判斷模塊;106、第一判定模塊;107、第一刪除模塊;108、通知模塊;109、選定模塊;110、第二判定模塊;111、第二刪除模塊。
具體實施方式
為詳細說明本發(fā)明的技術(shù)內(nèi)容、所實現(xiàn)目的及效果,以下結(jié)合實施方式并配合附圖詳予說明。
本發(fā)明最關(guān)鍵的構(gòu)思在于:基于協(xié)調(diào)組件實現(xiàn)ha組件之間的角色分配,根據(jù)唯一的標識,確定出唯一的主節(jié)點。
請參閱圖1,一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法,包括:
各個ha組件發(fā)送寫請求給協(xié)調(diào)組件;
協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;
一ha組件獲取所述關(guān)聯(lián)信息;
所述一ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;
判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識。
從上述描述可知,本發(fā)明的有益效果在于:可根據(jù)唯一的標識,確定唯一的主節(jié)點,防止腦裂現(xiàn)象。
進一步地,所述寫請求包括與ha組件唯一對應(yīng)的ha組件數(shù)據(jù)。
由上述描述可知,通過唯一對應(yīng)ha組件的ha組件數(shù)據(jù),可使各個ha組 件唯一獲取到與其對應(yīng)的標識,防止出現(xiàn)一個ha組件獲取到多個標識的情況。
進一步地,所述“協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息”具體為:
協(xié)調(diào)組件根據(jù)收到各個ha組件的所述寫請求的時間先后,分別賦予各個ha組件一個依次遞增的序列號,獲取各個ha組件與其序列號的關(guān)聯(lián)信息。
由上述描述可知,根據(jù)協(xié)調(diào)組件的特性,各個ha組件均對應(yīng)一個不重復(fù)的序列號,可根據(jù)判斷唯一的序列號是否為預(yù)選為備用主節(jié)點的序列號來快速地確定出唯一的主節(jié)點。
進一步地,所述“判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識”之后,進一步包括:
若所述標識為預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為主節(jié)點;
若原主節(jié)點故障,則協(xié)調(diào)組件刪除原主節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息;
協(xié)調(diào)組件發(fā)送所述原主節(jié)點異常的事件通知給各個ha組件;
選定已判定為主節(jié)點的所述一ha組件為新的主節(jié)點。
進一步地,所述“判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識”之后,進一步包括:
若所述標識不是預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為從節(jié)點;
若從節(jié)點故障,則協(xié)調(diào)組件刪除所述從節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息。
由上述描述可知,在節(jié)點發(fā)生故障時,協(xié)調(diào)組件自動刪除對應(yīng)的關(guān)聯(lián)信息,防止出現(xiàn)故障的節(jié)點被選為主節(jié)點的情況;若為主節(jié)點發(fā)生故障,則在啟動且正常的從節(jié)點中選出新的主節(jié)點,解決了單點故障問題,可繼續(xù)執(zhí)行高可用性功能。
請參照圖4,本發(fā)明還提出一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主系統(tǒng),包括:
發(fā)送模塊,用于各個ha組件發(fā)送寫請求給協(xié)調(diào)組件;
賦予模塊,用于協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;
第一獲取模塊,用于一ha組件獲取所述關(guān)聯(lián)信息;
第二獲取模塊,用于所述一ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;
判斷模塊,用于判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識。
進一步地,所述寫請求包括與ha組件唯一對應(yīng)的ha組件數(shù)據(jù)。
進一步地,所述賦予模塊具體用于協(xié)調(diào)組件根據(jù)收到各個ha組件的所述寫請求的時間先后,分別賦予各個ha組件一個依次遞增的序列號,獲取各個ha組件與其序列號的關(guān)聯(lián)信息。
進一步地,還包括:
第一判定模塊,用于若所述標識為預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為主節(jié)點;
第一刪除模塊,用于若原主節(jié)點故障,則協(xié)調(diào)組件刪除原主節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息;
通知模塊,用于協(xié)調(diào)組件發(fā)送所述原主節(jié)點異常的事件通知給各個ha組件;
選定模塊,用于選定已判定為主節(jié)點的所述一ha組件為新的主節(jié)點。
進一步地,還包括:
第二判定模塊,用于若所述標識不是預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為從節(jié)點;
第二刪除模塊,用于若從節(jié)點故障,則協(xié)調(diào)組件刪除所述從節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息。
實施例一
請參照圖1,本發(fā)明的實施例一為:一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法,請參照圖2,所述分布式數(shù)據(jù)庫系統(tǒng)包括數(shù)據(jù)庫集群1、ha組件集群2、數(shù)據(jù)庫代理3和協(xié)調(diào)組件4。所述數(shù)據(jù)庫集群1由至少一個數(shù)據(jù)庫組構(gòu)成,一個數(shù)據(jù)庫組包含一個主數(shù)據(jù)庫節(jié)點和至少一個備數(shù)據(jù)庫節(jié)點。所述ha組件集群2中的ha組件提供數(shù)據(jù)庫集群1的高可用性功能。所述協(xié)調(diào)組件4保存數(shù)據(jù)庫集群1信息,包括所有的數(shù)據(jù)庫組和其中的數(shù)據(jù)庫節(jié)點的主備信息等,當(dāng)數(shù)據(jù)庫集群1信息發(fā)生改變時,主動通知數(shù)據(jù)庫代理3和ha組件。所述數(shù)據(jù)庫代理3 從協(xié)調(diào)組件4讀取整個數(shù)據(jù)庫集群1信息,根據(jù)一定的分片規(guī)則,將客戶端的請求路由到對應(yīng)的數(shù)據(jù)庫節(jié)點。當(dāng)數(shù)據(jù)庫集群1信息發(fā)生變化時,由協(xié)調(diào)組件4通知數(shù)據(jù)庫代理3更新信息。ha組件從協(xié)調(diào)組件4讀取數(shù)據(jù)庫集群1信息,隨后定期對數(shù)據(jù)庫節(jié)點進行故障檢測,若有故障發(fā)生,則進行相應(yīng)的故障處理。
所述ha組件采用分布式多節(jié)點部署,避免單點問題。每個ha組件有兩種角色狀態(tài),主節(jié)點和從節(jié)點。在一個分布式部署的ha組件集群2中,同一時刻有且只有一個ha組件節(jié)點是主節(jié)點,其它ha組件節(jié)點均是從節(jié)點。
所述協(xié)調(diào)組件4可多節(jié)點分布式部署,且應(yīng)具有如下特征:
順序一致性,按照客戶端發(fā)送請求的順序更新數(shù)據(jù);
原子性,更新要么成功,要么失敗,不會出現(xiàn)部分更新;
單一性,無論客戶端連接哪個節(jié)點,都會看到同一個視圖;
可靠性,一旦數(shù)據(jù)更新成功,將一直保持,直到新的更新;
及時性,客戶端會在一個確定的時間內(nèi)得到最新的數(shù)據(jù)。
圖2中的實線表示數(shù)據(jù)傳輸,點劃線表示心跳,虛線表示監(jiān)聽。
所述協(xié)調(diào)組件4可以自主開發(fā),也可以使用如zookeeper、etcd等開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù)軟件。本實施例以zookeeper作為協(xié)調(diào)組件4為例。
請參照圖3,所述方法包括如下步驟:
s1:啟動ha組件;例如,在ha組件集群中啟動id分別為ha_x、ha_y、ha_z三個ha組件。
s2:所述ha組件啟動后,自動連接協(xié)調(diào)組件zookeeper。
s3:各個ha組件發(fā)送寫請求給協(xié)調(diào)組件,所述寫請求包括與ha組件唯一對應(yīng)的ha組件數(shù)據(jù);例如,各個ha組件將各自的節(jié)點id以臨時節(jié)點和順序節(jié)點的方式寫入所述協(xié)調(diào)組件zookeeper中。
s4:協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;可選地,協(xié)調(diào)組件根據(jù)收到各個ha組件的寫請求的時間先后,分別賦予各個ha組件一個依次遞增的序列號,從而獲取各個ha組件與其序列號的關(guān)聯(lián)信息;例如,協(xié)調(diào)組件zookeeper根據(jù)實際收到寫清求的時間,寫入包括節(jié)點id和一個遞增的序列號的數(shù)據(jù),也就是說, zookeeper最終寫入的數(shù)據(jù)為ha_x_0001、ha_y_0002和ha_z_0003。
s5:各個ha組件從協(xié)調(diào)組件中獲取所述關(guān)聯(lián)信息;例如,從協(xié)調(diào)組件zookeeper中獲取所述最終寫入的數(shù)據(jù)。
s6:各個ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;例如,id為ha_x的ha組件獲取了ha_x_0001、ha_y_0002和ha_z_0003,將自身id與ha_x_0001、ha_y_0002和ha_z_0003進行對比,得到自身對應(yīng)的序列號為001。
s7:各個ha組件判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識;例如,預(yù)設(shè)備選的主節(jié)點為序列號最小的ha組件,則每個ha組件都將判斷自身對應(yīng)的序列號是否最小,若是,執(zhí)行s8,若否,執(zhí)行s9;可選地,也可以預(yù)設(shè)主節(jié)點為序列號最大的ha組件。
s8:判定所述ha組件為主節(jié)點,所述ha組件將自身的角色設(shè)為主節(jié)點,開始執(zhí)行主節(jié)點的功能。
s9:判定所述ha組件為從節(jié)點。
s10:所有啟動的ha組件監(jiān)聽協(xié)調(diào)組件,即主節(jié)點和從節(jié)點都監(jiān)聽協(xié)調(diào)組件。
s11:若有節(jié)點故障,判斷故障的節(jié)點是否為主節(jié)點,若否,執(zhí)行s12,若是,執(zhí)行s13。
s12:協(xié)調(diào)組件刪除所述從節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息。
s13:協(xié)調(diào)組件刪除主節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息,并發(fā)送主節(jié)點異常的事件通知給從節(jié)點,從節(jié)點執(zhí)行步驟s5。
本實施例基于協(xié)調(diào)組件的順序一致性特性,不會同時有兩個ha組件對應(yīng)相同的序列號,這就保證了對應(yīng)最小序列號的ha組件只有一個,從而確定出唯一的主節(jié)點,防止出現(xiàn)腦裂現(xiàn)象。
實施例二
請參照圖5,本實施例為對應(yīng)實施例一的方法的一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主系統(tǒng),包括:
發(fā)送模塊101,用于各個ha組件發(fā)送寫請求給協(xié)調(diào)組件;
賦予模塊102,用于協(xié)調(diào)組件根據(jù)所述寫請求,分別賦予各個ha組件唯一 的標識,獲取各個ha組件與其對應(yīng)標識的關(guān)聯(lián)信息;所述寫請求包括與ha組件唯一對應(yīng)的ha組件數(shù)據(jù)??蛇x地,所述賦予模塊102具體用于協(xié)調(diào)組件根據(jù)收到各個ha組件的所述寫請求的時間先后,分別賦予各個ha組件一個依次遞增的序列號,獲取各個ha組件與其序列號的關(guān)聯(lián)信息。
第一獲取模塊103,用于一ha組件獲取所述關(guān)聯(lián)信息;
第二獲取模塊104,用于所述一ha組件依據(jù)所述關(guān)聯(lián)信息獲取與其對應(yīng)的標識;
判斷模塊105,用于判斷所述標識是否為預(yù)設(shè)的主節(jié)點標識。
該系統(tǒng)還包括:
第一判定模塊106,用于若所述標識為預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為主節(jié)點;
第一刪除模塊107,用于若原主節(jié)點故障,則協(xié)調(diào)組件刪除原主節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息;
通知模塊108,用于協(xié)調(diào)組件發(fā)送所述原主節(jié)點異常的事件通知給各個ha組件;
選定模塊109,用于選定已判定為主節(jié)點的所述一ha組件為新的主節(jié)點。
該系統(tǒng)還包括
第二判定模塊110,用于若所述標識不是預(yù)設(shè)的主節(jié)點標識,則判定所述一ha組件為從節(jié)點;
第二刪除模塊111,用于若從節(jié)點故障,則協(xié)調(diào)組件刪除所述從節(jié)點與其對應(yīng)標識的關(guān)聯(lián)信息。
綜上所述,本發(fā)明提供的一種分布式數(shù)據(jù)庫系統(tǒng)的ha組件選主方法及其系統(tǒng),通過在分布式數(shù)據(jù)庫的總體架構(gòu)中引入?yún)f(xié)調(diào)組件,通過協(xié)調(diào)組件實現(xiàn)ha組件之間的相互通信,可提高ha組件的效率;通過唯一對應(yīng)ha組件的ha組件數(shù)據(jù),可使各個ha組件唯一獲取到與其對應(yīng)的標識,防止出現(xiàn)一個ha組件獲取到多個標識的情況;根據(jù)協(xié)調(diào)組件的順序一致性等特性,各個ha組件均對應(yīng)一個不重復(fù)的序列號,可根據(jù)判斷唯一的序列號是否為預(yù)選為備用主節(jié)點的序列號來快速地確定出唯一的主節(jié)點,防止腦裂現(xiàn)象。
以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等同變換,或直接或間接運用在相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護范圍內(nèi)。