本公開涉及數據庫技術領域,特別涉及一種數據庫集群的管理方法及裝置。
背景技術:
galeracluster是一套基于同步復制的多主mysql(一種關系型數據庫)集群,使用簡單,沒有單點故障,可用性高,能很好保證業(yè)務不斷增長時我們數據的安全和隨時的擴展,號稱是世界上最先進的開源數據庫集群。其主要特點如下:同步復制、多主服務器的拓撲結構、可以在任意節(jié)點上進行讀寫、自動剔除故障節(jié)點、自動加入新節(jié)點、真正行級別的并發(fā)復制、客戶端連接與操作單臺mysql數據庫的體驗一致。
galeracluster的架構圖如圖1所示,客戶端可以和集群中任何一個節(jié)點連接,每個節(jié)點都可以進行讀寫,寫的話要不所有服務器都執(zhí)行成功,要不就所有都回滾,保證所有服務器的數據一致性,而且所有服務器同步實時更新。galeracluster集群啟動的時候必須有一個節(jié)點以新節(jié)點的方式啟動,然后再將其他節(jié)點加入集群,新加入的節(jié)點從集群中選擇一個節(jié)點進行同步數據。galeracluster維護了一個自增的seqno(序列號),每個節(jié)點都有著相同的seqno。當集群中節(jié)點停止后會把seqno持久化到grastate.dat文件中,集群中最后停掉的節(jié)點也會在grastate.dat文件置一個標志,下次集群啟動的時候必須以最后停掉的這個節(jié)點為新節(jié)點啟動,然后再將其他節(jié)點加入集群。
需要說明的是,galeracluster集群本身其實不是自動的,也不是高可用的,比如說:剛開始創(chuàng)建集群的時候必須手動配置一個節(jié)點以集群首節(jié)點的方式啟動,然后其他節(jié)點再加入集群;當集群中有節(jié)點脫離集群后用戶無法感知;脫離集群后的節(jié)點想要再加入集群必須手動加入;當整個集群死掉后必須手動找到seqno最大的節(jié)點以集群首節(jié)點啟動,然后再將其他節(jié)點加入。由此可知,galeracluster集群管理需要人工參與,無法實現自動化。
技術實現要素:
為了解決相關技術中存在的galeracluster集群管理需要人工參與,無法實現自動化的問題,本公開提供了一種數據庫集群的管理方法。
本公開提供了一種數據庫集群的管理方法,所述數據庫集群的每個節(jié)點內設有一個代理實體,每個代理實體分別控制各自所在的節(jié)點,所述數據庫集群的管理方法應用于所述代理實體;所述方法包括:
在本節(jié)點未啟動時,獲取第二節(jié)點的節(jié)點信息;其中,所述第二節(jié)點為所述數據庫集群內除本節(jié)點以外的所有其他節(jié)點;
若根據所述第二節(jié)點的節(jié)點信息,判斷獲知不存在滿足預設條件的第二節(jié)點,則將所述本節(jié)點以所述數據庫集群的首節(jié)點啟動。
本公開還提供了一種數據庫集群的管理裝置,所述數據庫集群的每個節(jié)點內設有一個代理實體,每個代理實體分別控制各自所在的節(jié)點,所述數據庫集群的管理裝置應用于所述代理實體;所述裝置包括:
信息獲取模塊,用于在本節(jié)點未啟動時,獲取第二節(jié)點的節(jié)點信息;其中,所述第二節(jié)點為所述數據庫集群內除本節(jié)點以外的所有其他節(jié)點;
節(jié)點啟動模塊,用于根據所述第二節(jié)點的節(jié)點信息,當判斷獲知不存在滿足預設條件的第二節(jié)點時,將所述本節(jié)點以所述數據庫集群的首節(jié)點啟動。
本公開的實施例提供的技術方案可以包括以下有益效果:
通過在每個節(jié)點內設有一個代理實體,每個代理實體分別控制各自所在的節(jié)點,代理實體根據各個節(jié)點的信息可以自動確定集群首節(jié)點并啟動,無需人工參與,大大提高了集群啟動效率。
應當理解的是,以上的一般描述和后文的細節(jié)描述僅是示例性的,并不能限制本公開。
附圖說明
此處的附圖被并入說明書中并構成本說明書的一部分,示出了符合本發(fā)明的實施例,并于說明書一起用于解釋本發(fā)明的原理。
圖1是現有技術提供的galeracluster集群的架構圖;
圖2是根據一示例性實施例示出的一種數據庫集群的管理方法的流程圖;
圖3是根據一示例性實施例示出的數據庫集群的部署圖;
圖4是根據另一示例性實施例示出的一種數據庫集群的管理方法的流程圖;
圖5是根據又一示例性實施例示出的一種數據庫集群的管理方法的詳細流程圖;
圖6是根據一示例性實施例示出的一種服務器的結構圖;
圖7是根據一示例性實施例示出的一種數據庫集群的管理裝置的框圖。
具體實施方式
這里將詳細地對示例性實施例執(zhí)行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本發(fā)明相一致的所有實施方式。相反,它們僅是與如所附權利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
圖2是根據一示例性實施例示出的一種數據庫集群的管理方法的流程圖。數據庫集群是指利用至少兩臺或者多臺數據庫服務器,構成一個虛擬單一數據庫邏輯映像,像單數據庫系統(tǒng)那樣,向客戶端提供透明的數據服務。數據庫集群的每一臺服務器稱為一個節(jié)點,每個節(jié)點(即數據庫集群的每臺服務器)設置一個代理實體(agent),每個代理實體分別控制各自所在的節(jié)點。其中,agent是指能自主活動的軟件或硬件實體,agent可以執(zhí)行本公開實施例提供的數據庫集群的管理方法。
該數據庫集群的管理方法的適用范圍和執(zhí)行主體,例如,該方法可以用于圖6所示結構的服務器500,數據庫集群可以包括多個圖6所示結構的服務器500,并在每臺服務器500上分別部署一個agent。由每臺服務器500上的agent管理各自所屬的服務器500。具體的,該數據庫集群可以是指galeracluster集群。如圖3所示,為數據庫集群的部署圖,每個數據庫節(jié)點上部署一個agent。另外,在數據庫集群的上層可以部署一個lvs(linux虛擬服務器),用于實現負載均衡。
如圖2所示,該數據庫集群的管理方法,可以由服務器的代理實體執(zhí)行,該方法可以包括以下步驟:
步驟s210:在本節(jié)點未啟動時,獲取第二節(jié)點的節(jié)點信息;其中,所述第二節(jié)點為所述數據庫集群內除本節(jié)點以外的所有其他節(jié)點;
具體的,由每個節(jié)點上部署的agent控制每臺服務器的啟動和停止。以圖3所示的5個數據庫節(jié)點舉例來說,為便于區(qū)分,暫且分別稱為節(jié)點1、節(jié)點2……節(jié)點5。假設本節(jié)點為圖3中的節(jié)點1,第二節(jié)點為除節(jié)點1以外的節(jié)點2、3、4、5。在本節(jié)點(節(jié)點1)未啟動時,節(jié)點1上部署的agent獲取第二節(jié)點(節(jié)點2、3、4、5)的節(jié)點信息。其中,節(jié)點信息包括:第二節(jié)點的運行狀態(tài)(包括已啟動、正在啟動、未啟動)、序列號、優(yōu)先級等。
步驟s230:若根據所述第二節(jié)點的節(jié)點信息,判斷獲知不存在滿足預設條件的第二節(jié)點,則將所述本節(jié)點以所述數據庫集群的首節(jié)點啟動。
具體的,在本節(jié)點(節(jié)點1)未啟動時,節(jié)點1上部署的agent根據第二節(jié)點(節(jié)點2、3、4、5)的節(jié)點信息,判斷是否存在滿足預設條件的第二節(jié)點。例如,當沒有已經啟動或者正在啟動的第二節(jié)點時,將本節(jié)點(節(jié)點1)作為數據庫集群的首節(jié)點啟動。
可選的,滿足預設條件第二節(jié)點可以包括:處于已啟動狀態(tài)的第二節(jié)點、處于正在啟動階段的第二節(jié)點、序列號大于本節(jié)點的第二節(jié)點以及優(yōu)先級比本節(jié)點高的第二節(jié)點。當不存在上述滿足預設條件的第二節(jié)點時,則可以認為本節(jié)點是優(yōu)先級最高的、序列號最大的節(jié)點,從而可以確定本節(jié)點為集群的首節(jié)點,可以將本節(jié)點以該數據庫集群的首節(jié)點啟動。然后,除本節(jié)點以外的其他節(jié)點再加入該集群中。新加入的節(jié)點從集群中選擇一個節(jié)點同步數據。
需要說明的是,galeracluster集群本身并不是自動的,在創(chuàng)建集群時需人工手動配置一個節(jié)點,將其作為首節(jié)點啟動,然后其他節(jié)點再加入集群;當整個集群宕機時,也需手動尋找集群首節(jié)點進行啟動,然后其他節(jié)點再加入,因此集群啟動效率低。本公開實施例提供的數據庫集群的管理方法,通過在每一個節(jié)點中部署一個agent,由agent根據各個節(jié)點的信息自動確定集群首節(jié)點并啟動,無需人工參與,大大提高了集群啟動效率。
圖4是根據另一示例性實施例示出的一種數據庫集群的管理方法的流程圖。如圖4所示,所述方法除了包括圖3對應實施例的步驟s210和步驟s230以外,所述方法還可以包括以下步驟:
步驟s250:若根據所述第二節(jié)點的節(jié)點信息,判斷獲知存在處于已啟動狀態(tài)的第二節(jié)點,則將所述第二節(jié)點的數據同步至所述本節(jié)點,并將所述本節(jié)點的狀態(tài)置為已啟動狀態(tài)。
具體的,可以從各個節(jié)點的配置文件中獲取各個節(jié)點的地址,然后根據各個節(jié)點的地址,遍歷除本節(jié)點以外的所有數據庫節(jié)點(即第二節(jié)點),獲取這些節(jié)點的節(jié)點信息。當根據第二節(jié)點的節(jié)點信息,判斷出存在處于已啟動狀態(tài)的第二節(jié)點,如存在一個第二節(jié)點的狀態(tài)為“running”(運轉),則可以認為本節(jié)點并非集群首節(jié)點。之后將本節(jié)點加入集群,將第二節(jié)點的數據同步至本節(jié)點,并將本節(jié)點的狀態(tài)置為已啟動狀態(tài),如將節(jié)點狀態(tài)置為running”。根據需要,若前節(jié)點加入集群失敗,則發(fā)出告警信號。
需要說明的是,當存在某一個節(jié)點宕機時,通過上述步驟s210和s250,可以及時根據其他節(jié)點的節(jié)點信息,將該宕機的節(jié)點加入集群,將其他節(jié)點的數據同步至該宕機的節(jié)點,從而無需人工手動來啟動宕機的節(jié)點,提高了節(jié)點啟動效率。
進一步的,在上述實施例的基礎上,所述方法還可以包括以下步驟:
在本節(jié)點已經啟動后,定時監(jiān)控本節(jié)點的狀態(tài)信息;
當所述狀態(tài)信息出現異常時,發(fā)出告警信號。
其中,本節(jié)點的agent定時監(jiān)控本節(jié)點的狀態(tài)信息,監(jiān)控的狀態(tài)如下:
wsrep_ready(值為on時,節(jié)點才可以接受其他節(jié)點的數據)==on
wsrep_connected(值為on時,表示節(jié)點至少可以連接集群中一個節(jié)點)==on
srep_local_state_comment(正常的穩(wěn)定狀態(tài)為:joining、waitingonsst、joined、syncedordonor。其他狀態(tài)為臨時狀態(tài)或者不正常的狀態(tài))等于joined、synced或者donor
wsrep_cluster_status(節(jié)點正常的狀態(tài)值為:primary)==primary
節(jié)點的wsrep_cluster_state_uuid(每個節(jié)點都應該相同的狀態(tài)變量)至少與集群中半數wsrep_cluster_state_uuid值相同。
需要說明的是,當監(jiān)控的上述狀態(tài)變量出現異常時,即不滿足上述情況時,如wsrep_ready為off或wsrep_connected為off,均認為狀態(tài)信息出現異常,需要發(fā)出告警信號。
若發(fā)現本節(jié)點的狀態(tài)變量wsrep_cluster_size(集群中節(jié)點的數量)、wsrep_cluster_conf_id(集群變化次數)、wsrep_cluster_state_uuid(每個節(jié)點都應該相同的狀態(tài)變量)與其他半數節(jié)點狀態(tài)變量不一致,則可以認為出現異常,需要發(fā)出告警信號。
或者,wsrep_local_recv_queue_avg(上次狀態(tài)查詢至今的接受隊列的平均長度),wsrep_flow_control_paused(上次本狀態(tài)變量查詢至今,本節(jié)點由于流量控制而導致暫停的時間百分比),wsrep_local_send_queue_avg(上次狀態(tài)查詢至今的發(fā)送隊列的平均長度)是否超過配置文件中配置的閾值,超過則認為出現異常需要發(fā)出告警信號。其中,可以通過命令行查看集群中所有節(jié)點的狀態(tài)信息,可以查看主要的狀態(tài)信息。
根據需要,數據庫集群上層的lvs節(jié)點的異常情況查詢,也可以通過檢查以下項目:wsrep_ready(值為on時,節(jié)點才可以接受其他節(jié)點的數據)==on
wsrep_connected(值為on時,表示節(jié)點至少可以連接集群中一個節(jié)點)==on
srep_local_state_comment(正常的穩(wěn)定狀態(tài)為:joining、waitingonsst、joined、syncedordonor。其他狀態(tài)為臨時狀態(tài)或者不正常的狀態(tài))等于joined、synced或者donor
wsrep_cluster_status(節(jié)點正常的狀態(tài)值為:primary)==primary
當上述四個條件同時滿足時,則認為該lvs節(jié)點沒有出現異常,否則可以進行告警。
進一步的,在上述任意一種實施例的基礎上,所述方法還可以包括以下步驟:
在本節(jié)點已經啟動后,定時檢測本節(jié)點是否在線;
若不在線,則重復執(zhí)行所述獲取第二節(jié)點的節(jié)點信息的步驟。
需要說明的是,現有技術當集群中有節(jié)點脫離集群時,用戶無法感知,并且脫離集群后的節(jié)點想要再加入集群必須人工手動加入。本公開實施例在每個節(jié)點部署的agent可以定時檢測所在節(jié)點是否在線。如,agent每隔1秒檢測本節(jié)點是否在線,如果不在線,則可以重復上述步驟s210和步驟s230或者重復步驟s210和步驟s250。當不存在滿足預設條件的第二節(jié)點時,可以將離線的節(jié)點以集群首節(jié)點啟動。當存在已經啟動的第二節(jié)點時,可以將離線的節(jié)點重新加入集群,從第二節(jié)點中將數據同步至該離線的節(jié)點。
圖5是根據另一示例性實施例示出的一種數據庫集群的管理方法的詳細流程圖。其中,每個節(jié)點內部署一個agent,每個節(jié)點內部署的agent分別控制各自所在的節(jié)點。其中,當前agent所在的節(jié)點稱為本節(jié)點,其他agent所在的節(jié)點稱為其他節(jié)點。各個節(jié)點內的agent都啟動完各自的節(jié)點后,才認為整個集群啟動完成。以啟動galeracluster集群舉例來說,
具體流程如下:
1、若本節(jié)點已經啟動,則退出。
2、將本節(jié)點置為‘init’狀態(tài)。
3、從各個節(jié)點的配置文件中獲取各個節(jié)點的地址。
4、遍歷集群節(jié)點(除本節(jié)點以外的其他節(jié)點)的列表。
5、獲取其他節(jié)點的狀態(tài),若獲取不到,則循環(huán)檢檢測其他節(jié)點狀態(tài),直到其他節(jié)點狀態(tài)可知。
(a)若一個節(jié)點狀態(tài)已經啟動,將本節(jié)點加入集群(若加入失敗告警),加入成功將本節(jié)點狀態(tài)置為‘running’,流程完畢。
(b)若發(fā)現一個節(jié)點正在啟動一個新集群(狀態(tài)為‘starting_cluster’),則繼續(xù),等下一次重新遍歷。
(c)若發(fā)現一個節(jié)點正在初始化(狀態(tài)為‘init’)或者‘stop’(停止)狀態(tài),且seqno(序列號)高于本節(jié)點(若獲取不到seqno,則一直循環(huán)檢測,直到獲取到),則繼續(xù),等下一次重新遍歷。
(d)若發(fā)現一個節(jié)點正在初始化(‘init’)或者‘stop’狀態(tài),且seqno等于本節(jié)點(若獲取不到seqno,則一直循環(huán)檢測,直到獲取到),則判斷節(jié)點的優(yōu)先級(根據配置文件中配置的順序,按順序優(yōu)先級降低);
若比本節(jié)點優(yōu)先級高,則繼續(xù),等下一次重新遍歷;
若沒本節(jié)點優(yōu)先級高,則統(tǒng)計計數加一。
(e)判斷統(tǒng)計計數是否達到最大值(集群節(jié)點數減一),若達到則跳出循環(huán)。至此完成本節(jié)點與其他所有節(jié)點的比較。
6、將本節(jié)點狀態(tài)置為'starting_cluster',然后將本節(jié)點以新集群的首節(jié)點方式啟動(啟動失敗告警,一直重試啟動直到成功),成功后將狀態(tài)置為’running’,流程完畢。
本節(jié)點啟動之后,其他agent控制各自所在的節(jié)點加入該集群,即可實現數據庫集群的啟動。
對于集群的停止,本公開實施例提供了兩種停止的方式:停止代理實體或者先停止集群節(jié)點再停止代理實體。對于galeracluster集群而言,一是只停止集群的管理系統(tǒng)galera_agent;另一種是停止管理系統(tǒng)galera_agent前先把集群節(jié)點停止。
本公開實施例提供的技術方案,agent會自動啟動數據庫集群,當集群中有節(jié)點離線后會告警,并且自動將節(jié)點拉起,當整個集群宕機時,也會自動找到seqno最大的節(jié)點然后將整個集群啟動,提高了可靠性,使其更加自動化,提高啟動效率。
參見圖6,圖6是本公開實施例提供的一種服務器結構示意圖。該服務器500可因配置或性能不同而產生比較大的差異,可以包括一個或一個以上中央處理器(centralprocessingunits,cpu)522(例如,一個或一個以上處理器)和存儲器532,一個或一個以上存儲應用程序542或數據544的存儲介質530(例如一個或一個以上海量存儲設備)。其中,存儲器532和存儲介質530可以是短暫存儲或持久存儲。存儲在存儲介質530的程序可以包括一個或一個以上模塊(圖示未示出),每個模塊可以包括對服務器中的一系列指令操作。更進一步地,中央處理器522可以設置為與存儲介質530通信,在服務器500上執(zhí)行存儲介質530中的一系列指令操作。服務器500還可以包括一個或一個以上電源526,一個或一個以上有線或無線網絡接口550,一個或一個以上輸入輸出接口558,和/或,一個或一個以上操作系統(tǒng)541,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm等等。上述實施例中數據庫集群可以包括多個圖6所示的服務器結構,agent可以設置在圖6所示的服務器結構中,完成上述圖2、4、5所示實施例中所述的由服務器中agent所執(zhí)行的步驟。
本領域普通技術人員可以理解實現上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關的硬件完成,所述的程序可以存儲于一種計算機可讀存儲介質中,上述提到的存儲介質可以是只讀存儲器,磁盤或光盤等。
下述為本公開裝置實施例,可以用于執(zhí)行本公開上述服務器500中代理實體所執(zhí)行數據庫集群的管理方法實施例。對于本公開裝置實施例中未披露的細節(jié),請參照本公開數據庫集群的管理方法實施例。
圖7是根據一示例性實施例示出的一種數據庫集群的管理裝置的框圖,該數據庫集群的管理裝置可以用于圖6所示實施環(huán)境的服務器500中,執(zhí)行上述方法實施例中的全部或者部分步驟。如圖7所示,該數據庫集群的管理裝置包括但不限于:信息獲取模塊710和節(jié)點啟動模塊730;
信息獲取模塊710,用于在本節(jié)點未啟動時,獲取第二節(jié)點的節(jié)點信息;其中,所述第二節(jié)點為所述數據庫集群內除本節(jié)點以外的所有其他節(jié)點;
節(jié)點啟動模塊730,用于根據所述第二節(jié)點的節(jié)點信息,當判斷獲知不存在滿足預設條件的第二節(jié)點時,將所述本節(jié)點以所述數據庫集群的首節(jié)點啟動。
上述裝置中各個模塊的功能和作用的實現過程具體詳見上述數據庫集群的管理方法中對應步驟的實現過程,在此不再贅述。
信息獲取模塊710比如可以是圖6中的某一個物理結構有線或無線網絡接口550。
節(jié)點啟動模塊730也可以是功能模塊,用于執(zhí)行上述數據庫集群的管理方法中的對應步驟。可以理解,這些模塊可以通過硬件、軟件、或二者結合來實現。當以硬件方式實現時,這些模塊可以實施為一個或多個硬件模塊,例如一個或多個專用集成電路。當以軟件方式實現時,這些模塊可以實施為在一個或多個處理器上執(zhí)行的一個或多個計算機程序,例如圖6的中央處理器522所執(zhí)行的存儲在存儲器532中的程序。
可選的,所述滿足預設條件的第二節(jié)點包括但不限于:
處于已啟動狀態(tài)的第二節(jié)點、處于正在啟動階段的第二節(jié)點、序列號大于本節(jié)點的第二節(jié)點以及優(yōu)先級比本節(jié)點高的第二節(jié)點。
在上述裝置實施例的基礎上,所述裝置還可以包括但不限于:
節(jié)點加入模塊,用于根據所述第二節(jié)點的節(jié)點信息,當判斷獲知存在處于已啟動狀態(tài)的第二節(jié)點時,將所述第二節(jié)點的數據同步至所述本節(jié)點,并將所述本節(jié)點的狀態(tài)置為已啟動狀態(tài)。
在上述裝置實施例的基礎上,所述裝置還可以包括但不限于:
信息監(jiān)控模塊,用于在本節(jié)點已經啟動后,定時監(jiān)控本節(jié)點的狀態(tài)信息,并當所述狀態(tài)信息出現異常時,發(fā)出告警信號。
在上述裝置實施例的基礎上,所述裝置還可以包括但不限于:
在線檢測模塊,用于在本節(jié)點已經啟動后,定時檢測本節(jié)點是否在線;并當不在線時,由所述信息獲取模塊710繼續(xù)獲取第二節(jié)點的節(jié)點信息。
在示例性實施例中,本公開還提供另一種數據庫集群的管理裝置,該數據庫集群的管理裝置可以用于圖6所示實施環(huán)境的服務器500中,執(zhí)行方法實施例中的全部或者部分步驟。所述裝置包括:
處理器;
用于存儲處理器可執(zhí)行指令的存儲器;
其中,所述處理器被配置為執(zhí)行:
在本節(jié)點未啟動時,獲取第二節(jié)點的節(jié)點信息;其中,所述第二節(jié)點為所述數據庫集群內除本節(jié)點以外的所有其他節(jié)點;
若根據所述第二節(jié)點的節(jié)點信息,判斷獲知不存在滿足預設條件的第二節(jié)點,則將所述本節(jié)點以所述數據庫集群的首節(jié)點啟動。
該實施例中的裝置的處理器執(zhí)行操作的具體方式已經在有關該數據庫集群的管理方法的實施例中進行了詳細描述,此處將不做詳細闡述說明。
可選的,還提供了一種存儲介質,該存儲介質為計算機可讀存儲介質,例如可以為包括指令的臨時性和非臨時性計算機可讀存儲介質。該存儲介指例如包括指令的存儲器,上述指令可由裝置的處理器執(zhí)行以完成上述數據庫集群的管理方法。
應當理解的是,本發(fā)明并不局限于上面已經描述并在附圖中示出的精確結構,并且可以在不脫離其范圍執(zhí)行各種修改和改變。本發(fā)明的范圍僅由所附的權利要求來限制。