一種基于日志結構合并樹的鍵值存儲方法
【技術領域】
[0001]本發明屬于計算機軟件技術領域,涉及到一種基于日志結構合并樹的鍵值存儲方法。
【背景技術】
[0002]在當前的數據中心,鍵值存儲系統已經成為大規模數據密集型網絡應用的核心。許多研究致力于設計高性能和高擴展性的鍵值存儲系統。日志結構的合并樹(Log-Structured Merge-tree,LSM_tree)以其同時支持增量寫、低寫延遲和基于范圍的掃描等特點,廣泛應用于當前的新興互聯網應用。但基于LSM-tree的鍵值存儲系統存在嚴重的寫放大,為了提高系統的寫性能,bLSM采用置換選擇排序算法降低排序合并(Compact1n)頻率(R.Sears and R.Ramakrishnan.bLSM:A General Purpose Log Sturctured MergeTree, in SIGM0D’2012),PCP提出一種流水線排序合并過程充分利用多CPU和10,加快排序合并過程(Z.Zhang,Y.Yue,B.He,et.al.Pipelined Compact1n for the LSM-tree.1nIPDPS’2014)。
[0003]在基于日志結構合并樹的鍵值存儲系統中,傳統的排序合并過程是每個鍵值對從更小的組件向相鄰的更大組件逐層流動,直到達到最大的組件。這種逐層流動機制導致了嚴重的寫放大。bLSM和PCP的研究致力于降低排序合并頻率或加快寫速度,但是忽略了鍵值對的逐層流動是導致嚴重寫放大的根本原因。
【發明內容】
[0004]本發明的目的在于提供一種基于日志結構合并樹的鍵值存儲方法,減少排序合并過程中鍵值對的讀寫1/0數,降低寫放大,從而提高基于日志結構合并樹的鍵值存儲系統的吞吐量。
[0005]本發明的技術方案為:
[0006]—種基于日志結構合并樹的鍵值存儲方法,其步驟為:
[0007]1)為磁盤上的每一數據存儲組件在內存中設置一對應的緩存組件,并對每一緩存組件設置一布隆過濾器;為每個數據存儲組件中每個磁盤鍵值對表(SSTable)的每一數據塊(Block)設置一布隆過濾器;
[0008]2)對于數據存儲組件G中待合并的鍵值對,采用對應的布隆過濾器在數據存儲組件和緩存組件中逐級對該數據存儲組件C,當前數據塊的每一鍵值對進行跳轉判斷,確定其能跳至的數據存儲組件(:1+[?或緩存組件B1+N;其中Μ大于或等于0,N大于或等于1;跳轉條件為:若跳躍至數據存儲組件Ci+M,則跳躍條件為Bi+1、Ci+1、Bi+2、Ci+2……Bi+M、Ci+M各級組件中沒有包含待跳鍵值對中鍵key對應的任何版本的鍵值對,而緩存組件Bi+M+i中包含待跳鍵值對中鍵key對應的某一版本的鍵值對;然后將跳躍到數據存儲組件Ci+M的鍵值對置于對應的緩存Bi+M中;如果緩存Bi+M中的鍵值對數量達到對應的設定條件,則將其中的鍵值對寫入數據存儲組件Ci+M中;若跳躍至緩存組件Bi+N,則跳躍條件為Bi+1、Ci+1、Bi+2、Ci+2……Bi+N—hC1.1、Bi+N各級組件中沒有包含待跳鍵值對中鍵key對應的任何版本的鍵值對,而數據存儲組件Ci+N中包含待跳鍵值對中鍵key對應的某一版本的鍵值對;然后將待跳鍵值對跳躍到緩存組件Bi+N中;
[0009]3)對于緩存組件m中待合并的鍵值對,采用相應的布隆過濾器在數據存儲組件和緩存組件中逐級對該鍵值對進行跳轉判斷,確定其能跳至的數據存儲組件C1+M或緩存組件Bm;其中Μ大于或等于0,N大于或等于1;跳轉條件為:若跳躍至數據存儲組件(:1+[?,則跳躍條件為數據存儲組件C1+M及其之前各級數據存儲組件、緩存組件中沒有包含待跳鍵值對中鍵key對應的任何版本的鍵值對,而緩存組件Bi+M+i中包含待跳鍵值對中鍵key—對應版本的鍵值對;然后將跳躍到數據存儲組件C1+M的鍵值對置于對應的緩存組件隊+M中;如果緩存組件Bi+M中的鍵值對數量達到對應的設定條件,則將其中的鍵值對寫入數據存儲組件Ci+M中;若跳躍至緩存組件Bm,則跳躍條件為緩存組件隊+^及其之前各級數據存儲組件、緩存組件中沒有包含待跳鍵值對中鍵key對應的任何版本的鍵值對,而數據存儲組件Ci+N-1中包含待跳鍵值對中鍵key—對應版本的鍵值對;然后將待跳鍵值對跳躍到緩存組件隊+吣中。
[0010]進一步的,所述步驟2)中,確定出其跳至的數據存儲組件C1+M或緩存組件B1+N并根據該鍵值對的來源標記該鍵值對的狀態、跳轉動作和路徑;所述步驟3)中,確定其能跳至的數據存儲組件C1+M或緩存組件并標記該鍵值對的狀態、跳轉動作和路徑;所述狀態包括InSSTable、InBuffer,InSSTable表示鍵值對存儲在磁盤上的SSTable文件內,InBuffer表示鍵值對存儲在內存中的緩存內。
[0011]進一步的,所述跳轉動作包括:從SSTable跳躍到SSTable、從SSTable跳躍到Buf f er、從 Buf f er 跳躍到 SSTab 1 e 和從 Buf f er 跳躍到 Buf f er。
[0012]進一步的,所述N值小于或等于設定的最大值Nmax。
[0013]進一步的,在內存中劃定一設定大小的緩存空間,將該緩存空間在邏輯上分成多個緩存作為各數據存儲組件的緩存組件,屬于同一緩存組件的鍵值對放在一起緩存,每一緩存組件中的內容是以鏈表形式實現。
[OOM]進一步的,當所有的緩存組件空間耗盡時,統計動作為從Buffer跳躍到Buffer的鍵值對中,將跳出鍵值對熱度最高的緩存組件中的鍵值對持久化到數據存儲組件。
[0015]進一步的,對動作為從SSTable跳躍到SSTable的鍵值對、從Buffer跳躍到SSTable的鍵值對,采用原始LSM-tree的write ahead log可靠性恢復機制進行恢復;對于動作為從SSTable跳躍到Buffer的鍵值對、從Buffer跳躍到Buffer的鍵值對進行恢復時,按日志記錄的順序和內容,重放每一次排序合并過程對在Buffer中存儲的鍵值對的修改操作進行恢復。
[0016]進一步的,所述數據存儲組件C1+M的緩存組件B1+M位于所述數據存儲組件(:1+[?的上層。
[0017]本發明的主要內容包括:
[0018]1、采用布隆過濾器(Bloom Filter)判斷某個數據塊是否含有特定的鍵;
[0019]2、采用基于緩存的延遲插入機制,根據排序合并過程中鍵值對的存儲位置將鍵值對劃分為在磁盤的磁盤鍵值對表SSTable中(記為InSSTable)和在內存的緩存組件中(記為InBuffer)兩種狀態,重新定義排序合并過程的輸入、輸出,并實現排序(sort)與合并(merge);
[0020]3、為每個磁盤上的數據存儲組件在內存中設置對應的緩存(buffer),對緩存采用按需分配與智能回收的管理機制;
[0021]4、設置緩存之后,對不跳入緩存的鍵值對采用原始LSM-tree的預寫式日志(writeahead log,WAL)可靠性恢復機制;對于緩存中鍵值對實現額外的日志記錄與可靠性恢復。
[0022]本發明提供的基于日志結構合并樹的鍵值存儲系統,在排序合并過程中通過跳過一些數據存儲組件實現排序合并的輸出鍵值對跳躍到更大的不相鄰組件。
[0023]本發明發現傳統的每個鍵值對逐層流動直到最大數據存儲組件的機制導致了嚴重的寫放大,提出對不經常更新的鍵值對,通過排序合并過程一層一層進行流動是很沒有必要的。首先,特定的鍵值對在滿足版本新舊約束的前提下,在排序合并過程中跨越多個數據存儲組件,從而減小寫放大。該方法采用布隆過濾器判斷特定的鍵值對是否滿足版本約束,即一個數據塊中是否包含該鍵(Key)對應的任何版本的鍵值對。其次,特定鍵值對能跳過的數據存儲組件數取決于該鍵值對的版本分布情況,并且該方法限制了所能跳過的數據存儲組件數的最大值。鍵值對所能跳過的數據存儲組件數不能大于預先定義的最大值。最后,該方法采用基于緩存的延遲機制實現鍵值對與跳躍到的目標數據存儲組件排序合并。該方法為每個數據存儲組件設置一定大小的緩存(buffer),將原本要跳躍到該數據存儲組件的鍵值對置于該組