系統(tǒng)塊有head部分存儲meta數(shù)據(jù)。除去meta的數(shù)據(jù)區(qū)由兩個部分組成:鍵區(qū)(Key store area)程序加載的時候,可以直接從鍵區(qū)加載出bucket的index ;值區(qū)(Value store area)只存儲對應的值列表(valuelist)ο
[0041]可以看到是根據(jù)鍵(key)來做系統(tǒng)塊內(nèi)部的索引,這里直接使用映射地圖(hashmap)作為索引的查找結構,根據(jù)鍵的64位映射編碼(hash code)來定位到索引中。默認系統(tǒng)塊內(nèi)部的索引都下載進入了內(nèi)存中。
[0042]可以看出,鍵值各自區(qū)域大小的設定非常重要,若將鍵值空間比設置成為固定值,將造成極大的資源浪費。
[0043]在存入數(shù)據(jù)之前,會將系統(tǒng)塊預先劃分鍵區(qū)和值區(qū),在存入數(shù)據(jù)后,實際占用的鍵區(qū)和值區(qū)的比值可能會不同于預先劃分的鍵值空間比,所述理想鍵值空間比為實際存入鍵區(qū)的數(shù)據(jù)占用空間的比值。
[0044]可以理解的是,所述選定系統(tǒng)塊可以是一個或者多個系統(tǒng)塊,可以將一個工作表占用的系統(tǒng)塊作為選定系統(tǒng)塊,因為一個工作表往往對應相同的鍵值空間比。
[0045]在具體實施中,所述數(shù)據(jù)庫還可以包括系統(tǒng)塊索引,所述系統(tǒng)塊索引關聯(lián)鍵值和系統(tǒng)塊;所述選定系統(tǒng)塊可以是與同一所述系統(tǒng)塊索引關聯(lián)的兩個所述系統(tǒng)塊。
[0046]系統(tǒng)塊索引可以包括在一個表(table)內(nèi),代表一種資源隔離。在一個table中包含多個表片(table slot),根據(jù)key映射到各個table slot當中,table slot可以掛載系統(tǒng)塊,從而通過系統(tǒng)塊索引可以實現(xiàn)鍵值和系統(tǒng)塊的關聯(lián)。
[0047]和大多關系型數(shù)據(jù)庫類似,有表的元信息可以方便查詢和修改。為了保持簡潔的設計和性能,實現(xiàn)了模式自由(schema free),應用層如果自己有需要,可以設計一些簡易的格式協(xié)議來進行存儲,而且性能不會有明顯的損失。
[0048]在table中對數(shù)據(jù)進行了分片處理,table slot代表每一個分片。每個tableslot中會掛載一個或多個系統(tǒng)塊,在表創(chuàng)立的時候,會根據(jù)初始化的table slot數(shù)目來選擇加載系統(tǒng)塊的數(shù)量,默認為每個slot加載一個系統(tǒng)塊。Table slot是一個邏輯存儲的單元,對于未來的數(shù)據(jù)迀移和并發(fā)操作都是一個必要的設計。
[0049]通過查找存儲于內(nèi)存中的系統(tǒng)塊索引,可以快速的判斷數(shù)據(jù)是否存在及數(shù)據(jù)存在的位置,從而節(jié)省檢索時間,提升系統(tǒng)效率。
[0050]當所述選定系統(tǒng)塊是與同一所述系統(tǒng)塊索引關聯(lián)的兩個所述系統(tǒng)塊時,可以對系統(tǒng)塊進行整理,節(jié)省系統(tǒng)空間。
[0051]S12,選取空閑系統(tǒng)塊,對該空閑系統(tǒng)塊按照理想鍵值空間比劃分鍵區(qū)和值區(qū)。
[0052]空閑系統(tǒng)塊指當前沒有存儲數(shù)據(jù)的系統(tǒng)塊,對該空閑系統(tǒng)塊按照理想鍵值空間預先劃分鍵區(qū)和值區(qū),便于最大化利用該系統(tǒng)塊的資源。
[0053]在具體實施中,在步驟S12之前,還可以對所述選定系統(tǒng)塊內(nèi)部的鍵區(qū)空間與值區(qū)空間的比值也就是鍵值空間比進行判斷,當選定系統(tǒng)塊的鍵值空間比不同于所述理想鍵值空間比時,執(zhí)行步驟S12。
[0054]S13,將所述選定系統(tǒng)塊存儲的鍵值數(shù)據(jù)復制到該空閑系統(tǒng)塊。
[0055]由于理想鍵值比是根據(jù)所述選定系統(tǒng)塊中存儲的鍵值數(shù)據(jù)占用空間的比例確定的,該空閑系統(tǒng)塊預先劃分鍵區(qū)和值區(qū)時是按照理想鍵值比劃分的,從而將所述選定系統(tǒng)塊存儲的鍵值數(shù)據(jù)復制到該空閑系統(tǒng)塊,使得預先劃分的鍵值比例與實際存儲鍵值數(shù)據(jù)所占空間的比例匹配,避免存儲空間的資源浪費。
[0056]在具體實施中,在所述將所述選定系統(tǒng)塊存儲的鍵值數(shù)據(jù)復制到該空閑系統(tǒng)塊時,對所述選定系統(tǒng)塊讀鎖定,其他線程可以在復制過程中正常對所述選定系統(tǒng)塊進行讀操作,而不必等待復制過程的結束,從而可以減少等待時間,進而可以提升數(shù)據(jù)庫整體的操作效率。
[0057]S14,更新元信息中所述空閑系統(tǒng)塊的標識號為所述選定系統(tǒng)塊的標識號。
[0058]元信息即是head部分存儲meta數(shù)據(jù),將所述空閑系統(tǒng)塊的標識號更新為所述選定系統(tǒng)塊的標識號,可以利用所述空閑系統(tǒng)塊代替所述選定系統(tǒng)塊。
[0059]S15,將內(nèi)存中指向所述選定系統(tǒng)塊的指針指向所述空閑系統(tǒng)塊。
[0060]將內(nèi)存中指向所述選定系統(tǒng)塊的指針指向所述空閑系統(tǒng)塊后,所述空閑系統(tǒng)塊對存儲系統(tǒng)來說,已經(jīng)替代所述選定系統(tǒng)塊。
[0061 ] 在具體實施中,在所述將內(nèi)存中指向所述選定系統(tǒng)塊的指針指向所述空閑系統(tǒng)塊時,對所述選定系統(tǒng)塊讀寫鎖定。僅在指針swap的瞬間進行讀寫鎖定,大大減小了對并發(fā)讀操作的影響。
[0062]S16,釋放所述選定系統(tǒng)塊。
[0063]釋放所述選定系統(tǒng)塊后,對數(shù)據(jù)庫系統(tǒng)來說,獲取了更多的存儲資源。
[0064]在具體實施中,當所述選定系統(tǒng)塊存儲的數(shù)據(jù)屬于某項業(yè)務數(shù)據(jù)表,且該業(yè)務數(shù)據(jù)表尚有待存入其他系統(tǒng)塊的數(shù)據(jù)時,以所述理想鍵值空間比劃分所述其他系統(tǒng)塊的鍵區(qū)和值區(qū),將所述待存入其他系統(tǒng)塊的數(shù)據(jù)寫入對應的鍵區(qū)和值區(qū)。
[0065]也就是說,硬盤存儲再分配中,系統(tǒng)會根據(jù)key和value使用的情況來調(diào)整之后的空間分配。就是根據(jù)歷史來預測未來。因為在本法發(fā)明實施例數(shù)據(jù)庫系統(tǒng)中key和value是存儲在一起的,會存在分配大小和比例的問題,在這個機制下,會自適應的調(diào)整物理存儲的分配,達到最優(yōu)化利用硬盤空間,減少硬盤碎片的目的。
[0066]在具體實施中,所述數(shù)據(jù)庫可以存儲于固態(tài)硬盤;所述將所述選定系統(tǒng)塊存儲的鍵值數(shù)據(jù)復制到該空閑系統(tǒng)塊對應的寫操作,和所述將所述待存入其他系統(tǒng)塊的數(shù)據(jù)寫入對應的鍵區(qū)和值區(qū)對應的寫操作,均以如下方式完成:將待寫入的數(shù)據(jù)暫存于內(nèi)存,當所述暫存于內(nèi)存的數(shù)據(jù)大小等于所述固態(tài)硬盤閃存塊的大小時,將所述暫存于內(nèi)存的數(shù)據(jù)一次寫入所述固態(tài)硬盤的閃存塊。
[0067]目前主流的固態(tài)硬盤(SSD),使用的存儲顆粒是NAND FLASH,主要由如下幾個關鍵的組件組成:
[0068]協(xié)議轉換層(可選),主要是把磁盤讀寫協(xié)議轉換為針對NAND FLASH的讀寫訪問請求;
[0069]FLASH芯片控制層,是整個SSD最重要的部分,直接決定了 SSD的一切。有一些實現(xiàn)中,需要SDRAM來做緩存支持,并有自己獨立的CPU ;
[0070]NAND FLASH芯片,存數(shù)據(jù)的地方。
[0071]由于固態(tài)硬盤不能進行原地更新,因此需要通過擦除+寫入的方式來更新數(shù)據(jù)。而SSD寫入性能比讀性能至少降一個數(shù)量級,因此在極端情況下,每次數(shù)據(jù)的插入都是擦除+寫入的時間總和,延遲比單寫增加近一個數(shù)量級。寫入放大倍數(shù)=閃存中實際寫入的數(shù)據(jù)量/用戶請求寫入的數(shù)據(jù)量。
[0072]將待寫入的數(shù)據(jù)暫存于內(nèi)存,當所述暫存于內(nèi)存的數(shù)據(jù)大小等于所述固態(tài)硬盤閃存塊的大小時,將所述暫存于內(nèi)存的數(shù)據(jù)一次寫入所述固態(tài)硬盤的閃存塊。根據(jù)固態(tài)硬盤的物理特點,因為其最小的讀寫單位是塊,按照ssd的塊大小,進行地址對齊后完整寫入。不會因為小量數(shù)據(jù)或者一些跨越不同硬盤塊的數(shù)據(jù)而去引起額外的寫放大。
[0073]可以看出,步驟Sll至S16可以是系統(tǒng)數(shù)據(jù)庫整理的過程,通過對系統(tǒng)數(shù)據(jù)庫的整理,可以提升數(shù)據(jù)庫系統(tǒng)的資源利用效率。
[0074]在具體實施中,步驟Sll之前還可以判斷數(shù)據(jù)庫狀態(tài),以確認所述數(shù)據(jù)庫處于非繁忙狀態(tài)。在判斷所述數(shù)據(jù)庫處于非繁忙狀態(tài)時對數(shù)據(jù)庫進行整理,可以均衡數(shù)據(jù)庫的系統(tǒng)資源,減少整理過程對數(shù)據(jù)庫讀寫的效率的影響。
[0075]在具體實施中,還以固定的時間間隔計算選擇系統(tǒng)款作為所述選定系統(tǒng)塊,也就是可以預設固定的時間點對數(shù)據(jù)庫進行整理。
[0076]本發(fā)明實施例通過計算選定系統(tǒng)塊內(nèi)部的理想鍵值空間比,選取空閑系統(tǒng)塊,對該空閑系統(tǒng)塊按照理想鍵值空間比劃分鍵區(qū)和值區(qū);將所述選定系統(tǒng)塊存儲的鍵值數(shù)據(jù)復制到該空閑系統(tǒng)塊;更新元信息中所述空閑系統(tǒng)塊的標識號為所述選定系統(tǒng)塊的標識號;將內(nèi)存中指向所述選定系統(tǒng)塊的指針指向所述空閑系統(tǒng)塊;釋