本發(fā)明涉及通信領(lǐng)域,具體而言,涉及一種數(shù)據(jù)遷移處理方法及裝置。
背景技術(shù):
分布式數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)和表分布在各個(gè)節(jié)點(diǎn)上,按照系統(tǒng)的數(shù)據(jù)分布規(guī)則,數(shù)據(jù)可以按照不同的表分布在不同的節(jié)點(diǎn)上,也可以是一個(gè)表的數(shù)據(jù)根據(jù)表的列屬性分布在不同節(jié)點(diǎn)上。當(dāng)系統(tǒng)數(shù)據(jù)存儲量增加時(shí),原先的節(jié)點(diǎn)已經(jīng)無法存儲時(shí),需要對系統(tǒng)的存儲進(jìn)行擴(kuò)容,將存儲在一個(gè)節(jié)點(diǎn)的數(shù)據(jù)重新分布到兩個(gè)或者多個(gè)節(jié)點(diǎn)上。另外一種情況是系統(tǒng)運(yùn)行一段時(shí)間后,不同的節(jié)點(diǎn)存儲出現(xiàn)不均衡的情況,為了提升系統(tǒng)性能,需要將數(shù)據(jù)在節(jié)點(diǎn)間進(jìn)行遷移。
不同于面向聯(lián)機(jī)分析處理(Online Analytical Processing,簡稱為OLAP)系統(tǒng),面向聯(lián)機(jī)事務(wù)處理(On-Line Transaction Processing,簡稱為OLTP)系統(tǒng)往往會同時(shí)對數(shù)據(jù)進(jìn)行讀、寫、更新操作,而OLAP系統(tǒng)往往都是一次性寫后多次讀取。因此分布式數(shù)據(jù)庫系統(tǒng)在數(shù)據(jù)遷移和擴(kuò)容的過程中必須考慮對系統(tǒng)當(dāng)前的讀寫操作的影響。數(shù)據(jù)在遷移和擴(kuò)容的過程中,往往需要耗費(fèi)一定時(shí)間,在這段時(shí)間內(nèi)系統(tǒng)需要停止數(shù)據(jù)庫的讀寫操作,或者限制對數(shù)據(jù)庫的操作,這勢必影響了業(yè)務(wù)的運(yùn)行。
針對相關(guān)技術(shù)中,在數(shù)據(jù)遷移和擴(kuò)容的過程中需要停止數(shù)據(jù)庫的讀寫操作的問題,還未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了一種數(shù)據(jù)遷移處理方法及裝置,以至少解決相關(guān)技術(shù)中在數(shù)據(jù)遷移和擴(kuò)容的過程中需要停止數(shù)據(jù)庫的讀寫操作的問題。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)遷移處理方法,包括:接收將指定數(shù)據(jù)由第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的數(shù)據(jù)遷移請求消息;記錄當(dāng)前對所述指定數(shù)據(jù)的數(shù)據(jù)操作變更信息;在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)的過程中,根據(jù)所述數(shù)據(jù)操作變更信息對所述指定數(shù)據(jù)進(jìn)行操作處理。
進(jìn)一步地,所述方法還包括:在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)之后,根據(jù)所述數(shù)據(jù)操作變更信息在所述第二節(jié)點(diǎn)中再次對所述指定數(shù)據(jù)進(jìn)行操作處理;停止對所述第一節(jié)點(diǎn)中的數(shù)據(jù)和所述第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
進(jìn)一步地,停止對所述第一節(jié)點(diǎn)中的數(shù)據(jù)和所述第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處 理之后包括:將所述指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由所述第一節(jié)點(diǎn)更新為所述第二節(jié)點(diǎn)。
進(jìn)一步地,將所述指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由所述第一節(jié)點(diǎn)更新為所述第二節(jié)點(diǎn)之后包括:繼續(xù)對所述第一節(jié)點(diǎn)中的數(shù)據(jù)和所述第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
進(jìn)一步地,所述方法還包括:在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)之后,將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)中刪除。
進(jìn)一步地,所述數(shù)據(jù)操作變更信息包括以下至少之一的信息:更新所述指定數(shù)據(jù)的信息、修改所述指定數(shù)據(jù)的信息、刪除所述指定數(shù)據(jù)的信息、增加數(shù)據(jù)。
根據(jù)本發(fā)明的另一個(gè)方面,還提供了一種數(shù)據(jù)遷移處理裝置,所述裝置包括:接收模塊,用于接收將指定數(shù)據(jù)由第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的數(shù)據(jù)遷移請求消息;記錄模塊,用于記錄當(dāng)前對所述指定數(shù)據(jù)的數(shù)據(jù)操作變更信息;第一處理模塊,用于在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)的過程中,根據(jù)所述數(shù)據(jù)操作變更信息對所述指定數(shù)據(jù)進(jìn)行操作處理。
進(jìn)一步地,所述裝置還包括:第二處理模塊,用于在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)之后,根據(jù)所述數(shù)據(jù)操作變更信息在所述第二節(jié)點(diǎn)中再次對所述指定數(shù)據(jù)進(jìn)行操作處理;停止模塊,用于停止對所述第一節(jié)點(diǎn)中的數(shù)據(jù)和所述第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
進(jìn)一步地,所述裝置還包括:更新模塊,用于將所述指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由所述第一節(jié)點(diǎn)更新為所述第二節(jié)點(diǎn)。
進(jìn)一步地,所述裝置還包括:繼續(xù)模塊,用于繼續(xù)對所述第一節(jié)點(diǎn)中的數(shù)據(jù)和所述第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
進(jìn)一步地,所述裝置還包括:刪除模塊,用于在將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)遷移至所述第二節(jié)點(diǎn)之后,將所述指定數(shù)據(jù)從所述第一節(jié)點(diǎn)中刪除。
進(jìn)一步地,所述數(shù)據(jù)操作變更信息包括以下至少之一的信息:更新所述指定數(shù)據(jù)的信息、修改所述指定數(shù)據(jù)的信息、刪除所述指定數(shù)據(jù)的信息、增加數(shù)據(jù)。
通過本發(fā)明,采用接收將指定數(shù)據(jù)由第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的數(shù)據(jù)遷移請求消息;記錄當(dāng)前對指定數(shù)據(jù)的數(shù)據(jù)操作變更信息;在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的過程中,根據(jù)數(shù)據(jù)操作變更信息對指定數(shù)據(jù)進(jìn)行操作處理。解決了相關(guān)技術(shù)中在數(shù)據(jù)遷移和擴(kuò)容的過程中需要停止數(shù)據(jù)庫的讀寫操作的問題,降低了數(shù)據(jù)遷移過程中,數(shù)據(jù)庫節(jié)點(diǎn)停止服務(wù)的時(shí)間窗口。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,本發(fā)明 的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理方法的流程圖;
圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖;
圖3是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(一);
圖4是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(二);
圖5是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(三);
圖6是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(四);
圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移的系統(tǒng)結(jié)構(gòu)圖;
圖8是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移模塊根據(jù)客戶端提交的數(shù)據(jù)遷移請求的數(shù)據(jù)導(dǎo)出導(dǎo)入處理流程圖;
圖9是根據(jù)本發(fā)明實(shí)施例的監(jiān)控模塊DBMonitor在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖;
圖10是根據(jù)本發(fā)明實(shí)施例的路由模塊在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖。
具體實(shí)施方式
下文中將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互組合。
在本實(shí)施例中提供了一種數(shù)據(jù)遷移處理方法,圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理方法的流程圖,如圖1所示,該流程包括如下步驟:
步驟S102,接收將指定數(shù)據(jù)由第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的數(shù)據(jù)遷移請求消息;
步驟S104,記錄當(dāng)前對指定數(shù)據(jù)的數(shù)據(jù)操作變更信息;
步驟S106,在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的過程中,根據(jù)上述數(shù)據(jù)操作變更信息對指定數(shù)據(jù)進(jìn)行操作處理。
通過上述步驟,記錄第一節(jié)點(diǎn)中對指定數(shù)據(jù)進(jìn)行操作的數(shù)據(jù)操作變更信息,在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的過程中,依然根據(jù)上述數(shù)據(jù)操作變更信息對指定數(shù)據(jù)進(jìn)行操作處理,相比于相關(guān)技術(shù)中,數(shù)據(jù)在遷移和擴(kuò)容的過程中,系統(tǒng)需要停止數(shù)據(jù)庫的讀寫操作,導(dǎo)致的一定時(shí)間的耗費(fèi),上述步驟解決了相關(guān)技術(shù)中在數(shù)據(jù)遷移和擴(kuò)容的過程中需要停止數(shù)據(jù)庫的讀寫操作的問題,降低了數(shù)據(jù)遷移過程中,數(shù)據(jù)庫節(jié)點(diǎn)停止服務(wù)的時(shí)間窗口。
在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)之后,在一個(gè)可選實(shí)施例中,根據(jù)上述數(shù) 據(jù)操作變更信息在第二節(jié)點(diǎn)中再次對指定數(shù)據(jù)進(jìn)行操作處理,在完成對指定數(shù)據(jù)的再次操作處理之后,停止對第一節(jié)點(diǎn)中的數(shù)據(jù)和第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。以便于在指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)之后,對元數(shù)據(jù)信息進(jìn)行更新。
對元數(shù)據(jù)信息進(jìn)行更新的過程中,在一個(gè)可選實(shí)施例中,在停止對第一節(jié)點(diǎn)中的數(shù)據(jù)和第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理之后,將指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由第一節(jié)點(diǎn)更新為第二節(jié)點(diǎn)。以便于按照新的元數(shù)據(jù)信息將數(shù)據(jù)庫操作語句發(fā)送至對應(yīng)的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行。
在一個(gè)可選實(shí)施例中,將指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由第一節(jié)點(diǎn)更新為第二節(jié)點(diǎn)之后,繼續(xù)對第一節(jié)點(diǎn)中的數(shù)據(jù)和第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
對元數(shù)據(jù)信息進(jìn)行更新的過程中,在另一個(gè)可選實(shí)施例中,在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)之后,將指定數(shù)據(jù)從第一節(jié)點(diǎn)中刪除。
上述數(shù)據(jù)操作變更信息可以包含多種信息,下面對此進(jìn)行舉例說明。在一個(gè)可選實(shí)施例中,上述數(shù)據(jù)操作變更信息可以包括:更新該指定數(shù)據(jù)的信息、修改該指定數(shù)據(jù)的信息、刪除該指定數(shù)據(jù)的信息、增加數(shù)據(jù)。
在本實(shí)施例中還提供了一種數(shù)據(jù)遷移處理裝置,該裝置用于實(shí)現(xiàn)上述實(shí)施例及優(yōu)選實(shí)施方式,已經(jīng)進(jìn)行過說明的不再贅述。如以下所使用的,術(shù)語“模塊”可以實(shí)現(xiàn)預(yù)定功能的軟件和/或硬件的組合。盡管以下實(shí)施例所描述的裝置較佳地以軟件來實(shí)現(xiàn),但是硬件,或者軟件和硬件的組合的實(shí)現(xiàn)也是可能并被構(gòu)想的。
圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖,如圖2所示,該裝置包括:接收模塊22,用于接收將指定數(shù)據(jù)由第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的數(shù)據(jù)遷移請求消息;記錄模塊24,用于記錄當(dāng)前對指定數(shù)據(jù)的數(shù)據(jù)操作變更信息;第一處理模塊26,用于在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)的過程中,根據(jù)該數(shù)據(jù)操作變更信息對指定數(shù)據(jù)進(jìn)行操作處理。
圖3是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(一),如圖3所示,該裝置還包括:第二處理模塊32,用于在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)之后,根據(jù)該數(shù)據(jù)操作變更信息在第二節(jié)點(diǎn)中再次對指定數(shù)據(jù)進(jìn)行操作處理;停止模塊34,用于停止對第一節(jié)點(diǎn)中的數(shù)據(jù)和第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
圖4是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(二),如圖4所示,該裝置還包括:更新模塊44,用于將指定數(shù)據(jù)對應(yīng)的節(jié)點(diǎn)由第一節(jié)點(diǎn)更新為第二節(jié)點(diǎn)。
圖5是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(三),如圖5所示,該裝置還包括:繼續(xù)模塊52,用于繼續(xù)對第一節(jié)點(diǎn)中的數(shù)據(jù)和第二節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行操作變更處理。
圖6是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移處理裝置的結(jié)構(gòu)框圖(四),如圖6所示,該 裝置還包括:刪除模塊62,用于在將指定數(shù)據(jù)從第一節(jié)點(diǎn)遷移至第二節(jié)點(diǎn)之后,將指定數(shù)據(jù)從第一節(jié)點(diǎn)中刪除。
可選地,上述數(shù)據(jù)操作變更信息包括以下至少之一的信息:更新該指定數(shù)據(jù)的信息、修改該指定數(shù)據(jù)的信息、刪除該指定數(shù)據(jù)的信息、增加數(shù)據(jù)。
需要說明的是,上述各個(gè)模塊是可以通過軟件或硬件來實(shí)現(xiàn)的,對于后者,可以通過以下方式實(shí)現(xiàn),但不限于此:上述各個(gè)模塊均位于同一處理器中;或者,上述各個(gè)模塊分別位于第一處理器、第二處理器和第三處理器…中。
針對相關(guān)技術(shù)中存在的上述問題,下面結(jié)合具體的可選實(shí)施例進(jìn)行說明。
本可選實(shí)施例提出了一種分布式數(shù)據(jù)庫數(shù)據(jù)遷移、擴(kuò)容和重分布的方法和系統(tǒng)。該方法在數(shù)據(jù)遷移和擴(kuò)容的同時(shí),監(jiān)控在此節(jié)點(diǎn)的數(shù)據(jù)操作,并將按照數(shù)據(jù)分布更新后需要在新節(jié)點(diǎn)寫入的數(shù)據(jù)也一同保存到導(dǎo)出的數(shù)據(jù)中,使得在數(shù)據(jù)導(dǎo)出的過程中,不需要停止對數(shù)據(jù)庫的讀寫操作。在數(shù)據(jù)在新的節(jié)點(diǎn)導(dǎo)入后,這時(shí)停止數(shù)據(jù)庫的讀寫,完成系統(tǒng)元數(shù)據(jù)信息的更新和原節(jié)點(diǎn)數(shù)據(jù)的清理。通過此系統(tǒng)和方法使得數(shù)據(jù)在從原節(jié)點(diǎn)導(dǎo)入到新節(jié)點(diǎn)的過程中,大大減少系統(tǒng)停止服務(wù)的時(shí)間,提升系統(tǒng)性能,改善可用性。
在本可選實(shí)施例中,數(shù)據(jù)遷移服務(wù)器接收到數(shù)據(jù)遷移請求后,通知原數(shù)據(jù)庫節(jié)點(diǎn)的監(jiān)控?cái)?shù)據(jù)庫監(jiān)控工具(Data Base Monitor,簡稱為DBMonitor)開始監(jiān)控所有在原數(shù)據(jù)庫上的數(shù)據(jù)操作變更。同時(shí)數(shù)據(jù)遷移服務(wù)器開始將原數(shù)據(jù)庫節(jié)點(diǎn)按照邏輯操作,將數(shù)據(jù)導(dǎo)出到遷移服務(wù)器上存儲。數(shù)據(jù)庫的監(jiān)控DBMonitor監(jiān)控會所有的數(shù)據(jù)操作,如果原數(shù)據(jù)庫操作的數(shù)據(jù)按照遷移規(guī)則屬于新的數(shù)據(jù)庫節(jié)點(diǎn),那么DBMonitor將數(shù)據(jù)操作記錄到DBMonitor監(jiān)控文件中。數(shù)據(jù)遷移服務(wù)器在數(shù)據(jù)導(dǎo)出完成后,開始將存儲在遷移服務(wù)器上的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)庫節(jié)點(diǎn)。當(dāng)遷移服務(wù)器上存儲的數(shù)據(jù)全部導(dǎo)入完畢后,DBMonitor在新的數(shù)據(jù)庫節(jié)點(diǎn)上回放監(jiān)控文件中記錄的數(shù)據(jù)操作。當(dāng)DBMonitor回放完畢后,遷移服務(wù)器通知路由服務(wù)器停止原數(shù)據(jù)庫相關(guān)表的讀寫操作,并更新原數(shù)據(jù)庫節(jié)點(diǎn)上存儲的數(shù)據(jù)分布元數(shù)據(jù)信息。元數(shù)據(jù)信息更新完畢后,遷移服務(wù)器通知路由服務(wù)器按照新的數(shù)據(jù)分布信息進(jìn)行數(shù)據(jù)操作請求的路由,并回復(fù)原數(shù)據(jù)庫節(jié)點(diǎn)的讀寫操作。遷移服務(wù)器開始清理原數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù),當(dāng)所有數(shù)據(jù)清理完畢后,此時(shí)數(shù)據(jù)在原數(shù)據(jù)庫節(jié)點(diǎn)和新數(shù)據(jù)庫節(jié)點(diǎn)遷移完畢,同時(shí)元數(shù)據(jù)服務(wù)器上的元數(shù)據(jù)信息更新完畢,至此完成數(shù)據(jù)遷移操作。
進(jìn)一步地,數(shù)據(jù)遷移服務(wù)器的數(shù)據(jù)遷移處理的具體步驟為:
數(shù)據(jù)遷移模塊接收到客戶端的數(shù)據(jù)遷移請求。
數(shù)據(jù)遷移模塊通知原數(shù)據(jù)庫節(jié)點(diǎn)的監(jiān)控DBMonitor開始監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)的所有數(shù)據(jù)操作,包括數(shù)據(jù)的更新、修改、新增、刪除等操作。
DBMonitor按照新的路由規(guī)則,如果操作的數(shù)據(jù)應(yīng)該發(fā)生在新的數(shù)據(jù)庫節(jié)點(diǎn)上,那 么DBMonitor將數(shù)據(jù)操作記錄到DBMonitor的監(jiān)控文件上。
當(dāng)數(shù)據(jù)遷移模塊將原數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)導(dǎo)出完畢后,數(shù)據(jù)遷移模塊停止原數(shù)據(jù)庫節(jié)點(diǎn)的讀取,開始將數(shù)據(jù)往新的數(shù)據(jù)庫節(jié)點(diǎn)導(dǎo)入。此時(shí)DBMonitor繼續(xù)監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)操作。
當(dāng)數(shù)據(jù)遷移模塊上所有數(shù)據(jù)導(dǎo)入完畢后,數(shù)據(jù)遷移模塊通知DBMonitor在新的數(shù)據(jù)庫節(jié)點(diǎn)上回放數(shù)據(jù)。所謂回放數(shù)據(jù),也即將之前在原數(shù)據(jù)庫上執(zhí)行的數(shù)據(jù)變更操作再在新的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行一次。
DBMonitor接收到回放請求后,開始將監(jiān)控文件中記錄的數(shù)據(jù)操作逐個(gè)在新的數(shù)據(jù)節(jié)點(diǎn)上操作,包括新的數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)、修改、新增、刪除操作。
DBMonitor在回放的過程中,仍然會監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)的操作。當(dāng)DBMoitor所有的數(shù)據(jù)回放完畢后,DBMonitor通知數(shù)據(jù)遷移模塊數(shù)據(jù)回放完畢。
數(shù)據(jù)遷移接收到DBMonitor的回放完畢消息后,DBMonitor通知路由模塊停止原數(shù)據(jù)庫和新的數(shù)據(jù)庫節(jié)點(diǎn)的相關(guān)數(shù)據(jù)表的讀寫操作。
數(shù)據(jù)遷移模塊通知元數(shù)據(jù)庫服務(wù)器按照新的數(shù)據(jù)分布信息更新元數(shù)據(jù)信息。
元數(shù)據(jù)信息更新完畢后,數(shù)據(jù)遷移模塊通知路由服務(wù)器恢復(fù)原數(shù)據(jù)庫的讀寫操作。
數(shù)據(jù)遷移模塊開始清理原數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù)。
數(shù)據(jù)遷移模塊完成數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù)清理后,通知客戶端完成數(shù)據(jù)遷移操作。
下面結(jié)合附圖對本發(fā)明“一種分布式數(shù)據(jù)庫數(shù)據(jù)遷移和重分布方法和系統(tǒng)”進(jìn)詳細(xì)說明。
圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移的系統(tǒng)結(jié)構(gòu)圖,如圖7所示,為本發(fā)明的系統(tǒng)結(jié)構(gòu)圖。系統(tǒng)結(jié)構(gòu)主要包括:客戶端101、路由模塊102(執(zhí)行了上述停止模塊34的功能)、元數(shù)據(jù)緩存模塊103、數(shù)據(jù)遷移模塊104(執(zhí)行了上述接收模塊22、第一處理模塊26和第二處理模塊32的功能)、分布式數(shù)據(jù)庫集群的單機(jī)數(shù)據(jù)庫105、數(shù)據(jù)庫操作監(jiān)控模塊106(執(zhí)行了上述記錄模塊24的功能)。
客戶端101:客戶端模塊,用戶通過客戶端101(包括電腦、手機(jī)、瀏覽器等)提交事務(wù)結(jié)構(gòu)化查詢語言(Structured Query Language,簡稱為SQL)語句等。
路由模塊102:路由模塊,是將執(zhí)行模塊下發(fā)的SQL語句,選擇合適的數(shù)據(jù)庫連接下發(fā)SQL語句去執(zhí)行。路由模塊針對分布式SQL語句會做SQL語句的處理,如在數(shù)據(jù)遷移階段,路由模塊需要將SQL語句處理成攜帶路由信息的SQL,如增刪改查都會增加路由信息。
元數(shù)據(jù)緩存模塊103:元數(shù)據(jù)緩存模塊,用于元數(shù)據(jù)的緩存,包括表定義信息、分布 式數(shù)據(jù)庫各節(jié)點(diǎn)分布信息。元數(shù)據(jù)緩存模塊可以進(jìn)行元數(shù)據(jù)的更新和查詢操作。當(dāng)系統(tǒng)元數(shù)據(jù)信息變更時(shí),會同步更新元數(shù)據(jù)緩存模塊保存的信息。同時(shí),元數(shù)據(jù)緩存模塊接收其他模塊的查詢操作,返回元數(shù)據(jù)信息。
數(shù)據(jù)遷移模塊104:數(shù)據(jù)遷移模塊,用于數(shù)據(jù)的遷移,包括數(shù)據(jù)的導(dǎo)入導(dǎo)出、系統(tǒng)擴(kuò)容、數(shù)據(jù)重分布等數(shù)據(jù)遷移的相關(guān)工作。數(shù)據(jù)遷移模塊會接收數(shù)據(jù)庫節(jié)點(diǎn)導(dǎo)出的文件,并將導(dǎo)出的文件再導(dǎo)入到新的數(shù)據(jù)庫節(jié)點(diǎn)。數(shù)據(jù)遷移模塊會以文件形式存儲導(dǎo)出的中間文件。
分布式數(shù)據(jù)庫集群的單機(jī)數(shù)據(jù)庫105:分布式數(shù)據(jù)庫集群的單機(jī)數(shù)據(jù)庫,會接收并執(zhí)行分布式數(shù)據(jù)庫集群的數(shù)據(jù)庫語言。其中數(shù)據(jù)庫語言包括數(shù)據(jù)定義語言、數(shù)據(jù)操作語言、數(shù)據(jù)查詢語言、數(shù)據(jù)控制語言、事務(wù)控制語言等。
數(shù)據(jù)庫操作監(jiān)控模塊106:數(shù)據(jù)庫操作監(jiān)控模塊DBMonitor,用來監(jiān)控分布式數(shù)據(jù)庫集群各個(gè)數(shù)據(jù)庫狀態(tài),他會將數(shù)據(jù)庫所有修改數(shù)據(jù)庫數(shù)據(jù)的語言以二進(jìn)制的形式記錄到日志文件中,如insert、update、delete等。DBMonitor會記錄所有記錄的變化,將每一行數(shù)據(jù)的修改記錄都記錄到日志文件中。日志文件中不包括數(shù)據(jù)庫語言,對于查詢語句等,因不涉及到數(shù)據(jù)的變更,也不會記錄到日志文件中。
圖8是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)遷移模塊根據(jù)客戶端提交的數(shù)據(jù)遷移請求的數(shù)據(jù)導(dǎo)出導(dǎo)入處理流程圖。數(shù)據(jù)遷移模塊接收到數(shù)據(jù)遷移請求后,開始通知DBMonitor監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)上的數(shù)據(jù)操作,之后開始將數(shù)據(jù)導(dǎo)出到文件中,再將導(dǎo)出的文件導(dǎo)入到新的數(shù)據(jù)庫節(jié)點(diǎn)中。數(shù)據(jù)導(dǎo)入完畢后,再將DBMonitor監(jiān)控的數(shù)據(jù)操作日志再在目的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行。導(dǎo)入完畢之后通知路由模塊停止元數(shù)據(jù)庫的相關(guān)表的讀寫操作,并更新元數(shù)據(jù)信息。更新完畢之后,數(shù)據(jù)遷移模塊通知路由模塊恢復(fù)原數(shù)據(jù)庫相關(guān)表的讀寫操作權(quán)限,并開始清理原數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù)。待垃圾數(shù)據(jù)清理完畢后,數(shù)據(jù)遷移模塊通知客戶數(shù)據(jù)遷移完畢,并將操作結(jié)果返回給客戶端。如圖8所示,該流程具體包括如下步驟:
步驟S801:數(shù)據(jù)遷移模塊接收客戶端下發(fā)的數(shù)據(jù)遷移請求。
步驟S802:數(shù)據(jù)遷移模塊接收到客戶端的數(shù)據(jù)遷移請求后,通知DBMonitor監(jiān)控?cái)?shù)據(jù)操作。其中DBMonitor監(jiān)控?cái)?shù)據(jù)庫操作的詳細(xì)信息見圖9描述。
步驟S803:數(shù)據(jù)遷移模塊開始將原數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)出到文件中。
步驟S804:判斷原數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)是否導(dǎo)出完畢,如果沒有,則繼續(xù)導(dǎo)出,重復(fù)步驟S803,否則進(jìn)入步驟S805。
步驟S805:數(shù)據(jù)遷移模塊將導(dǎo)出的文件導(dǎo)入到新的數(shù)據(jù)庫節(jié)點(diǎn)。
步驟S806:數(shù)據(jù)遷移模塊判斷文件是否導(dǎo)入完畢,如果數(shù)據(jù)沒有導(dǎo)入完畢,則重復(fù)步驟S805,否則進(jìn)入步驟S807。
步驟S807:數(shù)據(jù)遷移模塊通知DBMonitor將日志文件中的數(shù)據(jù)回放到目的數(shù)據(jù)庫節(jié)點(diǎn)。所謂回放數(shù)據(jù),也即將日志文件中記錄的在原數(shù)據(jù)庫上執(zhí)行的數(shù)據(jù)變更操作再在新的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行一次。需要注意的是,在回放的過程中,DBMonitor仍然需要監(jiān)控原數(shù)據(jù)庫的數(shù)據(jù)操作。
步驟S808:數(shù)據(jù)遷移模塊判斷DBMonitor日志文件是否回放完畢,如果沒有回放完畢,則繼續(xù)重復(fù)步驟S807,否則進(jìn)入步驟S809。
步驟S809:數(shù)據(jù)遷移模塊獲取到數(shù)據(jù)文件導(dǎo)入完畢,同時(shí)DBMonitor監(jiān)控日志文件也已回放完畢,那么數(shù)據(jù)遷移模塊通知路由模塊停止相關(guān)數(shù)據(jù)庫表的讀寫操作。其中對原數(shù)據(jù)庫節(jié)點(diǎn)的讀寫控制可以是在表、庫的粒度上進(jìn)行讀寫權(quán)限控制。如一個(gè)大的表,數(shù)據(jù)需要根據(jù)分發(fā)鍵進(jìn)行切分并將一部分?jǐn)?shù)據(jù)遷移到新的數(shù)據(jù)庫上,那么此時(shí)路由模塊就需要停止原數(shù)據(jù)庫節(jié)點(diǎn)、新數(shù)據(jù)庫節(jié)點(diǎn)相關(guān)表的讀寫操作。
步驟S810:數(shù)據(jù)遷移模塊通知元數(shù)據(jù)緩存模塊更新元數(shù)據(jù)信息。在做數(shù)據(jù)遷移后,數(shù)據(jù)的存儲節(jié)點(diǎn)信息將發(fā)生變更,元數(shù)據(jù)信息需要更新表的分布信息。路由模塊在接收到數(shù)據(jù)庫操作請求時(shí),會查詢元數(shù)據(jù)緩存信息,如果涉及到原數(shù)據(jù)庫相關(guān)表的操作時(shí),那么就應(yīng)該按照新的表的分布信息,將數(shù)據(jù)庫操作請求路由到新的數(shù)據(jù)庫節(jié)點(diǎn)操作。
步驟S811:數(shù)據(jù)遷移模塊在完成元數(shù)據(jù)更新后,通知路由模塊恢復(fù)相關(guān)數(shù)據(jù)庫節(jié)點(diǎn)的操作權(quán)限。
步驟S812:數(shù)據(jù)遷移模塊開始清理原數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù),其中在清理原數(shù)據(jù)庫節(jié)點(diǎn)的垃圾數(shù)據(jù)時(shí),路由模塊需要對發(fā)往原數(shù)據(jù)庫節(jié)點(diǎn)的SQL語句做控制,具體流程見圖10所示。
步驟S813:判斷垃圾數(shù)據(jù)是否清理完畢,如果未清理完畢,則進(jìn)入步驟S812繼續(xù)清理垃圾數(shù)據(jù);如果垃圾數(shù)據(jù)清理完畢,則進(jìn)入步驟S814。
步驟S814:通知客戶端垃圾數(shù)據(jù)清理完畢,完成數(shù)據(jù)遷移工作。數(shù)據(jù)遷移模塊通知路由模塊停止監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)的相關(guān)表的操作語句。
圖9是根據(jù)本發(fā)明實(shí)施例的監(jiān)控模塊DBMonitor在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖。如圖3所示,是監(jiān)控模塊DBMonitor在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖,具體步驟如下所述:
步驟S901:監(jiān)控模塊DBMonitor開始監(jiān)控原數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)操作。他會將數(shù)據(jù)庫所有修改數(shù)據(jù)庫數(shù)據(jù)的語言以二進(jìn)制的形式記錄到日志文件中,如插入(insert)、更新(update)、刪除(delete)等。DBMonitor會記錄所有記錄的變化,將每一行數(shù)據(jù)的修改記錄都記錄到日志文件中。日志文件中不包括數(shù)據(jù)庫語言,對于查詢語句等,因不涉及到數(shù)據(jù)的變更,也不會記錄到日志文件中。
步驟S902,DBMonitor判斷監(jiān)控到的數(shù)據(jù)操作,判斷數(shù)據(jù)庫語言操作是否需要在新 的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行。如果不需要則進(jìn)入步驟S904,否則進(jìn)入步驟S903。
步驟S903,將數(shù)據(jù)庫語言操作的數(shù)據(jù)記錄保存在日志文件中。記錄到日志文件中的內(nèi)容包含這條數(shù)據(jù)庫操作的類型,以及這個(gè)操作的前后數(shù)據(jù)。如對于插入操作,記錄操作類型為插入,并且將插入的數(shù)據(jù)記錄下來;對于更新操作,記錄操作類型為更新,并將更新前后的數(shù)據(jù)記錄下來。類似地,涉及到數(shù)據(jù)變更的操作,都將操作類型記錄下來,并且記錄數(shù)據(jù)。對于不涉及到數(shù)據(jù)變更的操作,以及不涉及到新的數(shù)據(jù)庫節(jié)點(diǎn)相關(guān)表的變更,都不需要記錄到監(jiān)控日志文件。
步驟S904,判斷是否停止監(jiān)控?cái)?shù)據(jù)操作,如果不停止則繼續(xù)監(jiān)控,進(jìn)入步驟S901;否則完成數(shù)據(jù)操作監(jiān)控。
圖10是根據(jù)本發(fā)明實(shí)施例的路由模塊在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖,如圖10所示,路由模塊在數(shù)據(jù)遷移過程中的監(jiān)控處理的流程圖。路由模塊在數(shù)據(jù)元數(shù)據(jù)變更前,直接按照原有的元數(shù)據(jù)信息將數(shù)據(jù)庫操作語句發(fā)往對應(yīng)的數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行即可。元數(shù)據(jù)信息變更后,需要按照新的元數(shù)據(jù)信息將數(shù)據(jù)庫操作語句發(fā)到對應(yīng)數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行。為了提升遷移過程中數(shù)據(jù)庫性能和可用性,在做數(shù)據(jù)遷移時(shí),原有的數(shù)據(jù)庫節(jié)點(diǎn)仍然需要接收讀和寫的操作。因此原有的數(shù)據(jù)庫節(jié)點(diǎn)保留了新的數(shù)據(jù)庫節(jié)點(diǎn)需要遷移的全部數(shù)據(jù),以及在遷移過程中寫的數(shù)據(jù)。數(shù)據(jù)遷移到新的數(shù)據(jù)庫節(jié)點(diǎn)后,原有的數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)就需要做清理工作,在遷移過程中需要對發(fā)往原有的數(shù)據(jù)庫操作語言需要進(jìn)行處理,圖10流程圖描述了具體過程,其步驟如下:
步驟S1001,路由模塊接收數(shù)據(jù)庫操作語言。
步驟S1002,路由模塊根據(jù)數(shù)據(jù)庫操作語言涉及到的表去讀取其元數(shù)據(jù)信息。元數(shù)據(jù)信息包括表的分布情況,如根據(jù)主鍵的范圍,確定數(shù)據(jù)是落在對應(yīng)的數(shù)據(jù)庫節(jié)點(diǎn)上。
步驟S1003,路由模塊根據(jù)讀取到的元數(shù)據(jù)信息,判斷數(shù)據(jù)庫操作是否涉及到遷移數(shù)據(jù)。如果沒有涉及到遷移的數(shù)據(jù),則進(jìn)入步驟S1005;否則,進(jìn)入步驟S1004。
步驟S1004,如果數(shù)據(jù)庫操作數(shù)據(jù)涉及到新的遷移數(shù)據(jù),那么就需要對其SQL語句進(jìn)行處理,將數(shù)據(jù)庫語句修改為只在原數(shù)據(jù)庫的數(shù)據(jù)范圍內(nèi)執(zhí)行。如一條更新語句,更新的數(shù)據(jù)范圍包含了新舊兩個(gè)數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)。路由模塊將對新數(shù)據(jù)庫節(jié)點(diǎn)的操作路由到其數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行即可,對原有數(shù)據(jù)庫節(jié)點(diǎn)路由到原數(shù)據(jù)庫節(jié)點(diǎn)執(zhí)行。但是由于原數(shù)據(jù)庫節(jié)點(diǎn)包含了沒有清理完畢的垃圾數(shù)據(jù),路由到原數(shù)據(jù)庫節(jié)點(diǎn)的操作可能會操作部分垃圾數(shù)據(jù),因此需要將此操作的數(shù)據(jù)范圍限制在數(shù)據(jù)遷移后原數(shù)據(jù)庫節(jié)點(diǎn)應(yīng)有的范圍。
步驟S1005,路由模塊將數(shù)據(jù)庫操作語句下發(fā)到數(shù)據(jù)庫上執(zhí)行。
步驟S1006,路由模塊判斷數(shù)據(jù)清理是否完畢,如果未完畢,則進(jìn)入步驟S1001繼續(xù)監(jiān)控,否則結(jié)束數(shù)據(jù)庫操作語言的路由監(jiān)控。
綜上所述,通過本發(fā)明遷移服務(wù)器在進(jìn)行數(shù)據(jù)遷移的過程中同時(shí)監(jiān)控新的數(shù)據(jù)的讀 取和寫入操作,記錄將在新的節(jié)點(diǎn)上進(jìn)行的數(shù)據(jù)操作。等到數(shù)據(jù)操作完畢后,更新元數(shù)據(jù)信息時(shí)通知路由模塊停止原數(shù)據(jù)庫節(jié)點(diǎn)的讀寫操作。在數(shù)據(jù)導(dǎo)入導(dǎo)出的過程中不需要停止原數(shù)據(jù)庫節(jié)點(diǎn)的讀寫操作,只在更新元數(shù)據(jù)庫信息的時(shí)候停止讀寫操作。這樣系統(tǒng)在進(jìn)行數(shù)據(jù)遷移過程中不會影響系統(tǒng)的正常讀寫操作,從而實(shí)現(xiàn)分布式數(shù)據(jù)庫系統(tǒng)的實(shí)時(shí)平滑線性擴(kuò)容,提高系統(tǒng)性能,改善可用性。由于元數(shù)據(jù)信息的更新可以即時(shí)完成,因此數(shù)據(jù)庫節(jié)點(diǎn)停止服務(wù)的時(shí)間窗口減到最小,降低數(shù)據(jù)遷移過程對系統(tǒng)服務(wù)的影響。本發(fā)明適用于分布式關(guān)系型數(shù)據(jù)庫需要進(jìn)行數(shù)據(jù)的邏輯遷移操作的場合,如數(shù)據(jù)遷移、數(shù)據(jù)備份、數(shù)據(jù)庫擴(kuò)容等操作。
在另外一個(gè)實(shí)施例中,還提供了一種軟件,該軟件用于執(zhí)行上述實(shí)施例及優(yōu)選實(shí)施方式中描述的技術(shù)方案。
在另外一個(gè)實(shí)施例中,還提供了一種存儲介質(zhì),該存儲介質(zhì)中存儲有上述軟件,該存儲介質(zhì)包括但不限于:光盤、軟盤、硬盤、可擦寫存儲器等。
顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲在存儲裝置中由計(jì)算裝置來執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。