設計海量key value資料的儲存查詢模組

2021-06-25 14:40:50 字數 2329 閱讀 3988

設計海量key-value資料的儲存查詢模組

單機儲存100億大資料量的key-value資料,要求能夠支援插入和查詢操作,單條資料長度不定,平均約1024位元組,假設可用記憶體10g,磁碟空間不限,請設計乙個儲存查詢模組,支援按照key來獲取對應的value,設計目標以查詢效能為先,盡量節約資源,查詢可以理解為網民的檢索行為。

1)        說明該設計方案和主要思路,以及優缺點

2)        請詳細說明該設計思路下查詢和插入的操作流程

3)        如果增加更新操作,請評估前面的設計方案是否可行,需要做怎樣的修改,不可行則指明主要問題點。

分析:1)資料量大小為:

data_size=100億*1024byte=10^10*10^3byte=10^13byte=10^4g

假設每個key的長度不超過128byte。

使用2種檔案儲存資料:索引檔案和資料檔案。

索引檔案採用類似b+樹的結構化儲存,一條資料對應一條記錄,一條記錄包括:資料的key、儲存該資料的資料檔案id以及資料檔案偏移量,占用空間:

record_size=key_size+data_file_id_size+offset_size=128+4+8=140byte。

b+樹共有3層,內節點只儲存最多m個關鍵字key和相應的m棵子樹的位置,第i個關鍵字是第i棵子樹中的最小關鍵字,葉節點儲存最多m個key-value資料。每個節點最多包含m個key,m^3=100億=10^10,m=2200。

內節點有2種形式:一是儲存在索引檔案中,包含的域有:關鍵字key,相應的子節點的索引檔案id和檔案偏移量,占用空間:

inner_node_size_in_file=(key_size+index_file_id_size+file_offset_size)*m=(128+4+8)*2200

=30800byte=300k。

二是儲存在記憶體中,除了上面提到的域,還包括指向子節點的指標域,占用空間:

inner_node_size_in_memory*m=(inner_node_size_in_file+pointer_size)*m

=144*2200byte=316800byte=310k。

第一層和第二層占用空間:

(m+1)*inner_node_size_in_momery=666m,

可以全部儲存在記憶體中。

內節點按順序寫入索引檔案,採用惰性空間分配策略,即使內節點沒有滿,也分配最大空間inner_node_size_in_file。這樣保證內節點可以在原地更新,保持有序狀態。假設索引檔案最大index_file_size=2g,乙個索引檔案可以容納內節點數目:

inner_count_in_file=index_file_size/ inner_node_size_in_momery

=6990>inner_node_count=m+1

乙個索引檔案足夠了。

葉節點包含key-value資料,占用空間:

leaf_size_in_memory=m*data_size=2200*1024=2200k

葉節點以在檔案尾追加方式寫入資料檔案,不需要保持有序,因為b+樹的第二層內節點記錄了所有葉節點的資料檔案id和檔案偏移量。假設乙個資料檔案大小是data_file_size=2g,資料檔案數目為

data_file_count=data_size/data_file_size=5000

優點:1)      b+樹採用3層,第1層和第2層是內節點,是索引節點,儲存在索引檔案,可以全部儲存在記憶體,第3層是葉節點,儲存在資料檔案,部分快取在記憶體。插入和查詢一條資料,最多需要訪問硬碟一次。

2)      索引檔案採用惰性空間分配策略保證內節點可以在原地更新,保持有序狀態。

3)      資料檔案的更新一直是在尾部追加,不需要移動資料。

缺點:1)      索引檔案浪費了部分空間。

第二問:

查詢:在根節點二叉查詢關鍵字,下降到第二層某乙個節點,二叉查詢關鍵字,下降到第三層某乙個關鍵字,若該條資料不在記憶體中,從資料檔案讀入,若在記憶體中,直接返回資料。

插入:與查詢類似,找到該條資料應該在的位置,新增到最後乙個資料檔案的末尾。

第三問:若增加更新操作,前面的方案可行,需要做下列修改:

將資料按照大小分類儲存到不同的資料檔案中。假設資料大小平均分布在512byte到1536byte之間,步長平均為128byte,資料檔案分類為儲存512byte的,儲存512+128byte的,儲存512+128*2byte的,……,類似記憶體池的做法。更新資料時,將資料寫到能容納該條資料的最小分類的資料檔案,將該位置記為空閒,加到該資料檔案的空閒位置鍊錶。鍊錶的指標可以用空閒位置的前4個位元組表示,檔案的最開始4個位元組表示鍊錶頭部指標。當然,這樣會浪費部分空間。可以監控每種檔案的空間使用情況,做出調整。

海量資料庫設計思想

分割槽 1.範圍分割槽 a.通常按時間字段劃分 create table partition by range partition partition 1 values less than to date 01 02 2000 dd mm yyyy partition partition 2 val...

評價系統海量資料儲存設計

整體資料儲存包括基礎資料儲存 文字儲存 資料索引 資料快取幾個部分。基礎資料儲存 及標籤處於同一資料庫下,根據商品編號分別進行拆表 其它的擴充套件資訊資料,因資料量不大 訪問量不高,處理於同一庫下且不做分表即可。因人而異 因系統而異,根據不同的資料場景選擇不同儲存方案,有效利用資源的同時還能解決資料...

key value資料庫優點

1 乙個 key value 資料儲存系統,只支援一些基本操作,如 set key,value 和 get key 等 2 分布式 多台機器 nodes 同時儲存資料和狀態,彼此交換訊息來保持資料一致,可視為乙個完整的儲存系統。3 資料一致 所有機器上的資料都是同步更新的 不用擔心得到不一致的結果 ...