分布式數(shù)據(jù)庫中子表分裂的方法、子表節(jié)點和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,尤其涉及一種分布式數(shù)據(jù)庫中子表分裂方法、子表節(jié)點 和系統(tǒng)。
【背景技術(shù)】
[0002] 在大多數(shù)分布式數(shù)據(jù)庫中,通常采用KeyValue類型的存儲方式,即將用戶需要存 儲的數(shù)據(jù)存放在Value部分,構(gòu)建與Value對應(yīng)的Key,當(dāng)用戶需要查找Value時,通過Key 索引查找對應(yīng)的Value。在數(shù)據(jù)存儲時,是按照Key的字典順序自然排序的。
[0003] 數(shù)據(jù)存儲在用戶創(chuàng)建的相應(yīng)用戶表(Table)。一個Table中可以存儲大量的數(shù)據(jù), 為了方便分布式管理和維護,可以按照記錄的Key值的字典順序切割生成一個或多個子表 (Region),每個Region是一個Key區(qū)間數(shù)據(jù)的集合,也可以說是連續(xù)行數(shù)據(jù)的集合。每個 KeyValue所對應(yīng)的Key只包括在一個Region區(qū)間。例如圖1所示,圖1為一個用戶表中 子表的示意圖,其中,圖1中Region-Ι中的Key-A代表著在字典順序上一個無窮小的值, Region-M中的Key-Y代表著在字典順序上一個無窮大的值。
[0004] 目前,子表的分裂分為兩種形式:第一,在建表初期,預(yù)設(shè)定分裂點(Split Points),子表會按照預(yù)設(shè)定的分裂點生成新的子表。例如:建表時建立Region[Key-A, Key-Y),預(yù)設(shè)定的分裂點為{B, C,......X}, Region[Key_A,Key-Υ)會按照預(yù)設(shè)定的分裂點 自動生成多個子表:Region-1 [Key-A,Key-B),Region2[Key_B,Key-C),Region3[Key_C, Key-D),......RegionM[Key-X,Key_Y),如圖2所示。第二,當(dāng)子表中存儲的數(shù)據(jù)達到一定內(nèi) 存時,會自動分為兩個子表,或者通過用戶手動觸發(fā)子表分裂。例如:如圖3所示,圖3為 一個子表分裂為兩個子表的不意圖,分別將Region [,C),Region [C, E),Region [E, G),......, Region [X,)分裂為兩個子表,依次分裂為 Region [,B)、Region [B, C),Region [C, D)、 Region [D, E),Region [E, F)、Region [F, G),......,Region [X,Y)、Region [Y, Z)。當(dāng)一個用戶 表中包括多個子表時,也可以按照第二種分裂方式將子表進行分裂,以提高讀寫數(shù)據(jù)的性 能。
[0005] 但是,如果在建表初期預(yù)設(shè)定的分裂點不合理,例如在建表時確定的分裂點為 {a, b, c, d, e, f},基于這些分裂點的子表為(_ °°,a),[a, b),[b, c),[c, d),[d, e),[e, f), [f,+ 0 )。運行一段時間之后,發(fā)現(xiàn)原來的分裂點是不合理的,更加合理的分裂點應(yīng)該為 {g,h,i,j,k,1,m},而原來的子表中又已經(jīng)存在用戶數(shù)據(jù)了,此時對子表進行分裂,讀取一 個文件中的數(shù)據(jù),然后存放到兩個或多個文件中,子表分裂速度慢,且讀寫數(shù)據(jù)的性能較 差,如果將子表分裂的越多,讀寫數(shù)據(jù)的性能會越差,且分裂后的子表也依然會造成數(shù)據(jù)分 布不均勻的問題。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明實施例提供一種分布式數(shù)據(jù)庫中子表分裂的方法、子表節(jié)點和系統(tǒng),通過 在用戶表中預(yù)留一個子表,該子表在當(dāng)前數(shù)據(jù)存儲時保持為空子表。當(dāng)需要將數(shù)據(jù)存儲到 該子表中時,將該子表進行分裂,以實現(xiàn)用戶表中子表的快速多點分裂,提升用戶表的讀寫 性能。
[0007] -方面,本申請的實施例提供一種分布式數(shù)據(jù)庫中子表分裂的方法,當(dāng)數(shù)據(jù)按照 鍵-值類型存儲的方式進行存儲時,根據(jù)預(yù)設(shè)條件,例如業(yè)務(wù)類型,預(yù)估計當(dāng)前業(yè)務(wù)類型存 儲數(shù)據(jù)的Key值范圍,設(shè)置空子表,該空子表為存儲新的鍵-值類型的數(shù)據(jù)預(yù)留的空表,即 當(dāng)前存儲的數(shù)據(jù)不會存儲在該空表中。該方法包括:當(dāng)以鍵-值類型存儲的數(shù)據(jù)需要存儲 到空子表中時,接收子表分裂命令,該子表分裂命令可以為用戶調(diào)用的一個接口或者一個 命令,該子表分裂命令中包括空子表分裂的分裂點信息。根據(jù)子表分裂命令將狀態(tài)表中 記錄的空子表的狀態(tài)標(biāo)識為不再提供讀寫服務(wù),也可以理解為不支持提供讀寫服務(wù)。根據(jù) 空子表分裂點的信息,將空子表分裂為兩個或者兩個以上的新子表,并將狀態(tài)表中記錄的 新生成的子表的狀態(tài)標(biāo)識為可提供讀寫服務(wù),可理解為支持提供讀寫服務(wù)。并指示將新生 成的子表存儲的子表節(jié)點(或存儲節(jié)點)的位置信息記錄在元數(shù)據(jù)表中,以便于用戶根據(jù) 元數(shù)據(jù)表中記錄的新生成子表所在的子表節(jié)點的位置信息,獲取存儲在新生成子表中的數(shù) 據(jù)。
[0008] 基于上述方案,通過在用戶表中預(yù)留一個子表,該子表在當(dāng)前數(shù)據(jù)存儲時保持為 空子表。當(dāng)需要將數(shù)據(jù)存儲到該子表中時,將該子表進行分裂,分裂完成之后再存入數(shù)據(jù), 實現(xiàn)了用戶表中子表的快速多點分裂,提升了用戶表的讀寫性能。
[0009] 在一個可能的設(shè)計中,當(dāng)接收到子表分裂命令時,向共享狀態(tài)機發(fā)送一個可以表 征空子表開始分裂的信息。當(dāng)共享狀態(tài)機接收到該信息時,將記錄的空子表的狀態(tài)標(biāo)識為 空子表開始分裂,以明確該子表的服務(wù)狀態(tài),避免向該空子表中寫入數(shù)據(jù),造成數(shù)據(jù)丟失。
[0010] 在另一個可能的設(shè)計中,當(dāng)子表分裂完成之后,向共享狀態(tài)機發(fā)送可以表征空子 表完成分裂的信息。當(dāng)共享狀態(tài)機接收到該信息時,將記錄的空子表的狀態(tài)標(biāo)識為空子表 分裂完成,以明確該空子表的狀態(tài),以禁止向該空子表中寫入數(shù)據(jù),造成數(shù)據(jù)丟失。
[0011] 在又一個可能的設(shè)計中,當(dāng)空子表分裂為至少兩個新子表時,指示更新元數(shù)據(jù)表 中空子表的狀態(tài)為不支持提供可讀寫服務(wù),便于通過查詢元數(shù)據(jù)表獲取該空子表的服務(wù)狀 態(tài),以用于在后續(xù)存儲空間清理中,刪除該空子表的信息。
[0012] 另一方面,本申請的實施例提供一種子表節(jié)點,當(dāng)數(shù)據(jù)按照鍵-值類型的存儲方 式進行數(shù)據(jù)存儲時,根據(jù)預(yù)設(shè)條件,例如存儲數(shù)據(jù)的業(yè)務(wù)類型,預(yù)估計存儲數(shù)據(jù)的Key值的 范圍,設(shè)置空子表,即當(dāng)前存儲的數(shù)據(jù)不會存儲在該空子表中。該子表節(jié)點包括接收單元、 更新單元、分裂單元和記錄單元。當(dāng)新的鍵-值類型的數(shù)據(jù)需要存儲在空子表中時,接收單 元接收子表分裂命令,該子表分裂命令可以為用戶調(diào)用的一個接口或者一個命令,該命令 包括空子表分裂點信息。更新單元根據(jù)子表分裂命令將狀態(tài)表中的空子表的狀態(tài)標(biāo)識為不 再提供讀寫服務(wù),即不支持提供讀寫服務(wù)。分裂單元根據(jù)分裂點信息,將空子表分裂成兩個 或者兩個以上的新子表,并將新子表的狀態(tài)標(biāo)識為可提供讀寫服務(wù),可理解為支持提供讀 寫服務(wù)。指示記錄單元將新子表所在的子表節(jié)點(或存儲節(jié)點)的位置信息記錄在元數(shù)據(jù) 表中,以便于通過查詢元數(shù)據(jù)表中記錄的新子表的位置信息,獲取存儲在新子表中的數(shù)據(jù)。
[0013] 基于上述方案,通過在用戶表中預(yù)留一個子表,該子表在當(dāng)前數(shù)據(jù)存儲時保持為 空子表。當(dāng)需要將數(shù)據(jù)存儲到該子表中時,將該子表進行分裂,分裂完成之后再存入數(shù)據(jù), 實現(xiàn)了用戶表中子表的快速多點分裂,提升了用戶表的讀寫性能。
[0014] 在一個可能的設(shè)計中,該表節(jié)點還包括發(fā)送單元,用于向共享狀態(tài)機發(fā)送表征空 子表開始分裂的信息。當(dāng)共享狀態(tài)機接收到該信息時,將空子表的狀態(tài)標(biāo)識為開始分裂,以 避免向該空子表中寫入數(shù)據(jù),造成數(shù)據(jù)丟失。
[0015] 在另一個可能的設(shè)計中,當(dāng)子表分裂完成之后,發(fā)送單元向共享狀態(tài)機發(fā)送可以 表征空子表完成分裂的信息。當(dāng)共享狀態(tài)機接收到該信息時,將記錄的空子表的狀態(tài)標(biāo) 識為空子表分裂完成,以明確該空子表的狀態(tài),以禁止向該空子表中寫入數(shù)據(jù),造成數(shù)據(jù)丟 失。
[0016] 在又一個可能的設(shè)計中,指示更新單元將元數(shù)據(jù)表中的空子表的狀態(tài)標(biāo)識為不支 持提供讀寫服務(wù),便于通過查詢元數(shù)據(jù)表獲取該空子表的服務(wù)狀態(tài),以用于在后續(xù)存儲空 間清理中,刪除該空子表的信息。
[0017] 再一方面,本申請實施例提供一種系統(tǒng),該系統(tǒng)包括多個管理節(jié)點和共享狀態(tài)機, 多個管理節(jié)點可以管理一個或者多個另一方面中的子表節(jié)點,以用于數(shù)據(jù)按照鍵-值類型 的存儲方式存儲時,根據(jù)預(yù)設(shè)條件,設(shè)置第一子表,所述第一子表是指為存儲新的鍵-值 類型的數(shù)據(jù)而預(yù)留的空表;當(dāng)所述新的鍵-值類型的數(shù)據(jù)需要存儲到所述第一子表時,通 過所述至少一個子表節(jié)點、所述多個管理節(jié)點和所述共享狀態(tài)機完成對所述第一子表的分 裂。
[0018] 本申請?zhí)峁┑姆植际綌?shù)據(jù)庫中子表分裂的方法、子表節(jié)點和系統(tǒng),通過在用戶表 中預(yù)留一個子表,該子表在當(dāng)前數(shù)據(jù)存儲時保持為空子表。