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