off),其中buf為用戶空間緩存區(qū)指針,指向?qū)憯?shù)據(jù)的 起始地址;cnt為寫數(shù)據(jù)塊的大??;off是偏移量,是用戶數(shù)據(jù)寫入設(shè)備文件的起始位置。
[0042] 發(fā)送線程創(chuàng)建一個(gè)發(fā)送緩存區(qū)數(shù)組,記作bUfsend[M],其中M為大于1的正整數(shù), 緩存區(qū)bufsend[i] (0 <i〈M)的大小等于存儲(chǔ)集群的條塊大小,記為STSize。
[0043] 緩存區(qū)bufsend[i]緩存的字節(jié)數(shù)記為filled[i],空閑字節(jié)數(shù)為empty[i],有 filled[i]+empty[i] =STSize成立。
[0044] 發(fā)送線程首先從bUfsend[M]中獲得空閑緩存區(qū)bUfsend[i](沒有則等待),對(duì)于 bufsend[i],初始empty[i]為STSize,filled[i] = 0,然后按如下流程處理寫請(qǐng)求隊(duì)列中 的寫請(qǐng)求。
[0045] 緩存區(qū)bUfsend[i]填滿后,發(fā)送線程就會(huì)將其中的數(shù)據(jù)發(fā)送給存儲(chǔ)集群,由此實(shí) 現(xiàn)了對(duì)存儲(chǔ)集群條塊的整體寫入。由于對(duì)條塊的寫入始終是連續(xù)的,避免了隨機(jī)寫操作所 需的尋址。為了保證應(yīng)用程序重啟后bufsend[i]寫入的數(shù)據(jù)仍然與存儲(chǔ)集群的條塊邊界 對(duì)齊,對(duì)齊驅(qū)動(dòng)程序需要監(jiān)控應(yīng)用程序?qū)υO(shè)備文件的打開與關(guān)閉操作,進(jìn)行現(xiàn)場(chǎng)保護(hù)與恢 復(fù)。
[0046] 當(dāng)應(yīng)用程序關(guān)閉設(shè)備文件、發(fā)送線程最后一次向存儲(chǔ)集群寫數(shù)據(jù)時(shí),緩存區(qū) bUfsend[i]可能沒有填滿,因此bUfsend[i]中的數(shù)據(jù)寫入存儲(chǔ)集群的同時(shí),需要記錄本次 寫操作的off和cnt值;當(dāng)設(shè)備文件再次打開時(shí),需要根據(jù)記錄的off和cnt值,進(jìn)行現(xiàn)場(chǎng) 恢復(fù),然后進(jìn)入正常的寫請(qǐng)求處理流程。
[0047] 進(jìn)一步地,本發(fā)明的存儲(chǔ)集群在滿足性能需求的前提下,通過降低存儲(chǔ)集群的并 行性,即采用局部并行策略,并實(shí)現(xiàn)降耗,其實(shí)現(xiàn)主要包括:數(shù)據(jù)布局、數(shù)據(jù)調(diào)度、緩存管理 策略。
[0048] 本發(fā)明的存儲(chǔ)集群由N塊邏輯磁盤組成且N多3,構(gòu)成1行XN列矩陣。將集群劃 分為N個(gè)條塊,每個(gè)條塊包含N個(gè)存儲(chǔ)塊,其中1個(gè)校驗(yàn)塊,N-I個(gè)數(shù)據(jù)塊。每個(gè)存儲(chǔ)塊劃 分多個(gè)存儲(chǔ)子塊,可根據(jù)要求設(shè)置子塊的大小,典型值如4KB、8KB、16KB等,子塊內(nèi)數(shù)據(jù)的 邏輯地址是順序的。校驗(yàn)子塊由同條塊內(nèi)偏移位置相同的N-I個(gè)數(shù)據(jù)子塊異或運(yùn)算得出。
[0049] 用X(i,j)表示存儲(chǔ)集群中的一個(gè)存儲(chǔ)塊數(shù)據(jù),其中i表示其所在的條塊號(hào),j表 示所在的磁盤號(hào),x(i,j)位于磁盤j上,0 <i,j〈N。第i條塊內(nèi)的校驗(yàn)塊數(shù)據(jù)用Check(i) 表示,與存儲(chǔ)塊數(shù)據(jù)X(i,j)的關(guān)系為Check(i) =X(i,N-l-i)。數(shù)據(jù)塊數(shù)據(jù)用D(i,v)表 示,V表示其在所屬條塊內(nèi)的數(shù)據(jù)塊序號(hào)(忽略校驗(yàn)塊),〇 <i,KN-I,與存儲(chǔ)塊數(shù)據(jù)X(i, j)的關(guān)系,用式⑴表示:
[0050]D(i,V) =X(i,V),i+v〈N_l
[0051] X(i,v+1),i+v彡N-I(I)
[0052] 為了能夠提供合適的性能,需要對(duì)數(shù)據(jù)塊進(jìn)行分組,方案如下:將每個(gè)條塊上的 N-I個(gè)數(shù)據(jù)塊分成P組,每組包含Q個(gè)數(shù)據(jù)塊,其中P彡2,Q彡1,且滿足P?Q=N-I。在 各個(gè)組內(nèi),采用并行數(shù)據(jù)編址方法,編址單位為數(shù)據(jù)子塊,編址方法如下:設(shè)組大小為S&p, 第P組、第i條塊、第q數(shù)據(jù)塊內(nèi)、偏移地址為off的數(shù)據(jù)子塊的邏輯地址LBAp,i, 可表 示為
[0053] LBApjijqj0ff=Scrp ?(N?p+i)+off?Q+q(2)
[0054] 其中 0 彡p〈P,0 彡i〈N,0 彡q〈Q,0 彡off〈SGrp。
[0055] 根據(jù)式(2)得本發(fā)明的存儲(chǔ)集群的數(shù)據(jù)布局具有如下特征:(1)各組內(nèi)偏移地址 相同的數(shù)據(jù)子塊的邏輯地址相鄰;(2)邏輯相鄰的組優(yōu)先分布在相同或相近的磁盤上。
[0056] 為實(shí)現(xiàn)降耗,需要根據(jù)請(qǐng)求隊(duì)列的歷史信息、讀寫訪問在邏輯空間的分布區(qū)域,感 知當(dāng)前負(fù)載流的隨機(jī)性及其時(shí)間空間分布特征,從而進(jìn)行磁盤調(diào)度。
[0057] 用r= (tmive,tfinish,status,pos,Ien)記錄請(qǐng)求隊(duì)列rq中的1個(gè)讀寫請(qǐng)求,其 中tmive,tfinish,status,pos,Ien分別表示請(qǐng)求r的到來時(shí)間、完成時(shí)間、請(qǐng)求狀態(tài)、起始邏 輯地址和請(qǐng)求長(zhǎng)度。請(qǐng)求狀態(tài)包括等待、執(zhí)行、完成等狀態(tài),請(qǐng)求長(zhǎng)度以分區(qū)為單位,用r.X 表示請(qǐng)求r的參數(shù)x。
[0058] 由請(qǐng)求r的邏輯地址pos到磁盤號(hào)j的映射f(r.pos),可以按以下方法獲得:
[0059] (1)由pos利用下式得出該請(qǐng)求所在的組號(hào)p、組內(nèi)塊號(hào)q及條塊號(hào)i:
[0060] p=r.pos/SGrp ?N
[0061] q= (r.pos)MODQ
[0062] i= (r.pos)M0D(SGrp ?N)/SGrp
[0063] (2)根據(jù)組號(hào)p、組內(nèi)塊號(hào)q、條塊號(hào)i,得出pos指向的數(shù)據(jù)塊數(shù)據(jù)D(i,p?〇+(!);
[0064] (3)已知D(i,p,Q+q),根據(jù)式⑴得pos所在磁盤j=p,Q+q,當(dāng)i+p-Q+qa-l; 否則j=P?Q+q+1。
[0065] 對(duì)請(qǐng)求隊(duì)列rq中各個(gè)讀寫請(qǐng)求,根據(jù)其邏輯地址所在的磁盤,劃分為N個(gè)集合:
[0066] Sj= {r|rGrq八f(r.pos) =j},其中0彡j〈N,稱Sj為磁盤j的請(qǐng)求集合,用 nunij表示集合Sj中元素的個(gè)數(shù)。
[0067] 設(shè)定磁盤調(diào)度的時(shí)間閾值tth,系統(tǒng)當(dāng)前時(shí)間為t,如果請(qǐng)求集合Sj中的請(qǐng)求滿足 下式,則可以調(diào)度對(duì)應(yīng)的磁盤j到待機(jī)狀態(tài):
【主權(quán)項(xiàng)】
1. 一種數(shù)據(jù)云端存儲(chǔ)方法,其特征在于,包括: 通過存儲(chǔ)集群的區(qū)段映射進(jìn)行地址轉(zhuǎn)換,將應(yīng)用程序發(fā)來的非順序的讀寫請(qǐng)求地址 映射到連續(xù)的實(shí)際地址空間以實(shí)現(xiàn)連續(xù)寫入,利用基于緩存的存儲(chǔ)集群寫優(yōu)化存儲(chǔ)架構(gòu), 在緩存中緩存并構(gòu)造與存儲(chǔ)集群條塊對(duì)齊的寫數(shù)據(jù),以整個(gè)條塊的方式將數(shù)據(jù)寫入存儲(chǔ)集 群。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述通過存儲(chǔ)集群的區(qū)段映射進(jìn)行地址 轉(zhuǎn)換,進(jìn)一步包括: 將應(yīng)用程序發(fā)來的非順序的虛擬地址映射為連續(xù)的存儲(chǔ)集群實(shí)際物理地址,定義映射 元數(shù)據(jù)、映射存儲(chǔ)區(qū),并記錄映射關(guān)系到地址轉(zhuǎn)換表,以每次寫操作的寫區(qū)段為單位進(jìn)行地 址映射; 其中所述映射元數(shù)據(jù)描述一個(gè)映射區(qū)段的映射元數(shù)據(jù),形式為(ViStart,PiStart,Leni,next),Vistart,Pistart,Leni,next分別為映射區(qū)段i的虛擬起始地址、物理起始地址區(qū)段長(zhǎng)度 和相鄰映射元數(shù)據(jù)索引; 所述映射存儲(chǔ)區(qū)是外存中映射元數(shù)據(jù)的存儲(chǔ)區(qū)段; 所述地址轉(zhuǎn)換表記錄每個(gè)虛擬地址對(duì)應(yīng)的元數(shù)據(jù)索引和外存數(shù)據(jù)結(jié)構(gòu); 在進(jìn)行地址轉(zhuǎn)換時(shí),先根據(jù)虛擬地址從地址轉(zhuǎn)換表獲得元數(shù)據(jù)索引,然后在映射存儲(chǔ) 區(qū)由索引值獲得元數(shù)據(jù),并根據(jù)元數(shù)據(jù)進(jìn)行區(qū)段地址轉(zhuǎn)換,從虛擬區(qū)段(Vstart,VEnd)中的 Vstart到VEnd,其中Vstart為虛擬區(qū)段的虛擬起始地址,ViEnd為虛擬區(qū)段的虛擬結(jié)束地址,根據(jù) 虛擬地址逐個(gè)查詢。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括:利用LSM樹進(jìn)行映射區(qū)段查詢, 在內(nèi)存中建立映射元數(shù)據(jù)的LSM樹,用(ViStart,ViEnd,pimrta)表示葉子節(jié)點(diǎn),Vstart為區(qū)段i 的虛擬起始地址,ViEnd為區(qū)段i的虛擬結(jié)束地址,pinreta是指向元數(shù)據(jù)(Vistart,Pistart,Leni, next)的已讀入內(nèi)存的指針; 父節(jié)點(diǎn)的關(guān)鍵字是所有子樹中的最大關(guān)鍵字,每個(gè)葉子節(jié)點(diǎn)只包含兩個(gè)關(guān)鍵字,表示 一個(gè)順序區(qū)段,查找時(shí),如果被查找值位于某個(gè)區(qū)段則查找成功,否則可由其父節(jié)點(diǎn)的關(guān)鍵 字確定其相鄰區(qū)段,映射按虛擬地址由低到高的順序排列在鏈表中; 并且,利用LSM樹查詢映射區(qū)段的過程如下: 1) 分別查找Vkstart,VkEnd在LSM樹中的位置,其中區(qū)段(Vkstart,VkEnd)為請(qǐng)求k的虛擬地 址區(qū)段; 2) 將Vkstart,VkEnd之間所有存在的映射作為要查找的映射; 設(shè)定LSM樹的最大節(jié)點(diǎn)數(shù),當(dāng)超過該最大節(jié)點(diǎn)數(shù)時(shí)便構(gòu)建一棵新的LSM樹,查找時(shí)先根 據(jù)虛擬地址確定所在的LSM樹再進(jìn)行查找。
【專利摘要】本發(fā)明提供了一種數(shù)據(jù)云端存儲(chǔ)方法,該方法包括:通過存儲(chǔ)集群的區(qū)段映射進(jìn)行地址轉(zhuǎn)換,將應(yīng)用程序發(fā)來的非順序的讀寫請(qǐng)求地址映射到連續(xù)的實(shí)際地址空間以實(shí)現(xiàn)連續(xù)寫入,利用基于緩存的存儲(chǔ)集群寫優(yōu)化存儲(chǔ)架構(gòu),在緩存中緩存并構(gòu)造與存儲(chǔ)集群條塊對(duì)齊的寫數(shù)據(jù),以整個(gè)條塊的方式將數(shù)據(jù)寫入存儲(chǔ)集群。本發(fā)明提出了一種存儲(chǔ)方法,在寫入磁盤過程中避免了因生成校驗(yàn)數(shù)據(jù)而產(chǎn)生的額外讀寫開銷,通過數(shù)據(jù)的順序?qū)懭胗行p少了尋址操作,提高了存儲(chǔ)性能。
【IPC分類】G06F3-06
【公開號(hào)】CN104765574
【申請(qǐng)?zhí)枴緾N201510195848
【發(fā)明人】楊立波
【申請(qǐng)人】成都博元時(shí)代軟件有限公司
【公開日】2015年7月8日
【申請(qǐng)日】2015年4月23日