專利名稱:一種基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)數(shù)據(jù)庫(kù)群集中間件技術(shù)領(lǐng)域,更具體地說(shuō),就是使 用消息中間件技術(shù)來(lái)構(gòu)建高可用性數(shù)據(jù)庫(kù)集群。
背景技術(shù):
當(dāng)前的一些熱點(diǎn)應(yīng)用如電子商務(wù)、火車票定購(gòu)服務(wù)、電子銀行等,通
常在某個(gè)較短時(shí)間內(nèi),用戶數(shù)量極大,査詢的峰值達(dá)到每秒鐘IO萬(wàn)次以上, 單個(gè)的服務(wù)器無(wú)論是從CPU的處理能力還是網(wǎng)絡(luò)的物理帶寬來(lái)說(shuō),都無(wú)法
滿足這么高的性能需求。同時(shí),對(duì)于這些應(yīng)用中,服務(wù)器的失效將對(duì)服務(wù) 的提供者帶來(lái)巨大的損失。在這一背景下,數(shù)據(jù)庫(kù)集群技術(shù)的研究和發(fā)展 成為學(xué)術(shù)界和工業(yè)界非常關(guān)注的問(wèn)題。
當(dāng)前,數(shù)據(jù)庫(kù)集群產(chǎn)品主要分為共享存儲(chǔ)結(jié)構(gòu)和非共享結(jié)構(gòu)。 一般來(lái) 講,共享存儲(chǔ)結(jié)構(gòu)的數(shù)據(jù)庫(kù)集群對(duì)存儲(chǔ)設(shè)備要求較高,其數(shù)據(jù)庫(kù)服務(wù)器存 取數(shù)據(jù)的速度也快于非共享存儲(chǔ)結(jié)構(gòu)的數(shù)據(jù)庫(kù)集群。然而,由于采用了專 用存儲(chǔ)設(shè)備,在提高系統(tǒng)構(gòu)造成本的同時(shí),也降低了集群系統(tǒng)的可擴(kuò)展性。
采用非共享的集群結(jié)構(gòu),將數(shù)據(jù)存放在專門負(fù)責(zé)存儲(chǔ)的子集群中,這 類似于并行文件系統(tǒng),由于采用存儲(chǔ)子集群結(jié)構(gòu),這類集群通常具有很高
的可擴(kuò)展性。但是,這類數(shù)據(jù)庫(kù)集群大都是基于數(shù)據(jù)庫(kù)引擎的,例如MySQL Cluster就只能使用NDB (或稱NDB Cluster)的存儲(chǔ)引擎,而不能使用 MyISAM、 InnoDB等存儲(chǔ)引擎,更不能與SQL Server或DB2等數(shù)據(jù)庫(kù)服 務(wù)器組成數(shù)據(jù)庫(kù)集群;其次,系統(tǒng)結(jié)構(gòu)較為復(fù)雜,系統(tǒng)開發(fā)和維護(hù)成本高。 同時(shí)在網(wǎng)絡(luò)(特別是TCP連接級(jí))容錯(cuò)方面,目前大部分?jǐn)?shù)據(jù)庫(kù)集群 表現(xiàn)不佳。Oracle RAC雖然具有TCP連接容錯(cuò)能力,然而其技術(shù)是私有的。 而本發(fā)明基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群就有效的解決了上述的所
有問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群, 該數(shù)據(jù)庫(kù)集群具有高可用性、高性能和可擴(kuò)展性。
本發(fā)明提供的基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群,包括由M臺(tái)數(shù) 據(jù)庫(kù)服務(wù)器構(gòu)成的數(shù)據(jù)庫(kù)服務(wù)層,其特征在于該系統(tǒng)在應(yīng)用層和數(shù)據(jù)庫(kù)
服務(wù)層之間設(shè)置有中間層,中間層包括N個(gè)應(yīng)用代理,M個(gè)數(shù)據(jù)庫(kù)中間件 及消息總線,1SN^16, 1SM^8;
應(yīng)用代理用于服務(wù)節(jié)點(diǎn)出現(xiàn)故障時(shí)的連接重定向,保持服務(wù)不中斷, 提高可靠性;
數(shù)據(jù)庫(kù)中間件用于對(duì)數(shù)據(jù)庫(kù)請(qǐng)求消息的攔截、解析、處理和轉(zhuǎn)發(fā); 消息總線貫穿于數(shù)據(jù)庫(kù)中間件和數(shù)據(jù)庫(kù)服務(wù)器之間,它負(fù)責(zé)將數(shù)據(jù)中
間件發(fā)送的讀寫操作進(jìn)行全局排序,保證數(shù)據(jù)一致性,并將排序結(jié)果發(fā)送
給數(shù)據(jù)庫(kù)服務(wù)器。
本發(fā)明的數(shù)據(jù)庫(kù)集群系統(tǒng)通過(guò)消息中間件在數(shù)據(jù)庫(kù)服務(wù)器上構(gòu)建一個(gè) 數(shù)據(jù)庫(kù)網(wǎng)關(guān),分發(fā)數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求、比對(duì)執(zhí)行結(jié)果,采用主動(dòng)復(fù)制方案, 組成了一個(gè)數(shù)據(jù)庫(kù)集群。采用"讀一寫所有可用"的技術(shù)保證集群中各個(gè)節(jié)點(diǎn) 的數(shù)據(jù)一致性,并提高了集群系統(tǒng)整體的讀性能。智能分析新加入節(jié)點(diǎn)或 故障節(jié)點(diǎn)與正常節(jié)點(diǎn)的數(shù)據(jù)差異,選擇全復(fù)制或者增量復(fù)制進(jìn)行數(shù)據(jù)庫(kù)恢 復(fù)。本發(fā)明在當(dāng)今最為流行的開源數(shù)據(jù)庫(kù)MySQL上實(shí)現(xiàn)了一個(gè)具有高可用 性、高性能和可擴(kuò)展的數(shù)據(jù)庫(kù)集群系統(tǒng)。與現(xiàn)有的技術(shù)相比,本發(fā)明具有 以下技術(shù)效果
a. 高可用性即使一個(gè)或多個(gè)節(jié)點(diǎn)宕機(jī),系統(tǒng)可將用戶的請(qǐng)求重定向 到其它正常節(jié)點(diǎn),保證服務(wù)可持續(xù);新節(jié)點(diǎn)加入或者故障節(jié)點(diǎn)恢復(fù),利用 更新日志進(jìn)行數(shù)據(jù)同步,保證系統(tǒng)內(nèi)所有節(jié)點(diǎn)數(shù)據(jù)一致。
b. 高性能采用"讀一寫所有可用"技術(shù),用戶的增、冊(cè)lj、修改操作會(huì)
在系統(tǒng)中各個(gè)節(jié)點(diǎn)執(zhí)行,本發(fā)明采用合適的并發(fā)控制技術(shù)保證寫性能不明
顯降低;而讀操作僅在本地節(jié)點(diǎn)執(zhí)行,遠(yuǎn)程節(jié)點(diǎn)不執(zhí)行,讀操作并發(fā)度極
大提高,性能上升。
C.可擴(kuò)展性系統(tǒng)中任何一個(gè)節(jié)點(diǎn)都可提供數(shù)據(jù)庫(kù)服務(wù),增加一個(gè)節(jié) 點(diǎn),意味著可為更多的用戶服務(wù)。系統(tǒng)配置簡(jiǎn)單,數(shù)據(jù)同步技術(shù)可迅速的 將新節(jié)點(diǎn)納入系統(tǒng),可擴(kuò)展性好。
d. 透明性當(dāng)系統(tǒng)出現(xiàn)故障時(shí),利用消息中間件將故障節(jié)點(diǎn)迅速隔離, 同時(shí)將它正在服務(wù)的用戶請(qǐng)求重定向到其他可用節(jié)點(diǎn),該過(guò)程對(duì)用戶透明。
e. 同等性本發(fā)明的數(shù)據(jù)庫(kù)集群系統(tǒng)中,各個(gè)節(jié)點(diǎn)對(duì)等,無(wú)主從節(jié)點(diǎn) 之分,系統(tǒng)中僅兩個(gè)節(jié)點(diǎn)時(shí),相當(dāng)于雙機(jī)互備系統(tǒng);具體對(duì)某個(gè)SQL更新 命令或事務(wù),僅存在本地節(jié)點(diǎn)和遠(yuǎn)程節(jié)點(diǎn)之分,當(dāng)都同時(shí)執(zhí)行該命令或事 務(wù),而本地節(jié)點(diǎn)負(fù)責(zé)將結(jié)果返回給用戶。
圖1為本發(fā)明高可用性數(shù)據(jù)庫(kù)集群系統(tǒng)的體系結(jié)構(gòu)圖2為圖1中應(yīng)用代理的模塊結(jié)構(gòu)圖3為圖1中應(yīng)用代理的流程圖4為圖1中數(shù)據(jù)庫(kù)中間件的功能模塊圖5為本發(fā)明高可用性數(shù)據(jù)庫(kù)集群系統(tǒng)的失效恢復(fù)示意圖6為本發(fā)明高可用性數(shù)據(jù)庫(kù)集群系統(tǒng)的恢復(fù)算法過(guò)程;
圖7為本發(fā)明寫操作在本地節(jié)點(diǎn)上的執(zhí)行過(guò)程;
圖8為本發(fā)明寫操作在遠(yuǎn)程節(jié)點(diǎn)上的執(zhí)行過(guò)程。
具體實(shí)施例方式
本發(fā)明采用的技術(shù)思想如下
a. 建立應(yīng)用代理,其作用在于連接重定向,是客戶端的代理;
b. 建立數(shù)據(jù)庫(kù)中間件,采用"讀一寫所有可用"技術(shù)保證數(shù)據(jù)節(jié)點(diǎn)間的數(shù) 據(jù)一致。同時(shí)滿足數(shù)據(jù)節(jié)點(diǎn)的動(dòng)態(tài)加入和離開,并維護(hù)節(jié)點(diǎn)的正常運(yùn)行。
c. 建立數(shù)據(jù)庫(kù)服務(wù)層,使用MySQL服務(wù)器構(gòu)建數(shù)據(jù)庫(kù)服務(wù)層。 進(jìn)一步,事務(wù)和單個(gè)發(fā)送后立即執(zhí)行的SQL命令都以任務(wù)或請(qǐng)求統(tǒng)稱
之。對(duì)于只讀請(qǐng)求,第一個(gè)接收的節(jié)點(diǎn)立即執(zhí)行并返回結(jié)果;對(duì)于寫請(qǐng)求 任務(wù),需要向所有其它節(jié)點(diǎn)轉(zhuǎn)發(fā)執(zhí)行,這就是"讀一寫所有",或稱"讀一寫 多"協(xié)議。本發(fā)明在此協(xié)議基礎(chǔ)上改進(jìn)得到一種"讀一寫所有可用,,的協(xié)議。 這種方法中讀操作與"讀一寫所有"模式一樣處理:系統(tǒng)任何可用節(jié)點(diǎn)的副本 都可以讀取,并在那個(gè)副本上獲得讀鎖。寫操作轉(zhuǎn)發(fā)到所有副本上,同時(shí) 需要獲得所有副本的寫鎖。如果一個(gè)節(jié)點(diǎn)停機(jī),更新任務(wù)則不在該節(jié)點(diǎn)上 執(zhí)行,而由系統(tǒng)恢復(fù)模塊在該節(jié)點(diǎn)重新加入系統(tǒng)時(shí)恢復(fù)。 下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。
如圖1所示,本發(fā)明系統(tǒng)通過(guò)在應(yīng)用層和數(shù)據(jù)庫(kù)服務(wù)層中間增加了中 間層,實(shí)現(xiàn)數(shù)據(jù)庫(kù)集群。
數(shù)據(jù)庫(kù)服務(wù)層位于整個(gè)數(shù)據(jù)庫(kù)集群底層,由若干個(gè)數(shù)據(jù)庫(kù)服務(wù)器41、
42、 ...4M構(gòu)成。在本系統(tǒng)中,各個(gè)節(jié)點(diǎn)使用的主要是MySQL服務(wù)器,不 要求是相同版本的,也就是說(shuō),某些節(jié)點(diǎn)可以采用MySQL 5.0,而其他節(jié) 點(diǎn)采用MySQL 5.1,另外對(duì)發(fā)行版本也沒(méi)有嚴(yán)格要求,但是采用的MySQL 服務(wù)器應(yīng)支持InnoDB、 MyISAM等存儲(chǔ)引擎,數(shù)據(jù)訪問(wèn)端口為3306,建議 使用二進(jìn)制發(fā)行版mysql-max-5.0.*。
從圖l中可以看到,中間層包括應(yīng)用代理21、 22、 ...2N,數(shù)據(jù)庫(kù)中間 件31、 32、 ...、 3M及消息總線,1*16, 1,^8。應(yīng)用程序11、 12、 ...1N 都有一個(gè)相應(yīng)的應(yīng)用代理21、 22、 ...2N,即有一個(gè)應(yīng)用程序請(qǐng)求,就有個(gè) 應(yīng)用代理與之一一對(duì)應(yīng)的關(guān)系。當(dāng)應(yīng)用程序與應(yīng)用代理成功建立連接后, 應(yīng)用代理選取一個(gè)數(shù)據(jù)庫(kù)中間件進(jìn)行連接,多個(gè)應(yīng)用代理可以對(duì)應(yīng)一個(gè)數(shù) 據(jù)庫(kù)中間件。 一個(gè)數(shù)據(jù)庫(kù)服務(wù)器對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)中間件,MySQL服務(wù)進(jìn)程、 組通信進(jìn)程和HAMC進(jìn)程(數(shù)據(jù)庫(kù)中間件的主進(jìn)程)同時(shí)運(yùn)行于服務(wù)器上, 構(gòu)成一個(gè)數(shù)據(jù)節(jié)點(diǎn);而客戶端的應(yīng)用程序?qū)?yīng)一個(gè)應(yīng)用代理,同時(shí)運(yùn)行于 客戶端上。
為表述方便,下文將應(yīng)用程序ll、 12、 ...IN,應(yīng)用代理21、 22、…2N, 數(shù)據(jù)庫(kù)中間件31、 32、 ...、 3M和數(shù)據(jù)庫(kù)服務(wù)器41、 42、…4M分別統(tǒng)稱為 應(yīng)用程序l,應(yīng)用代理2,數(shù)據(jù)庫(kù)中間件3和數(shù)據(jù)庫(kù)服務(wù)器4。
數(shù)據(jù)庫(kù)中間件3是數(shù)據(jù)庫(kù)集群系統(tǒng)的主體。作為一個(gè)中間件,數(shù)據(jù)庫(kù) 中間件充分體現(xiàn)了代理的思想。數(shù)據(jù)庫(kù)中間件的主要作用是對(duì)數(shù)據(jù)庫(kù)請(qǐng)求 消息的攔截、解析、處理和轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)機(jī)制是本系統(tǒng)技術(shù)的核心,它依賴 于一個(gè)基于IP多播的消息中間件,在本系統(tǒng)中,其作用猶如一個(gè)專門提供
系統(tǒng)成員通信的消息總線;而應(yīng)用代理的作用在于服務(wù)節(jié)點(diǎn)出現(xiàn)故障時(shí)的 連接重定向,保持服務(wù)不中斷,提高可靠性。數(shù)據(jù)庫(kù)中間件代理底層的數(shù) 據(jù)庫(kù)服務(wù)器向上層應(yīng)用提供數(shù)據(jù)服務(wù),本系統(tǒng)中,如果要使用群集功能, 應(yīng)用程序訪問(wèn)系統(tǒng)提供的訪問(wèn)端口,而不是MySQL服務(wù)的默認(rèn)端口 3306; 如果使用3306端口訪問(wèn)數(shù)據(jù)庫(kù),則不會(huì)經(jīng)過(guò)數(shù)據(jù)庫(kù)中間件,實(shí)際上就是使 用單機(jī)的數(shù)據(jù)庫(kù)系統(tǒng),沒(méi)有達(dá)到高可用性,各個(gè)節(jié)點(diǎn)間也不能實(shí)時(shí)數(shù)據(jù)同 步。
消息總線貫穿于數(shù)據(jù)庫(kù)中間件3和數(shù)據(jù)庫(kù)服務(wù)器4之間,它負(fù)責(zé)將數(shù) 據(jù)中間件3發(fā)送的讀寫操作進(jìn)行全局排序,保證數(shù)據(jù)一致性,并將排序結(jié) 果發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器4。
應(yīng)用層該層是上層數(shù)據(jù)庫(kù)應(yīng)用,可以是應(yīng)用服務(wù)器,也可以是用戶 的數(shù)據(jù)操作。
如圖2所示,從功能結(jié)構(gòu)上,應(yīng)用代理2劃分為以下幾個(gè)模塊請(qǐng)求 連接管理器2A、執(zhí)行模塊2B和重定向模塊2C,其中圖中數(shù)據(jù)庫(kù)中間件' 的表示其它數(shù)據(jù)節(jié)點(diǎn)中的數(shù)據(jù)庫(kù)中間件。圖2中各個(gè)模塊的主要功能有
請(qǐng)求連接管理器2A:監(jiān)聽及接收應(yīng)用層的數(shù)據(jù)連接請(qǐng)求,保存所有數(shù) 據(jù)節(jié)點(diǎn)的MySQL ODBC數(shù)據(jù)源,構(gòu)建MySQL連接池。如果應(yīng)用程序1和 請(qǐng)求連接管理器2A連接建立成功,交由執(zhí)行模塊2B處理應(yīng)用程序的請(qǐng)求; 如果應(yīng)用程序1和請(qǐng)求連接管理器2A的連接中斷,則由重定向模塊2C進(jìn) 行處理。
執(zhí)行模塊2B用于發(fā)送執(zhí)行MySQL請(qǐng)求給數(shù)據(jù)庫(kù)中間件,檢査返回結(jié) 果和回送結(jié)果給應(yīng)用程序1。執(zhí)行模塊通過(guò)系統(tǒng)提供的訪問(wèn)端口來(lái)訪問(wèn)數(shù)據(jù) 庫(kù)中間件3。
重定向模塊2C:當(dāng)前提供服務(wù)的數(shù)據(jù)節(jié)點(diǎn)連接出現(xiàn)故障時(shí),變更執(zhí)行 模塊使用的MySQL連接,并將變更結(jié)果通知執(zhí)行模塊2B。
應(yīng)用代理2的結(jié)構(gòu)簡(jiǎn)單,流程圖見圖3。應(yīng)用代理2開始運(yùn)行后,就可
以接受用戶的請(qǐng)求,圖中的接受數(shù)據(jù)庫(kù)請(qǐng)求及選擇合適連接由請(qǐng)求連接管
理器2A實(shí)現(xiàn),請(qǐng)求連接管理器2A根據(jù)節(jié)點(diǎn)的狀態(tài)來(lái)決定由哪個(gè)數(shù)據(jù)節(jié)點(diǎn) 來(lái)處理用戶請(qǐng)求,同時(shí)建立應(yīng)用代理2與數(shù)據(jù)庫(kù)中間件3的連接。連接建 立后,執(zhí)行模塊2B會(huì)向數(shù)據(jù)庫(kù)中間件3發(fā)送執(zhí)行。如果執(zhí)行模塊2B等待 執(zhí)行結(jié)果超時(shí),重定向模塊2C會(huì)根據(jù)當(dāng)前數(shù)據(jù)節(jié)點(diǎn)們的狀態(tài)重定向連接, 即重新選擇一個(gè)數(shù)據(jù)中間件來(lái)處理用戶的請(qǐng)求。如果執(zhí)行結(jié)果成功返回, 執(zhí)行模塊會(huì)將執(zhí)行結(jié)果返回給用戶。
如圖4所示,處于服務(wù)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)中間件3是數(shù)據(jù)庫(kù)集群系統(tǒng)的主 體,模塊結(jié)構(gòu)比應(yīng)用代理復(fù)雜。功能模塊劃分如下消息接收模塊3A、 MySQL消息解析模塊3B、 SQL語(yǔ)句解析模塊3C、請(qǐng)求執(zhí)行與結(jié)果處理模 塊3D、消息處理模塊3E、故障檢測(cè)模塊3F、數(shù)據(jù)恢復(fù)模塊3G、日志模塊 3H、組通信模塊31和并發(fā)控制模塊3J,其中圖中數(shù)據(jù)庫(kù)中間件,的表示其 它數(shù)據(jù)節(jié)點(diǎn)中的數(shù)據(jù)庫(kù)中間件。圖3中的各個(gè)模塊的主要功能
(1) 消息接收模塊3A:監(jiān)聽系統(tǒng)服務(wù)端口,接收來(lái)自上層數(shù)據(jù)庫(kù)請(qǐng) 求,從已建立的MySQL連接池中選擇空閑連接提供初始化、中斷、SQL 命令査詢、刪除、插入、修改等數(shù)據(jù)庫(kù)服務(wù),將接收到的消息處理后交由 MySQL消息解析模塊3B;
(2) MySQL消息解析模塊3B:解析消息接收模塊獲得的MySQL消 息,區(qū)分消息類型,解壓分析得到SQL命令并發(fā)送給SQL語(yǔ)句解析模塊 3C進(jìn)行后續(xù)處理;
(3) SQL語(yǔ)句解析模塊3C:從MySQL消息解析模塊3B獲得MySQL 消息中讀、寫命令,解析出命令的類型(select、 create、 update、 insert、 delete 等)、操作對(duì)象(數(shù)據(jù)庫(kù)名、表名等)。如果是非寫命令,直接轉(zhuǎn)交請(qǐng)求執(zhí) 行與結(jié)果處理模塊3D;如果是寫命令(create、 update、 insert、 delete等), 解析結(jié)果返回給消息處理模塊3E;
(4) 請(qǐng)求執(zhí)行與結(jié)果處理模塊3D:該模塊是一個(gè)單獨(dú)的線程。本地 節(jié)點(diǎn)的只讀信息直接發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器4執(zhí)行,全局寫命令(包括本地 節(jié)點(diǎn)和遠(yuǎn)程節(jié)點(diǎn)的寫命令)發(fā)送給并發(fā)控制模塊3J,比對(duì)分析執(zhí)行結(jié)果并 返回給應(yīng)用代理的執(zhí)行模塊2B;
(5) 消息處理模塊3E:負(fù)責(zé)系統(tǒng)中的消息處理和轉(zhuǎn)發(fā),是核心模塊。
MySQL消息被解析完成后,如果是寫命令,則本模塊將消息socket、本地 節(jié)點(diǎn)ID、事務(wù)標(biāo)示、寫命令類型(create、 update、 insert、 delete)標(biāo)示、 數(shù)據(jù)操作對(duì)象(數(shù)據(jù)庫(kù)名、表名)、請(qǐng)求鎖類型等信息附于MySQL消息之 前,組成新的消息,通過(guò)組通信模塊3I置于消息總線上,轉(zhuǎn)發(fā)給其它數(shù)據(jù) 節(jié)點(diǎn);同時(shí),接收經(jīng)由組通信模塊3I傳遞來(lái)的其它數(shù)據(jù)節(jié)點(diǎn)消息。包含寫 命令的組通信消息全局排序后,解析出MySQL消息傳遞給請(qǐng)求執(zhí)行與結(jié)果 處理模塊執(zhí)行;發(fā)送前和接收到結(jié)果后通過(guò)日志模塊寫更新日志和完成日 志。獲得故障消息時(shí),調(diào)用故障檢測(cè)模塊分析處理;
(6) 故障檢測(cè)模塊3F:利用消息處理模塊3E獲得的系統(tǒng)組成員變更 的信息(最先來(lái)自組通信模塊31),分析系統(tǒng)故障,當(dāng)由新節(jié)點(diǎn)加入或者故 障節(jié)點(diǎn)恢復(fù)時(shí)調(diào)用數(shù)據(jù)恢復(fù)模塊3G進(jìn)行數(shù)據(jù)同步,;
(7) 數(shù)據(jù)恢復(fù)模塊3G:利用系統(tǒng)的更新日志和完成日志,分析新加 入節(jié)點(diǎn)或待恢復(fù)節(jié)點(diǎn)與正常節(jié)點(diǎn)的數(shù)據(jù)差異,根據(jù)差異程度選擇全復(fù)制或 增量復(fù)制策略進(jìn)行數(shù)據(jù)同步直至所有節(jié)點(diǎn)達(dá)到數(shù)據(jù)庫(kù)一致;
(8) 日志模塊3H:定義數(shù)據(jù)恢復(fù)的更新日志(update.log)、完成日志 (commiUog)、增量恢復(fù)腳本(patch.sql)數(shù)據(jù)格式,為消息處理模塊3E
和數(shù)據(jù)恢復(fù)模塊3G提供日志的訪問(wèn)接口 ,該模塊是數(shù)據(jù)恢復(fù)的基礎(chǔ);
(9) 組通信模塊3I:消息處理模塊和消息總線的接口,系統(tǒng)中是一個(gè) 單獨(dú)的線程,完成組通信消息的有序轉(zhuǎn)發(fā)和接收,也是系統(tǒng)中極為重要的 組成模塊;
(10) 并發(fā)控制模塊3J:根據(jù)請(qǐng)求執(zhí)行與結(jié)果處理模塊3D的結(jié)果,利 用分布式鎖表,控制更新事務(wù)在全局執(zhí)行順序的一致,從而保證事務(wù)并發(fā) 執(zhí)行可串行化,各個(gè)節(jié)點(diǎn)數(shù)據(jù)庫(kù)一致。
圖5 (a)清晰的說(shuō)明了正常情況下,即各個(gè)數(shù)據(jù)節(jié)點(diǎn)(包括中間層和 數(shù)據(jù)庫(kù)服務(wù)層)正常運(yùn)行時(shí)的系統(tǒng)結(jié)構(gòu);但是,當(dāng)出現(xiàn)網(wǎng)絡(luò)中斷、系統(tǒng)宕 機(jī)等故障時(shí),系統(tǒng)結(jié)構(gòu)有所不同,如圖5 (b)所示。
假如因某種故障導(dǎo)致應(yīng)用代理2到數(shù)據(jù)庫(kù)中間件3、數(shù)據(jù)庫(kù)中間件3到
數(shù)據(jù)庫(kù)服務(wù)器4的連接出現(xiàn)問(wèn)題,也就是數(shù)據(jù)庫(kù)服務(wù)器4不能再提供數(shù)據(jù)
庫(kù)服務(wù)時(shí),應(yīng)用代理2重新選擇系統(tǒng)中數(shù)據(jù)節(jié)點(diǎn)并建立連接,重定向后再
將未完成的數(shù)據(jù)庫(kù)請(qǐng)求發(fā)送至新的數(shù)據(jù)節(jié)點(diǎn)以獲得不間斷的數(shù)據(jù)庫(kù)服務(wù)。
圖5表示的僅是應(yīng)用代理22不能訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器42時(shí)的情況,將數(shù)據(jù) 庫(kù)服務(wù)器42換作其它節(jié)點(diǎn),處理故障和重定向算法不變。
導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器42不能正常訪問(wèn)的故障可能有數(shù)據(jù)庫(kù)服務(wù)器42 上MySQL服務(wù)進(jìn)程、組通信進(jìn)程或HAMC進(jìn)程(數(shù)據(jù)庫(kù)中間件運(yùn)行的主 進(jìn)程)異常,網(wǎng)絡(luò)問(wèn)題導(dǎo)致消息總線與數(shù)據(jù)庫(kù)服務(wù)器42通信中斷、應(yīng)用代 理22到數(shù)據(jù)庫(kù)服務(wù)器42的連接中斷等。這類故障同樣存在于系統(tǒng)中的其 他數(shù)據(jù)節(jié)點(diǎn),本部分故障情況下的體系結(jié)構(gòu)僅是以數(shù)據(jù)庫(kù)服務(wù)器42為例具 體說(shuō)明之。
如圖6所示,這是本發(fā)明的恢復(fù)算法過(guò)程。其中,update.log為更新日 志,記錄客戶端的更新請(qǐng)求;commit.log為完成日志,記錄成功執(zhí)行的更新 操作;state.log為狀態(tài)日志,記錄節(jié)點(diǎn)的工作狀態(tài);patch.sql為增量恢復(fù)腳 本。更新日志和完成日志的每一項(xiàng)都由一個(gè)任務(wù)編號(hào)標(biāo)識(shí),任務(wù)編號(hào)是全 局分配的唯一任務(wù)標(biāo)示符,依次遞增。
本發(fā)明系統(tǒng)有兩種類型的恢復(fù)技術(shù)增量恢復(fù)和全復(fù)制恢復(fù)?;謴?fù)功 能重點(diǎn)在于檢測(cè)服務(wù)節(jié)點(diǎn)的加入和離開以及網(wǎng)絡(luò)故障,運(yùn)行時(shí)記錄數(shù)據(jù)修 改,恢復(fù)時(shí)比較故障節(jié)點(diǎn)正常節(jié)點(diǎn)的差異,當(dāng)差異程度較小時(shí)利用增量恢 復(fù)技術(shù)進(jìn)行數(shù)據(jù)同步,而差異較大時(shí)進(jìn)行全復(fù)制恢復(fù)保證系統(tǒng)中節(jié)點(diǎn)的數(shù) 據(jù)一致性。下面詳細(xì)地介紹這兩種恢復(fù)技術(shù)的實(shí)現(xiàn)步驟。
當(dāng)數(shù)據(jù)服務(wù)節(jié)點(diǎn)運(yùn)行時(shí)間很久后,數(shù)據(jù)庫(kù)文件大小達(dá)到幾GB,某個(gè)節(jié) 點(diǎn)偶然出現(xiàn)故障離開系統(tǒng),但是時(shí)間不長(zhǎng),與其它正常節(jié)點(diǎn)的差異不大, 這時(shí)采用增量恢復(fù)較為適宜?;謴?fù)步驟如下
(1) 待恢復(fù)節(jié)點(diǎn)讀取完成日志,分析得到最后執(zhí)行完成的任務(wù)編號(hào)Tj。
(2) 將分析得到的任務(wù)編號(hào)發(fā)送給選舉出來(lái)的正常節(jié)點(diǎn)。
(3) 正常節(jié)點(diǎn)分析它的完成日志,獲得上開始恢復(fù)時(shí)執(zhí)行完成的任務(wù) 編號(hào)Ti。
(4) 如果Ti-Tj值為O,則轉(zhuǎn)(7)執(zhí)行;如果值大于0,則轉(zhuǎn)(5)執(zhí)
行;如果值小于0,則顯示系統(tǒng)錯(cuò)誤,待恢復(fù)節(jié)點(diǎn)不加入系統(tǒng),跳出恢復(fù)過(guò) 程等待管理員處理。
(5) 正常節(jié)點(diǎn)打開它的更新日志,將任務(wù)Tj至Ti的SQL命令解析出 來(lái),存于增量恢復(fù)腳本中。
(6) 正常節(jié)點(diǎn)將增量恢復(fù)腳本傳輸給待恢復(fù)節(jié)點(diǎn),待恢復(fù)節(jié)點(diǎn)執(zhí)行增 量恢復(fù)腳本完成數(shù)據(jù)同步。
(7) 顯示完成增量恢復(fù)。
MySQL提供了良好的數(shù)據(jù)傳輸功能,可以利用MySQL的數(shù)據(jù)庫(kù)拷貝 將整個(gè)數(shù)據(jù)庫(kù)傳輸?shù)叫录尤氲墓?jié)點(diǎn)。傳輸整個(gè)數(shù)據(jù)庫(kù)采用的方式不是直接 傳輸數(shù)據(jù)庫(kù)文件,而是構(gòu)建一個(gè)全復(fù)制腳本,然后在待恢復(fù)節(jié)點(diǎn)執(zhí)行達(dá)到 數(shù)據(jù)傳輸?shù)哪康?,正常?jié)點(diǎn)上腳本構(gòu)建過(guò)程如下
(1) 寫入創(chuàng)建數(shù)據(jù)庫(kù)命令;
(2) 切換數(shù)據(jù)訪問(wèn)用戶;
(3) 寫入刪除正常節(jié)點(diǎn)數(shù)據(jù)庫(kù)中存在表的命令;
(4) 申請(qǐng)寫鎖,根據(jù)正常節(jié)點(diǎn)中數(shù)據(jù)表名和格式創(chuàng)建新表;
(5) 嚴(yán)格按照正常節(jié)點(diǎn)中表的數(shù)據(jù)寫插入命令。
(6) 多個(gè)表,則重復(fù)執(zhí)行第(4)步至第(5)步的操作。
(7) 釋放鎖。
以上述步驟構(gòu)建全復(fù)制腳本完畢后,將腳本文件發(fā)送至待恢復(fù)節(jié)點(diǎn)執(zhí) 行就可以將其恢復(fù)到與其它正常節(jié)點(diǎn)一致的狀態(tài)。
全復(fù)制恢復(fù)主要依賴于正常節(jié)點(diǎn)的數(shù)據(jù)庫(kù)狀態(tài),只要恢復(fù)過(guò)程中沒(méi)有 新的寫操作,待恢復(fù)節(jié)點(diǎn)完成數(shù)據(jù)傳輸后,其狀態(tài)一定與正常節(jié)點(diǎn)一致。 而恢復(fù)進(jìn)程已經(jīng)獲得所有節(jié)點(diǎn)數(shù)據(jù)庫(kù)所有表的讀鎖,應(yīng)用程序只能對(duì)數(shù)據(jù) 庫(kù)進(jìn)行讀訪問(wèn),而寫操作被阻塞,因此恢復(fù)過(guò)程中沒(méi)有寫操作的條件完全 可以保證。
本文規(guī)定,第一個(gè)接收到某個(gè)更新任務(wù)的節(jié)點(diǎn)成為本地節(jié)點(diǎn),系統(tǒng)中 通過(guò)消息總線轉(zhuǎn)發(fā)獲得該更新任務(wù)的節(jié)點(diǎn)稱為遠(yuǎn)程節(jié)點(diǎn)。本地節(jié)點(diǎn)和遠(yuǎn)程 節(jié)點(diǎn)是對(duì)某一個(gè)具體的更新任務(wù)而言的。對(duì)于本地節(jié)點(diǎn)而言,更新任務(wù)Ti 節(jié)點(diǎn)是本地任務(wù),而對(duì)于遠(yuǎn)程節(jié)點(diǎn),它則是遠(yuǎn)程任務(wù)。
"讀一寫所有可用"協(xié)議中,讀任務(wù)僅在接收節(jié)點(diǎn)執(zhí)行即可;而寫任務(wù)在 本地節(jié)點(diǎn)和遠(yuǎn)程節(jié)點(diǎn)的執(zhí)行流程是不同的。在本地節(jié)點(diǎn),寫任務(wù)執(zhí)行步驟 如下接收請(qǐng)求、多播發(fā)送消息、多播接收消息、請(qǐng)求鎖、執(zhí)行任務(wù),如 圖7所示。而在遠(yuǎn)程節(jié)點(diǎn),過(guò)程僅有3步接收請(qǐng)求、請(qǐng)求鎖、執(zhí)行任務(wù), 如圖8所示。值得注意的是,本地執(zhí)行寫任務(wù)時(shí),有兩次請(qǐng)求(消息)的 接收,但是發(fā)送者不同,第一次接收的請(qǐng)求來(lái)自應(yīng)用程序或應(yīng)用代理,經(jīng) 處理后交由消息總線轉(zhuǎn)發(fā)給其它節(jié)點(diǎn),第二次接收的消息來(lái)自消息總線, 此時(shí)請(qǐng)求消息是經(jīng)過(guò)全局排序后消息中間件轉(zhuǎn)發(fā)的。
在上述流程中,接收請(qǐng)求、發(fā)送消息、接收消息屬于系統(tǒng)的消息控制
部分,而請(qǐng)求鎖、發(fā)送執(zhí)行屬于系統(tǒng)的并發(fā)控制部分。另外,結(jié)合MySQL 采用的是多版本數(shù)據(jù)庫(kù),為提高并發(fā)讀,系統(tǒng)采用的"讀一寫所有可用"協(xié)議 中,讀操作不上鎖,僅寫操作上鎖。
本發(fā)明的系統(tǒng)是一個(gè)分布式的環(huán)境,采用嚴(yán)格的兩階段封鎖協(xié)議,但 是還必須保證各個(gè)節(jié)點(diǎn)對(duì)事務(wù)授予鎖和釋放鎖的順序必須是完全一致的。 系統(tǒng)采用索引和鏈表的形式實(shí)現(xiàn)鎖表,各數(shù)據(jù)節(jié)點(diǎn)按照相同的規(guī)則為每一 個(gè)進(jìn)入系統(tǒng)的事務(wù)(或立即提交執(zhí)行的單個(gè)SQL命令)分配唯一的事務(wù)編 號(hào),按相同順序授予鎖;收到事務(wù)在所有節(jié)點(diǎn)執(zhí)行完畢的消息釋放鎖。鎖 表采用一個(gè)數(shù)據(jù)項(xiàng)名哈希值為索引的散列表在鏈表中査找數(shù)據(jù)項(xiàng)。
本發(fā)明的系統(tǒng)中,給數(shù)據(jù)項(xiàng)加鎖的方式主要有兩種
共享鎖如果事務(wù)獲得了數(shù)據(jù)項(xiàng)的共享鎖,則事務(wù)可讀當(dāng)不能寫數(shù)據(jù)
項(xiàng);
排它鎖如果事務(wù)獲得了數(shù)據(jù)項(xiàng)的排它鎖,則事務(wù)可讀亦可寫數(shù)據(jù)項(xiàng); 每個(gè)事務(wù)都要根據(jù)將對(duì)數(shù)據(jù)項(xiàng)進(jìn)行的操作類型申請(qǐng)適當(dāng)?shù)逆i。該請(qǐng)求
發(fā)送給并發(fā)控制模塊,只有在并發(fā)控制模塊授予所需鎖之后,事務(wù)才能繼
續(xù)其操作。
本發(fā)明構(gòu)建了一個(gè)全局的鎖表來(lái)實(shí)現(xiàn)并發(fā)控制,鎖表由兩部分組成 鎖表項(xiàng)和鎖表節(jié)點(diǎn)鏈表。鎖表項(xiàng)保存了項(xiàng)和指向鎖表節(jié)點(diǎn)鏈表的頭指針, 其中項(xiàng)保存了申請(qǐng)鎖的對(duì)象(表或者行);鎖表節(jié)點(diǎn)鏈表由一個(gè)個(gè)鎖表節(jié)點(diǎn) 鏈接而成,同一個(gè)鎖表鏈表中的所有鎖表節(jié)點(diǎn)都對(duì)同一個(gè)數(shù)據(jù)對(duì)象進(jìn)行操
作,鎖表節(jié)點(diǎn)保存了申請(qǐng)鎖的類型和指向下個(gè)鎖表節(jié)點(diǎn)的指針。 進(jìn)一步,本發(fā)明的并發(fā)控制算法如下 假如系統(tǒng)中新接收一個(gè)更新事務(wù)T,則
(1) 讀取更新事務(wù)T將更新的對(duì)象表或行,并將對(duì)象哈希轉(zhuǎn)換為鎖表 項(xiàng)中的項(xiàng);
(2) 査找鎖表,如果某個(gè)鎖表項(xiàng)中的項(xiàng)等于該項(xiàng),以事務(wù)T構(gòu)建鎖表 節(jié)點(diǎn)置于鎖表項(xiàng)指向的鎖表鏈表后面;否則,新建一個(gè)鎖表項(xiàng)(L),將該 項(xiàng)添加進(jìn)L中,并將事務(wù)T構(gòu)建的新的鎖表節(jié)點(diǎn)置于L指向的鎖表鏈表后面;
(3) 如果更新事務(wù)T的鎖表節(jié)點(diǎn)處于對(duì)應(yīng)鎖表鏈表的第一個(gè),那么直 接授予鎖;否則,讀取前驅(qū)節(jié)點(diǎn)的事務(wù)申請(qǐng)的鎖類型,根據(jù)相容矩陣表判 斷相容性,相容則授予鎖,如果不相容則等待前驅(qū)節(jié)點(diǎn)的事務(wù)執(zhí)行完畢釋 放鎖再授予更新事務(wù)T請(qǐng)求鎖。
權(quán)利要求
1、一種基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群,包括由M臺(tái)數(shù)據(jù)庫(kù)服務(wù)器(4)構(gòu)成的數(shù)據(jù)庫(kù)服務(wù)層,其特征在于該系統(tǒng)在應(yīng)用層和數(shù)據(jù)庫(kù)服務(wù)層(4)之間設(shè)置有中間層,中間層包括N個(gè)應(yīng)用代理(2),M個(gè)數(shù)據(jù)庫(kù)中間件(3)及消息總線,1≤N≤16,1≤M≤8;應(yīng)用代理(2)用于服務(wù)節(jié)點(diǎn)出現(xiàn)故障時(shí)的連接重定向,保持服務(wù)不中斷,提高可靠性;數(shù)據(jù)庫(kù)中間件(3)用于對(duì)數(shù)據(jù)庫(kù)請(qǐng)求消息的攔截、解析、處理和轉(zhuǎn)發(fā);消息總線貫穿于數(shù)據(jù)庫(kù)中間件(3)和數(shù)據(jù)庫(kù)服務(wù)器(4)之間,它負(fù)責(zé)將數(shù)據(jù)中間件(3)發(fā)送的讀寫操作進(jìn)行全局排序,保證數(shù)據(jù)一致性,并將排序結(jié)果發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器(4)。
2、 根據(jù)權(quán)利要求1所述的高可用性數(shù)據(jù)庫(kù)集群,其特征在于應(yīng)用代 理(2)包括請(qǐng)求連接管理器(2A)、執(zhí)行模塊(2B)和重定向模塊(2C);請(qǐng)求連接管理器(2A)用于監(jiān)聽及接收應(yīng)用層的數(shù)據(jù)連接請(qǐng)求,保存 所有數(shù)據(jù)節(jié)點(diǎn)的MySQL ODBC數(shù)據(jù)源,構(gòu)建MySQL連接池;如果應(yīng)用程 序和請(qǐng)求連接管理器(2A)連接建立成功,將應(yīng)用程序的請(qǐng)求發(fā)送給執(zhí)行 模塊(2B);否則將連接出錯(cuò)信息發(fā)送給重定向模塊(2C);執(zhí)行模塊(2B)用于發(fā)送執(zhí)行MySQL請(qǐng)求給數(shù)據(jù)庫(kù)中間件(3),檢 查返回結(jié)果,并將回送結(jié)果發(fā)送給應(yīng)用程序,它還接收數(shù)據(jù)庫(kù)中間件(3) 提供的端口信息;重定向模塊(2C)用于在當(dāng)前提供服務(wù)的數(shù)據(jù)節(jié)點(diǎn)連接出現(xiàn)故障時(shí), 變更執(zhí)行模塊(2B)使用的MySQL連接,并將變更結(jié)果通知執(zhí)行模塊(2B)。
3、 根據(jù)權(quán)利要求1或2所述的高可用性數(shù)據(jù)庫(kù)集群,其特征在于數(shù) 據(jù)庫(kù)中間件(3)包括消息接收模塊(3A)、 MySQL消息解析模塊(3B)、 SQL語(yǔ)句解析模塊(3C)、請(qǐng)求執(zhí)行與結(jié)果處理模塊(3D)、消息處理模塊(3E)、故障檢測(cè)模塊(3F)、數(shù)據(jù)恢復(fù)模塊(3G)、日志模塊(3H)、組通 信模塊(31)和并發(fā)控制模塊(3J);消息接收模塊(3A)用于監(jiān)聽端口信息,接收來(lái)自上層數(shù)據(jù)庫(kù)請(qǐng)求, 從己建立的MySQL連接池中選擇空閑連接提供初始化、中斷、SQL命令 查詢、刪除、插入、修改等數(shù)據(jù)庫(kù)服務(wù),將接收到的消息處理后交由MySQL 消息解析模塊(3B);MySQL消息解析模塊(3B)用于解析消息接收模塊獲得的MySQL消 息,區(qū)分消息類型,解壓分析得到SQL命令并發(fā)送給SQL語(yǔ)句解析模塊 (3C)進(jìn)行后續(xù)處理;SQL語(yǔ)句解析模塊(3C)用于從MySQL消息解析模塊(3B)獲得MySQL 消息中讀、寫命令,解析出命令的類型;如果是非寫命令,直接轉(zhuǎn)交請(qǐng)求 執(zhí)行與結(jié)果處理模塊(3D);如果是寫命令,解析結(jié)果返回給消息處理模塊 (3E);請(qǐng)求執(zhí)行與結(jié)果處理模塊(3D)用于將本地節(jié)點(diǎn)的只讀信息直接發(fā)送 給數(shù)據(jù)庫(kù)服務(wù)器(4)執(zhí)行,全局寫命令發(fā)送給并發(fā)控制模塊(3J),比對(duì)分 析執(zhí)行結(jié)果并返回給應(yīng)用代理(2);消息處理模塊(3E)負(fù)責(zé)系統(tǒng)中的消息處理和轉(zhuǎn)發(fā),將處理后的信息 通過(guò)組通信模塊(31)置于消息總線上,轉(zhuǎn)發(fā)給其它數(shù)據(jù)節(jié)點(diǎn);同時(shí),接收 經(jīng)由組通信模塊(31)傳遞來(lái)的其它數(shù)據(jù)節(jié)點(diǎn)消息;包含寫命令的組通信消 息全局排序后,解析出MySQL消息傳遞給請(qǐng)求執(zhí)行與結(jié)果處理模塊(3D) 執(zhí)行;發(fā)送前和接收到結(jié)果后通過(guò)日志模塊(3H)寫更新日志和完成日志; 獲得故障消息時(shí),調(diào)用故障檢測(cè)模塊(3F)分析處理;故障檢測(cè)模塊(3F)利用消息處理模塊(3E)獲得的系統(tǒng)組成員變更 的信息,分析系統(tǒng)故障,當(dāng)由新節(jié)點(diǎn)加入或者故障節(jié)點(diǎn)恢復(fù)時(shí)調(diào)用數(shù)據(jù)恢 復(fù)模塊(3G)進(jìn)行數(shù)據(jù)同步;數(shù)據(jù)恢復(fù)模塊(3G)利用日志模塊(3H)提供的更新日志,分析新加 入節(jié)點(diǎn)或待恢復(fù)節(jié)點(diǎn)與正常節(jié)點(diǎn)的數(shù)據(jù)差異,對(duì)數(shù)據(jù)進(jìn)行同步處理,直至 所有節(jié)點(diǎn)達(dá)到數(shù)據(jù)庫(kù)一致;日志模塊(3H)用于定義數(shù)據(jù)恢復(fù)的更新日志、增量恢復(fù)腳本數(shù)據(jù)格式,為消息處理模塊(3E)和數(shù)據(jù)恢復(fù)模塊(3G)提供日志的訪問(wèn)接口; 組通信模塊(30為消息處理模塊和消息總線的接口; 并發(fā)控制模塊(3J)根據(jù)請(qǐng)求執(zhí)行與結(jié)果處理模塊(3D)的結(jié)果,利用分布式鎖表,控制更新事務(wù)在全局執(zhí)行順序的一致。
4、 根據(jù)權(quán)利要求3所述的高可用性數(shù)據(jù)庫(kù)集群,其特征在于數(shù)據(jù)恢 復(fù)模塊(3G)按照下述步驟進(jìn)行增量數(shù)據(jù)恢復(fù)① 待恢復(fù)節(jié)點(diǎn)讀取完成日志,分析得到最后執(zhí)行完成的任務(wù)編號(hào)Tj;② 將分析得到的任務(wù)編號(hào)發(fā)送給選舉出來(lái)的正常節(jié)點(diǎn);③ 正常節(jié)點(diǎn)分析它的完成日志,獲得上開始恢復(fù)時(shí)執(zhí)行完成的任務(wù)編號(hào)Ti;④ 如果Ti-Tj值為0,則轉(zhuǎn)步驟⑦執(zhí)行;如果值大于O,則轉(zhuǎn)步驟⑤執(zhí) 行;如果值小于0,則顯示系統(tǒng)錯(cuò)誤,待恢復(fù)節(jié)點(diǎn)不加入系統(tǒng),跳出恢復(fù)過(guò) 程等待管理員處理;⑤ 正常節(jié)點(diǎn)打開它的更新日志,將任務(wù)Tj至Ti的SQL命令解析出來(lái), 存于增量恢復(fù)腳本中;⑥ 正常節(jié)點(diǎn)將增量恢復(fù)腳本傳輸給待恢復(fù)節(jié)點(diǎn),待恢復(fù)節(jié)點(diǎn)執(zhí)行腳本 完成數(shù)據(jù)同步;⑦ 顯示完成增量恢復(fù)。
5、 根據(jù)權(quán)利要求3所述的高可用性數(shù)據(jù)庫(kù)集群,其特征在于數(shù)據(jù)恢 復(fù)模塊(3G)按照下述步驟進(jìn)行全復(fù)制數(shù)據(jù)恢復(fù)① 寫入創(chuàng)建數(shù)據(jù)庫(kù)命令;② 切換數(shù)據(jù)訪問(wèn)用戶;③ 寫入刪除正常節(jié)點(diǎn)數(shù)據(jù)庫(kù)中存在表的命令; 申請(qǐng)寫鎖,根據(jù)正常節(jié)點(diǎn)中數(shù)據(jù)表名和格式創(chuàng)建新表; 嚴(yán)格按照正常節(jié)點(diǎn)中表的數(shù)據(jù)寫插入命令; ◎多個(gè)表,則重復(fù)執(zhí)行第④步至第⑤步的操作; ⑦釋放鎖。
6、根據(jù)權(quán)利要求3所述的高可用性數(shù)據(jù)庫(kù)集群,其特征在于并發(fā)控制模塊(3J)按照下述步驟進(jìn)行處理-① 當(dāng)系統(tǒng)中新接收一個(gè)更新事務(wù)時(shí),讀取更新事務(wù)將更新的對(duì)象表或行,并將對(duì)象哈希轉(zhuǎn)換為鎖表項(xiàng)中的項(xiàng);② 查找鎖表,如果某個(gè)鎖表項(xiàng)等于上述項(xiàng),以上述更新事務(wù)構(gòu)建鎖表 節(jié)點(diǎn)置于該鎖表項(xiàng)指向的鎖表鏈表后面;否則,新建一個(gè)鎖表項(xiàng),將上述 項(xiàng)添加進(jìn)新建的鎖表項(xiàng)中,并將上述更新事務(wù)構(gòu)建的新鎖表節(jié)點(diǎn)置于新建 的鎖表項(xiàng)指向的鎖表鏈表后面;③ 如果更新事務(wù)的鎖表節(jié)點(diǎn)處于對(duì)應(yīng)鎖表鏈表的第一個(gè),那么直接授 予鎖;否則,讀取前驅(qū)節(jié)點(diǎn)的事務(wù)申請(qǐng)的鎖類型,根據(jù)相容矩陣表判斷相 容性,相容則授予鎖,如果不相容則等待前驅(qū)節(jié)點(diǎn)的事務(wù)執(zhí)行完畢釋放鎖 再授予更新事務(wù)請(qǐng)求鎖。
全文摘要
本發(fā)明公開了一種基于消息中間件的高可用性數(shù)據(jù)庫(kù)集群系統(tǒng),包括由多臺(tái)數(shù)據(jù)庫(kù)服務(wù)器構(gòu)成的數(shù)據(jù)庫(kù)服務(wù)層,在應(yīng)用層和數(shù)據(jù)庫(kù)服務(wù)層之間設(shè)置有中間層,中間層包括多個(gè)應(yīng)用代理,多個(gè)數(shù)據(jù)庫(kù)中間件及消息總線;應(yīng)用代理用于服務(wù)節(jié)點(diǎn)出現(xiàn)故障時(shí)的連接重定向,保持服務(wù)不中斷,提高可靠性;數(shù)據(jù)庫(kù)中間件用于對(duì)數(shù)據(jù)庫(kù)請(qǐng)求消息的攔截、解析、處理和轉(zhuǎn)發(fā);消息總線貫穿于數(shù)據(jù)庫(kù)中間件和數(shù)據(jù)庫(kù)服務(wù)器之間,它負(fù)責(zé)將數(shù)據(jù)中間件發(fā)送的讀寫操作進(jìn)行全局排序,保證數(shù)據(jù)一致性,并將排序結(jié)果發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器。本發(fā)明為獲得具有高可用性的高性能數(shù)據(jù)庫(kù)提供了一條切實(shí)可行的途徑,具有較高的可用性、良好的可擴(kuò)展性、易于構(gòu)建和管理的特點(diǎn)。
文檔編號(hào)G06F17/30GK101183377SQ20071016872
公開日2008年5月21日 申請(qǐng)日期2007年12月10日 優(yōu)先權(quán)日2007年12月10日
發(fā)明者于集東, 德 張, 蔣懷貞, 邵志遠(yuǎn), 海 金, 陸曉雯, 陳冠華, 陳華才 申請(qǐng)人:華中科技大學(xué)