本發(fā)明涉及分布式內(nèi)存數(shù)據(jù)庫(kù)領(lǐng)域,尤其涉及一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的方法及系統(tǒng)。
背景技術(shù):
分布式內(nèi)存數(shù)據(jù)庫(kù)憑借其超高的內(nèi)存訪問速度,在電信計(jì)費(fèi)、實(shí)時(shí)在線交易等系統(tǒng)中有著廣泛的應(yīng)用,內(nèi)存數(shù)據(jù)通過切片方式均勻分布在各個(gè)單機(jī)內(nèi)存數(shù)據(jù)庫(kù)節(jié)點(diǎn)上,對(duì)外提供統(tǒng)一的數(shù)據(jù)服務(wù)。
隨著業(yè)務(wù)量的變化,分布式內(nèi)存數(shù)據(jù)庫(kù)可能需要?jiǎng)討B(tài)的增加節(jié)點(diǎn)以滿足數(shù)據(jù)量增長(zhǎng)的需求。
傳統(tǒng)技術(shù)中,一般會(huì)暫時(shí)停止分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù),將各節(jié)點(diǎn)原有的數(shù)據(jù)按照新的hash算法重新計(jì)算路由規(guī)則,并重新均勻分布在新的節(jié)點(diǎn)上,然后重新啟動(dòng)分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù)。由于涉及到海量數(shù)據(jù)的重新分布,耗時(shí)比較長(zhǎng),會(huì)導(dǎo)致分布式內(nèi)存數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間不能對(duì)外提供服務(wù)。
使用內(nèi)存數(shù)據(jù)庫(kù)服務(wù)的系統(tǒng),一般都是在線實(shí)時(shí)系統(tǒng),對(duì)實(shí)時(shí)性和事務(wù)一致性有著很高的要求,無法接受內(nèi)存數(shù)據(jù)庫(kù)服務(wù)長(zhǎng)時(shí)間中斷。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是:分布式內(nèi)存數(shù)據(jù)庫(kù)動(dòng)態(tài)的擴(kuò)展節(jié)點(diǎn)時(shí),涉及到海量數(shù)據(jù)的重新分布,會(huì)暫時(shí)停止分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù),耗時(shí)比較長(zhǎng),導(dǎo)致分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù)長(zhǎng)時(shí)間中斷,為解決上述技術(shù)問題,本發(fā)明提供了一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的方法及系統(tǒng)。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下:一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的方法,該方法包括以下步驟:
步驟1:新增節(jié)點(diǎn),根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系,生成新路由規(guī)則;
步驟2:讀取舊節(jié)點(diǎn)的數(shù)據(jù),將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
步驟3:讀取舊節(jié)點(diǎn)的redo日志,將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
步驟4:向應(yīng)用客戶端發(fā)送切換指令,應(yīng)用客戶端待redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
本發(fā)明的有益效果是:本發(fā)明采用路由對(duì)照表規(guī)則重新分布數(shù)據(jù),使遷移的數(shù)據(jù)量降低到最小程度;采用多階段數(shù)據(jù)遷移,在不停止對(duì)外服務(wù)的情況下,在線擴(kuò)展節(jié)點(diǎn),使應(yīng)用系統(tǒng)可以平滑的過渡,自動(dòng)路由到新節(jié)點(diǎn)上,本發(fā)明采用路由對(duì)照表方式,僅從舊節(jié)點(diǎn)遷移部分?jǐn)?shù)據(jù)到新節(jié)點(diǎn),即可使數(shù)據(jù)重新平均分布,降低了數(shù)據(jù)遷移規(guī)模,加快了遷移速度。
在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。
進(jìn)一步地,所述步驟1包括以下步驟:
步驟1.1:新增節(jié)點(diǎn);
步驟1.2:創(chuàng)建新的路由規(guī)則對(duì)照表;
步驟1.3:根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系。
進(jìn)一步地,所述步驟2包括以下步驟:
步驟2.1:記錄數(shù)據(jù)遷移開始時(shí)間點(diǎn)t;
步驟2.2:將新增節(jié)點(diǎn)添加到分布式內(nèi)存數(shù)據(jù)庫(kù)集群中;
步驟2.3:讀取所有舊節(jié)點(diǎn)數(shù)據(jù),所有舊節(jié)點(diǎn)同時(shí)在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn)。
進(jìn)一步地,所述步驟3包括以下步驟:
步驟3.1:從所述時(shí)間點(diǎn)t開始,讀取舊節(jié)點(diǎn)的redo日志;
步驟3.2:所有舊節(jié)點(diǎn)同時(shí)將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn)。
進(jìn)一步地,所述步驟4包括以下步驟:
步驟4.1:判斷待遷移的redo日志是否存在積壓,若是,則繼續(xù)執(zhí)行步驟3,若否,執(zhí)行步驟4.2;
步驟4.2:將分布式內(nèi)存數(shù)據(jù)庫(kù)置成中間狀態(tài),分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù)隱藏舊節(jié)點(diǎn)上與所述新路由規(guī)則不符的redo日志;
步驟4.3:向應(yīng)用客戶端發(fā)送切換指令,應(yīng)用客戶端待redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
采用上述進(jìn)一步技術(shù)方案的有益效果是:在數(shù)據(jù)遷移結(jié)束后,由于原有的舊節(jié)點(diǎn)上還存在冗余數(shù)據(jù),本發(fā)明根據(jù)新路由規(guī)則,隱藏那些本節(jié)點(diǎn)上與路由規(guī)則不符的記錄,可以確保對(duì)外提供的數(shù)據(jù)準(zhǔn)確性。
進(jìn)一步地,所述方法還包括步驟5:刪除舊節(jié)點(diǎn)冗余數(shù)據(jù)。
進(jìn)一步地,所述方法還包括步驟6:將分布式內(nèi)存數(shù)據(jù)庫(kù)由中間狀態(tài)改為正常狀態(tài)。
進(jìn)一步地,所述冗余數(shù)據(jù)為與新路由規(guī)則不符的數(shù)據(jù)。
本發(fā)明提供的另一種技術(shù)方案如下:一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的系統(tǒng),該系統(tǒng)包括路由規(guī)則生成模塊、數(shù)據(jù)遷移模塊、redo日志遷移模塊以及切換訪問模塊;
所述路由規(guī)則生成模塊用于新增節(jié)點(diǎn),根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系,生成新路由規(guī)則;
所述數(shù)據(jù)遷移模塊用于讀取舊節(jié)點(diǎn)的數(shù)據(jù),將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
所述redo日志遷移模塊用于讀取舊節(jié)點(diǎn)的redo日志,將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
所述切換訪問模塊用于向應(yīng)用客戶端發(fā)送切換指令,應(yīng)用客戶端待redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
進(jìn)一步地,所述系統(tǒng)還包括刪除模塊和狀態(tài)切換模塊;
所述刪除模塊用于刪除舊節(jié)點(diǎn)冗余數(shù)據(jù);
所述狀態(tài)切換模塊用于將分布式內(nèi)存數(shù)據(jù)庫(kù)由中間狀態(tài)改為正常狀態(tài)。
附圖說明
圖1為本發(fā)明一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的方法流程示意圖;
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
如圖1所示,為本發(fā)明實(shí)施例提供的一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的方法,該方法包括以下步驟:
步驟1:新增節(jié)點(diǎn),根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系,生成新路由規(guī)則;
步驟2:讀取舊節(jié)點(diǎn)的數(shù)據(jù),將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
步驟3:讀取舊節(jié)點(diǎn)的redo日志,將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
步驟4:向應(yīng)用客戶端發(fā)送切換指令,應(yīng)用客戶端待redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
其中,步驟1包括以下步驟:
步驟1.1:新增節(jié)點(diǎn);
步驟1.2:創(chuàng)建新的路由規(guī)則對(duì)照表:_t_hash_rules_new表,根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系,原則是盡量均勻,遷移量最小。
其中,步驟2包括以下步驟:
步驟2.1:記錄數(shù)據(jù)遷移開始時(shí)間點(diǎn)t;
步驟2.2:將新增節(jié)點(diǎn)添加到分布式內(nèi)存數(shù)據(jù)庫(kù)集群中;
步驟2.3:讀取所有舊節(jié)點(diǎn)數(shù)據(jù),所有舊節(jié)點(diǎn)同時(shí)在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn)。
其中,步驟3包括以下步驟:
步驟3.1:從所述時(shí)間點(diǎn)t開始,讀取舊節(jié)點(diǎn)的redo日志;
步驟3.2:所有舊節(jié)點(diǎn)同時(shí)將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn)。
其中,步驟4包括以下步驟:
步驟4.1:判斷待遷移的redo日志是否存在積壓,若是,則繼續(xù)執(zhí)行步驟3,若否,執(zhí)行步驟4.2;
步驟4.2:更新路由規(guī)則對(duì)照表,將分布式內(nèi)存數(shù)據(jù)庫(kù)置成中間狀態(tài),中間狀態(tài)即分布式內(nèi)存數(shù)據(jù)庫(kù)服務(wù)隱藏舊節(jié)點(diǎn)上與所述新路由規(guī)則不符的redo日志;
步驟4.3:向應(yīng)用客戶端發(fā)送切換指令,提示應(yīng)用重新加載路由規(guī)則,此時(shí),應(yīng)用如果訪問舊節(jié)點(diǎn),仍然是正常的,如果訪問新節(jié)點(diǎn),則只能等待,應(yīng)用客戶端待積壓的redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
在上述過程中,涉及遷移的數(shù)據(jù)及redo日志記錄在新舊節(jié)點(diǎn)上都有一份,因此在多節(jié)點(diǎn)并發(fā)查詢時(shí),會(huì)造成查詢結(jié)果不正確(數(shù)據(jù)是冗余的)。
而刪除這些記錄需要較長(zhǎng)時(shí)間,應(yīng)用也不可能長(zhǎng)時(shí)間等待。因此需要提前隱藏掉這些冗余數(shù)據(jù),方法如下:
創(chuàng)建一張新表_t_alter_node,在更新路由規(guī)則對(duì)照表之前,將新增加的節(jié)點(diǎn)插入到這張表。
分布式內(nèi)存數(shù)據(jù)庫(kù)在對(duì)外提供數(shù)據(jù)服務(wù)時(shí),檢查此表是否有數(shù)據(jù),如果沒有,按照正常的邏輯執(zhí)行。如果有數(shù)據(jù)時(shí),則校驗(yàn)待查記錄是否符合新規(guī)則,如果不符合則隱藏。
然后,將舊節(jié)點(diǎn)的冗余數(shù)據(jù)逐條刪除。刪除完畢,清空_t_alter_node表。
待redo日志動(dòng)態(tài)遷移量變成0時(shí),將分布式內(nèi)存數(shù)據(jù)庫(kù)由中間狀態(tài)改為正常狀態(tài)。
此時(shí),分布式內(nèi)存數(shù)據(jù)庫(kù)在對(duì)外提供數(shù)據(jù)服務(wù)時(shí),自然恢復(fù)到正常邏輯,擴(kuò)展結(jié)束。
其中,冗余數(shù)據(jù)為與新路由規(guī)則不符的數(shù)據(jù)。
本發(fā)明實(shí)施例提供了一種分布式內(nèi)存數(shù)據(jù)庫(kù)在線擴(kuò)展節(jié)點(diǎn)的系統(tǒng),該系統(tǒng)包括路由規(guī)則生成模塊、數(shù)據(jù)遷移模塊、redo日志遷移模塊以及切換訪問模塊;
路由規(guī)則生成模塊用于新增節(jié)點(diǎn),根據(jù)新增節(jié)點(diǎn)重新規(guī)劃路由對(duì)應(yīng)關(guān)系,生成新路由規(guī)則;
數(shù)據(jù)遷移模塊用于讀取舊節(jié)點(diǎn)的數(shù)據(jù),將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的數(shù)據(jù)從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
redo日志遷移模塊用于讀取舊節(jié)點(diǎn)的redo日志,將在新路由規(guī)則下屬于新增節(jié)點(diǎn)的redo日志從舊節(jié)點(diǎn)遷移到對(duì)應(yīng)的新增節(jié)點(diǎn);
切換訪問模塊用于向應(yīng)用客戶端發(fā)送切換指令,應(yīng)用客戶端待redo日志遷移完成后,在新路由規(guī)則下訪問分布式內(nèi)存數(shù)據(jù)庫(kù)。
其中,該系統(tǒng)還包括刪除模塊和狀態(tài)切換模塊;
刪除模塊用于刪除舊節(jié)點(diǎn)冗余數(shù)據(jù);
狀態(tài)切換模塊用于將分布式內(nèi)存數(shù)據(jù)庫(kù)由中間狀態(tài)改為正常狀態(tài)。
簡(jiǎn)單的路由對(duì)照表包含兩列,一列是hash值(,一列是負(fù)責(zé)這個(gè)hash值的節(jié)點(diǎn)。假定hash桶值為12(實(shí)際可配,比如是1024,要求遠(yuǎn)大于節(jié)點(diǎn)數(shù)),初始有3(m個(gè))個(gè)節(jié)點(diǎn),后續(xù)擴(kuò)展時(shí)需要再增加1個(gè)(n個(gè))節(jié)點(diǎn):
表1路由對(duì)照表示例
增加節(jié)點(diǎn)后,指定hash值為3、7、11的記錄需要遷移到新添加節(jié)點(diǎn)上??傮w遷移數(shù)據(jù)量為n/(m+n),這種方法可以使遷移量最小,從而縮短遷移時(shí)間,降低對(duì)應(yīng)用系統(tǒng)的影響。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。