專利名稱:基于SSD的Key-Value型本地存儲方法及系統的制作方法
技術領域:
該發明涉及本地數據存儲管理系統,尤其涉及基于SSD (固態硬盤)的Key-Value(鍵值)型本地存儲方法及系統。
背景技術:
數據的組織管理主要分為三步,一是數據的在線存取,主要指的是獲得數據和提供讀取服務,即面向傳統的OLTP型負載,二是數據的組織,傳統上指的是將OLTP型數據庫中的數據轉為適合數據倉庫的數據格式,即稱為ETL的過程。三是數據分析,指的是進行長時間,復雜的數據挖掘等工作來發現數據中的聯系和潛在價值,也就是OLAP型任務。本文中,我們關注的是數據的在線存取部分。
傳統的方案中,滿足數據在線存取任務的是以MySQL為代表的關系型數據庫。關系型數據庫是上世紀70年代的產物,產生伊始的主體架構沿襲至今。關系型數據庫是數據存儲管理發展史上的里程碑,其特點是擅長嚴格事務處理,提供數據安全性保障等。但對于大數據時代的新型負載,關系型數據庫體現出了其固有的局限性其一,大數據負載的規模變化快,當新業務上線時,相關的數據量往往急速上升,而當業務調整時,數據量又可能會快速收縮,轉移到別的業務上去。而在傳統數據庫面向的應用場景一般都是在比較靜態的用戶群體中進行,擴展和收縮會牽涉到數據庫的分庫分表操作。這些復雜的行為一是會耗費大量人力物力,二是可能導致相關業務的暫時下線,這是目前的互聯網服務商很難接受的。其二,大數據負載的形式變化快。傳統的數據庫在線事務處理中,一般面向的文書,報表等,都具有比較固定的格式內容,而正如上文已經提到的那樣,現今面臨的負載中,越來越多的卻是沒有固定范式,或者經常根據業務需要進行調整的的非結構化數據或半結構化數據。這種靈活性是傳統的關系型數據庫所不具備的。其三,事務性支持的需求與以往有變化。傳統關系型數據庫都提供了嚴格的ACID事務支持,但目前來說這種事務支持從兩個方面引起人們的重新考量。第一是因為現在以互聯網應用為典型的新型業務需求中,相對來說對ACID的特性并沒有嚴格遵循的需求,比如對于博客文章,相關評論,相冊圖片,甚至網上店鋪的庫存,暫時的不一致狀態對于用戶來說都是可以接受的。第二,嚴格的ACID特性限制使得數據庫整體的性能和擴展性難以提高,這主要是復雜的鎖機制,日志機制等造成的。正是由于關系型數據庫存在的這些問題,使得被稱為NoSQL類型的新一代存儲系統漸漸崛起,并被廣為使用。NoSQL這個名稱意味著它和關系型數據庫有截然不同的地方,一般不再支持SQL語句的復雜功能,同時另一個重要區別的是大多數的NoSQL系統放棄了ACID的完整支持,它們的特點可以大致歸納如下因為放棄一些復雜的但是不實用的特性,NoSQL系統得以規避了很大一部分復雜的設計實現。NoSQL系統可以提供明顯高于傳統數據庫的數據吞吐能力。
具有良好的水平擴展能力,并適合運行在一般的廉價PC服務器硬件上。Key-Value型存儲系統固然具有這些優勢,但數據負載的增長一直保持著迅猛的態勢,同時也對存儲系統層面造成越來越大的壓力。我們可以看到,計算機硬件特別是CPU和內存容量一直保持著高速發展的態勢,而作為持久化存儲設備的硬盤的讀寫能力卻一直都沒有突破性的進展,這是由于磁盤的結構涉及到機械運動的本質決定的,隨機讀寫中機械尋道動作造成的響應速度限制恐怕是傳統磁盤結構中無法解決的問題。這樣一來,隨著計算速度快速提高,磁盤讀寫能力的瓶頸問題越來越突出。有部分的Key-Value型系統使用全內存的架構,避免磁盤讀寫瓶頸來獲得極高的性能。但在實際應用中,這種系統只被用來作為數據庫的前端緩存,難以成為數據的最終落腳之處。內存型數據庫的局限之處在于放置在內存中的數據容易在系統崩潰等意外中丟失,安全性得不到保障,另外內存的價格和能耗依然遠高于磁盤,出于數據訪問的二八原貝U,將其全部放置于內存不符合經濟方面的考量,將冷數據放置在磁盤等二級存儲可以做 到不大幅降低性能的同時降低系統的整體成本。SSD的出現有利于這個問題的解決,SSD存儲介質相比較磁盤的優勢和劣勢都很明顯,優勢是隨機讀寫性能大大提高,劣勢是單位存儲容量的成本大大高于磁盤。但從另一個角度來說,單位隨機讀寫性能的成本SSD卻比磁盤更低。所以在要求高隨機IOPS (每秒讀寫請求響應數)的場景中,SSD有應用的價值,從實際情況來看,各大互聯網公司已經開始在存儲架構中大量使用SSD來提高系統的整體性能。但從SSD的特點來說,小粒度隨機寫的性能較差,而且從實測性能來看,FTL (閃存翻譯層)的技術并無法完全解決這個問題。小粒度隨機寫造成性能下降的原因主要是所以為了最大程度地發揮出SSD的性能優勢,存儲系統的讀寫模式需要針對其進行優化。現有的同類系統中,Flashstore和FAWN等系統,利用的是Hash式數據索引的機制,這種索引方式主要存在兩個問題,一是Hash式數據索引需要在內存占用量和硬盤讀取次數之間做權衡,難以獲得兩者兼得的效果。二是Hash式數據索引難以實現范圍查找的操作。對于以Berkeley DB為代表的許多利用傳統B+樹索引機制的系統來說,在SSD上使用主要面臨的問題其數據插入會造成大量的原地更新寫入操作,這是不利于SSD性能的IO模式,另一方面,對于并發支持來說,B+樹索引需要引入復雜的鎖機制,不利于系統的整體性能。而較晚出現的LSM-tree索引結構被應用在LevelDB等系統中,其優勢在于寫入模式為大粒度連續寫,非常利于SSD的性能發揮,但LSM-tree作為一種傾向于寫優化的機制,讀操作因為引入的讀硬盤次數較多,使得其性能較低。綜上所述,現有的Key-Value系統不能滿足當前的應用需求,主要體現在以下兩
占-
^ \\\ 第一,以鎖機制為基礎的并發控制技術難以滿足高并發讀寫負載的要求;第二,現有系統的寫入模式不適應SSD的特性。
發明內容
為了應對非結構化數據的管理這一突出需求的問題,本發明實現一個面向高并發負載,基于SSD的Key-Value型本地存儲方法及系統。本發明公開一種基于SSD的Key-Value型本地存儲方法,包括步驟1,對于數據采用內存快照B+樹索引結構,進行內存中的讀寫分離操作;步驟2,經過索引后的數據,針對B+樹頁面使用FIFO隊列管理緩存;步驟3,對所述數據頁面追加寫入SSD,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。所述的基于SSD的Key-Value型本地存儲方法,所述步驟I包括步驟21,根節點A為B+樹根節點,如對首節點D做一次更新操作;首先將首節點D頁面進行拷貝,拷貝的副本頁面為首節點D’,然后在首節點D’頁面中進行所需要的更新;步驟22,進行完這個操作以后,需要對中間節點B中對首節點D’的索引也做更新,根據內存快照的原則,為了防止讀寫競爭,需要先對中間節點B進行拷貝,然后在副本中間節點B’中進行更新操作;依次操作,所述拷貝過程也在根節點A上發生;步驟23,當整個更新操作完成時,形成了一棵以根節點A’為根節點的新B+樹,根節點A’相比較A,指向B’的索引有變化,而其他索引仍然不變;步驟24,中間節點B’更新了指向首節點D’的頁面,其他索引沒有變化。所述的基于SSD的Key-Value型本地存儲方法,所述步驟2包括 步驟31,FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可以供讀操作從緩存中獲得;步驟32, write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由read指針指向新近提交的頁面位置;步驟33,在這個過程中,后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,供write指針獲得新頁面的區域;步驟34,在后臺異步寫入線程將相應頁面寫入SSD中的過程中,已經在環形隊列中存在更新拷貝的頁面屬于冗余頁面,不需要進行寫入,本方法中將跳過該種頁面,同時在SSD的數據文件中制造同樣大小的文件空洞,該文件空洞不占用實際空間也不進行實際寫入操作,但保持了邏輯頁號和數據頁面在文件中位移的對應關系。所述的基于SSD的Key-Value型本地存儲方法,所述步驟3讀出操作包括步驟41,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;步驟42,對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號,這一查找過程直到獲得葉子節點后終結;因為內存快照技術的使用,讀操作無需對頁面進行加鎖;步驟43,通過邏輯頁號獲得物理頁面的操作通過調用內存池管理模塊完成;內存池管理模塊將該頁號與FIFO隊列中最小的頁號相比較,判斷是否在隊列中,如果比最小頁號大,也就是緩存命中的情況,直接返回內存池管理中的頁面引用;
步驟44,如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取;用邏輯頁號獲得SSD中的數據需要通過調用日志型數據管理模塊的功能來完成;因為文件空洞機制的作用,日志型數據管理模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可;步驟45,最后在葉子節點頁面中完成最終的Key-Value對查找,返回結果。所述的基于SSD的Key-Value型本地存儲方法,所述步驟3寫入操作流程還包括步驟51,通過B+樹的查找來確定要插入新數據記錄的正確位置,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;對于內存池管理模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖; 步驟52,完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號;步驟53,寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用內存池管理的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作;在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號;步驟54,父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照完成;如果子節點發生了分裂,則還需要插入分裂點;步驟55,當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。本發明還公開一種基于SSD的Key-Value型本地存儲系統,包括內存快照B+樹索引模塊,用于對于數據采用內存快照B+樹索引結構,進行內存中的讀寫分離操作;內存池管理模塊,用于經過索引后的數據,針對B+樹頁面使用FIFO隊列管理緩存;日志型數據管理模塊,用于對所述數據頁面追加寫入SSD,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。所述的基于SSD的Key-Value型本地存儲系統,所述內存快照B+樹索引模塊包括首節點更新操作模塊,用于根節點A為B+樹根節點,如對首節點D做一次更新操作;首先將首節點D頁面進行拷貝,拷貝的副本頁面為首節點D’,然后在首節點D’頁面中進行所需要的更新;中間節點更新操作模塊,用于進行完這個操作以后,需要對中間節點B中對首節點D’的索引也做更新,根據內存快照的原則,為了防止讀寫競爭,需要先對中間節點B進行拷貝,然后在副本中間節點B’中進行更新操作;依次操作,所述拷貝過程也在根節點A上發生;更新完成模塊,用于當整個更新操作完成時,形成了一棵以根節點A’為根節點的新B+樹,根節點A’相比較A,指向B’的索引有變化,而其他索引仍然不變;頁面指向模塊,用于中間節點B’更新了指向首節點D’的頁面,其他索引沒有變化。所述的基于SSD的Key-Value型本地存儲系統,所述內存池管理模塊包括形成隊列結構模塊,用于FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可以 供讀操作從緩存中獲得;指針位置前移模塊,用于write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由read指針指向新近提交的頁面位置;持久化模塊,用于在這個過程中,后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,供write指針獲得新頁面的區域;對應寫入模塊,用于在后臺異步寫入線程將相應頁面寫入SSD中的過程中,已經在環形隊列中存在更新拷貝的頁面屬于冗余頁面,不需要進行寫入,本系統中將跳過該種頁面,同時在SSD的數據文件中制造同樣大小的文件空洞,該文件空洞不占用實際空間也不進行實際寫入操作,但保持了邏輯頁號和數據頁面在文件中位移的對應關系。所述的基于SSD的Key-Value型本地存儲系統,所述日志型數據管理模塊包括索引入口模塊,用于獲得當前的B+樹根節點,作為B+樹索引查找的起點;獲得索引項模塊,用于對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號,這一查找過程直到獲得葉子節點后終結;因為內存快照技術的使用,讀操作無需對頁面進行加鎖;調用內存池管理模塊,用于通過邏輯頁號獲得物理頁面的操作通過調用內存池管理模塊完成;內存池管理模塊將該頁號與FIFO隊列中最小的頁號相比較,判斷是否在隊列中,如果比最小頁號大,也就是緩存命中的情況,直接返回內存池管理模塊中的頁面引用;分配頁面空間模塊,用于如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取;用邏輯頁號獲得SSD中的數據需要通過調用日志型數據管理模塊的功能來完成;因為文件空洞機制的作用,日志型數據管理模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可;完成查找I旲塊,用于最后在葉子節點頁面中完成最終的Key-Value對查找,返回結果。所述的基于SSD的Key-Value型本地存儲系統,所述日志型數據管理模塊還包括插入位置模塊,用于通過B+樹的查找來確定要插入新數據記錄的正確位置,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;對于內存池管理模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖;
頁面壓入模塊,用于完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號;頁面修改模塊,用于寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用內存池管理模塊的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作;在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號;修改邏輯頁號模塊,用于父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照完成;如果子節點發生了分裂,則還需要插入分裂點;提交模塊,用于當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。本發明的有益效果為I :內存快照B+樹索引結構與基于FIFO (先入先出)隊列頁級緩存結合使用。B+樹索引是磁盤上存儲數據常用索引機制,可以提供按頁聚合有效減少讀寫次數,同時因為數據局部性方面的優勢,相比較Hash類索引在范圍檢索上有更好的性能。但是,過去的基于磁盤的B+樹索引,需要大量小粒度的就地更新操作(in place updates),這種讀寫模式是不合適SSD的。因為這樣不僅寫入性能低,而且加速SSD磨損。本發明采用內存快照技術,在內存中實現數據的讀寫分離,提高系統的讀寫并發度。而內存快照的特性使得使用FIFO緩存策略可以有效體現數據時間局部性的特點,免去額外的緩存替換算法,并且使得命中判斷更加簡單和快速。2 :追加寫入數據與空洞文件相結合。使用FIFO型緩存的換出頁直接寫入SSD中,不覆蓋原有數據,使用的是追加的寫入方式,利用標準輸出庫的用戶態緩存聚合寫粒度,實現大粒度寫入的目的,并且由于追加 寫入的天然特性決定了適合實現數據一致性,可靠性。本發明使用不間斷快照的技術保障數據的高可靠性,并提供高效的故障恢復機制。但追加寫入需要在寫入時去除冗余數據,使得頁面邏輯編號與實際位置不相對應,如果另外加一層映射管理勢必增加了元數據負擔和不一致的風險,本發明中利用文件系統本身具有的空洞文件機制,使得頁面邏輯編號與實際位置建立起簡單對應的關系,大大降低了數據放置的管理難度。總的技術效果系統利用內存快照B+樹的數據索引結構可提供高讀寫并發性能。利用基于追加寫入的IO模式,并使用文件空洞,不間斷快照機制,可以提供適合SSD特性,并提供數據高可靠性的數據放置機制。
圖I為本發明系統整體存儲組織架構;圖2為本發明頁級寫緩存結構圖3為本發明內存快照B+樹示例說明;圖4為本發明LogManager工作原理示意圖;圖5為本發明讀出操作流程;圖6為本發明寫入操作流程。
具體實施例方式下面給出本發明的具體實施方式
,結合附圖對本發明做出了詳細描述。(Tree Index)內存快照B+樹索引模塊利用內存快照B+樹技術,實現數據索引機制。
(Memory Pool)內存池管理模塊進行B+樹頁面的空間分配,緩存管理。(Log Manager)日志型數據管理模塊對數據持久化功能進行具體的讀寫操作,并通過空洞文件機制實現邏輯頁號和物理位置的映射管理。內存快照B+樹索引B+樹是數據庫和文件系統中常用的數據索引結構,優點是保持存儲數據穩定有序,插入和修改擁有較穩定的對數時間復雜度。本發明使用內存快照機制改進傳統B+樹數據索引機制來滿足新的需求。B+樹的結構以頁為單位,各個頁為樹結構中的節點。B+樹種存在中間節點和葉子節點兩類節點,中間節點由B+樹根節點開始向下延伸,各個節點的頁中記錄子節點的頁索弓丨,根節點在B+樹末端,根節點對應頁中存放實際key-value數據。B+樹節點頁面的組織包括頁頭保持的頁面元數據信息,已經頁面其余部分保持的數據列表,其中葉子節點的數據列表為存儲在系統中的Key-Value對,中間節點的數據列表存儲Key-Index對,Index項指向該條記錄指向的子節點頁面,Key項保存該條記錄指向的子頁面中最小的Key作為子樹的分離值。任意Key在B+樹中的位置可以由根節點開始順著分離值索引到葉子節點找至IJ。隨著Key-Value對的插入,某頁面放滿數據時會進行分裂操作,并加深B+樹,這樣來保證B+樹的平衡性,提供穩定的插入和檢索性能。本小節將敘述如何利用內存快照技術來改進B+樹索引結構,實現高并發特性。圖3展示了內存快照技術的運作機理。圖中標明B+樹的一部分,A節點為B+樹根節點,現在需要對D節點做一次更新操作。則我們首先將D節點頁面進行拷貝,拷貝的副本頁面為D’,然后在D’頁面中進行所需要的更新。進行完這個操作以后,需要對B中對D’的索引也做更新,那么根據內存快照的原則,為了防止讀寫競爭,也需要先對B進行拷貝,然后在副本B’中進行更新操作。依次類推,這個拷貝也在根節點A上發生了。當整個更新操作完成時,形成了一棵以A’為根節點的新B+樹,值得注意的是,A’相比較A來說,指向B’的索引有變化,而其他索引仍然不變。同樣的,B’更新了指向D’的頁面,其他索引沒有變化,如圖中的C頁面,依然可由B’中的索引項找到。若以A’頁面為根節點則當前形成了一個新的B+樹結構,當更新操作完成時,要提交該操作達到新的一致狀態,只需要將存儲系統索引的B+樹索引根節點變更為A’節點即可。后續操作將從A’為起點進入B+樹索引中,然后開始查找,當然可以成功地體現出對D頁面的更新效果。而在提交A’成為新的B+樹根節點之前,并發的讀操作線程將從A節點頁面進入到B+樹索引中,它們進行的查找操作均不會受到在拷貝頁面中進行的更新操作的影響,不會發生讀寫競爭。上圖中演示的是最簡單的快照技術應用,實際中的情況要更為復雜。比如當對D頁面的操作引發了頁面分裂,則B’中不僅需要更新索引,還需要插入新的索引項。同樣,對B’頁面的插入操作也可能會造成B’頁面的分裂,這種具體的情形和傳統B+樹操作的情況基本類似,也就不在此贅述。總結而言,本章節闡述了內存快照技術在改進B+樹索引結構并發性上的設計和實現,通過該技術的應用,使得處理讀請求的線程不需要對索引中的數據結構進行加鎖而可以做到直接訪問,這種技術在讀占優的負載中可以顯著提高系統整體的并發性。FIFO頁緩存管理機制本發明提出的緩存管理策略是面向內存快照B+樹頁面的,其本身具有負載特殊性。我們知道,在B+樹索引結構中,所有的讀寫操作都需要從B+樹的根節點頁面進入索引結構,進行查找定位的工作。從這個特性可以看出,B+樹中訪問最頻繁的恰恰是樹結構中 位于較高層次的節點頁面。與內存快照技術相結合來看,每次的更新寫入操作都會引起重新為對應的B+樹路徑上的頁面分配新頁面以進行拷貝操作。這種特點造成的結果是,經常處于B+樹查找路徑上的頁面,也就是較高層次的頁面,會經常因為被拷貝而出現在新分配的頁面中。也就是說,在內存快照的B+樹索引結構中,頁面的分配順序本身就體現出了很強的訪問時間局部性特征。在這種特征下,基于FIFO替換算法的緩存管理成為一種可能的選擇。FIFO(First-In First-Out)算法,即是由一個先進先出的隊列來對緩存頁面的替換進行管理。每次分配新的頁面時,都會將其放入FIFO隊列中,隊列滿時,發生替換的原則就是選擇隊尾頁面進行替換。這也就是實現了駐留緩存中的頁面是新分配的頁面,根據前一段中的論述,分配順序體現了內存快照B+樹索引頁面的時間局部性。FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可以供讀操作從緩存中獲得。write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由一 read指針指向新近提交的頁面位置。在這個過程中,一個后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,也是可以供write指針獲得新頁面的區域。利用空洞文件機制的追加寫對于SSD來說,追加寫入方式的優點主要是不會產生原地更新操作,以及容易進行大粒度聚合的寫入。這可以更加充分地利用寫入帶寬,同時減少小粒度隨機寫類型的操作對于垃圾回收和數據碎片化帶來的壓力。所以追加寫入方式是一種適合SSD特性的寫入模式優化。另外,Log-Structured日志型追加方式進行寫入內存快照B+樹這種解決方案可以保證B+樹中的父節點頁面總是要在子節點頁面之后再進行寫入。每次實際寫入B+樹的根節點,即表明一個完整而且一致的B+樹索引結構以及被持久化到SSD中。在發生系統崩潰,而需要進行故障恢復的時候,只需要在日志型寫入的數據文件中,找到最靠近末尾的B+樹根節點,就可以順利恢復一個全局一致的索引和數據結構。也就是說,我們通過一種不間斷快照的手段,達到了數據高可靠的目的,避免了數據損壞的場景,而且使得故障恢復的時間與總數據集大小無關。內存快照技術分配產生的所有內存頁面如果全部由Log-Structured型寫入持久化到SSD中,則會產生過多的冗余數據,使得SSD寫入帶寬的利用率過于低下。為了解決這一問題,我們在實際寫入的時候對頁面必須進行過濾。已經被快照的頁面,也就是說更新的版本的版本存在于內存中,那么在一般情況下,就不需要將其寫入到SSD中去。在B+樹型索引結構中,父節點頁面對子節點頁面的索引是由邏輯頁號來表示的。對于內存快照B+樹結構來說,邏輯頁號就是頁面分配的順序編號,如果將所有分配的頁面依次寫入SSD,則頁面在SSD上的物理位移與邏輯頁號就建立了一種簡單的一一對應關系,即可以由索引子節點頁面的邏輯頁面直接計算獲得物理位移,冗余頁面過濾的過程實際上也就跳過了部分分配的頁面而沒有將其真正寫入,那么前文提到的分配頁面的邏輯頁號和寫入SSD的物理位移之間的簡單對應關系也就不存在了。那么我們必須要對這個對應關系進行一些額外的管理以使得可以順利通過邏輯頁號找到物理的頁面位置。·
我們提出利用文件系統空洞文件的支持來管理邏輯頁號和實際物理位置的關系,大大降低了系統的實現和邏輯復雜度,并且通過對內核級功能支持的靈活運用,保證了實現的性能。持久化寫入的具體事項通過在頁級緩存中運行的后臺異步Flush線程完成,該線程持續將頁面寫入SSD。而根據內存快照的特性,每個提交的根節點都代表了一個一致的數據視圖,只要確保將當前的B+樹根節點Flush到SSD中,并記錄下根節點所在位置,就相當于建立了一個數據快照。Flush線程需要跳過已被拷貝的頁,這樣的跳過使得邏輯的頁編號與實際的頁物理位置不相對應,故本系統中利用文件系統的空洞文件機制,跳過頁面時寫入空洞,保持了兩者的對應的邏輯對應關系,這樣就不必引入額外的頁面映射管理層。頁面索引號實際就是順序寫入SSD的序號,通過索引號的計算可以直接判斷該頁是否在寫緩存中,如果沒有命中(頁框已經被寫請求回收)則根據索引號可以找到該頁在SSD中的位置,然后讀取。操作示例I、后臺異步寫入線程的運行過程說明圖4顯示圖3中發生的寫入操作在實際物理寫入層面的視圖。因為發生D頁面的寫入,拷貝生成3個新頁面D’,B’,A’,按照分配的次序出現在右邊的FIFO頁面緩存隊列中(實際上是用環形隊列實現,這里做了簡化,但不影響原理說明)。后臺有并發的異步寫入線程會在FIFO隊列上順著頁面分配順序運行,將相應位置上的頁面寫入到SSD中去。我們在寫入A,B,D頁面的時候,已經知道它們是冗余頁面(已經被拷貝),不應該實際將其寫入存儲設備中。這里我們引入文件空洞的機制,檢查到冗余頁面時,雖然不進行數據寫入,但是利用Iseek系統調用在目前的Log-Structured數據文件末尾形成一個頁面大小的文件空洞,依次類推,直到非冗余頁面的時候,才真正寫入數據。比如在例子中,后臺Flush線程首先跳過D頁面,形成一個頁面大小的空洞,隨后發現C頁面是有效數據,就將其寫入空洞之后,隨后又需要跳過A和B頁面,形成又一個空洞,大小為兩個頁面,隨后的A’,B’,C’頁面則正常進行寫入。在這些頁面分配的過程中,邏輯頁號都是順次遞增分配的,在使用文件空洞機制之后,我們可以發現,所有頁面還是可以由邏輯頁號乘以頁面大小產生的位移來直接進行訪問,而實際寫入文件的量卻減少為4個頁面,起到了過濾冗余寫入的作用。2、讀出操作流程讀出記錄操作指給定一個Key的情況下,存儲系統返回該Key對應的Value (Key和Value均以字符串表示)。如圖5,讀操作的流程大致如下I、從系統獲得出當前的B+樹根節點,作為B+樹索引查找的起點。因為前文所述的內存快照技術的運用,讀操作無需對頁面進行加鎖。
2、對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號。這一查找過程直到獲得葉子節點后終結。3、通過邏輯頁號獲得物理頁面的操作通過調用Memory Pool模塊完成。MemoryPool模塊將該頁號與目前FIFO隊列中最小的頁號相比較,判斷是否在隊列中。如果比最小頁號大,也就是緩存命中的情況,可以直接返回Memory Pool中的頁面引用。4、如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取。用邏輯頁號獲得SSD中的數據需要通過調用Log Manager模塊的功能來完成。因為文件空洞機制的作用,Log Manager模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可。5、最后在葉子節點頁面中完成最終的Key-Value對查找,返回結果。(3)寫入操作流程寫入記錄操作指的是將一個Key值和一個Value值以數據對的方式寫入到存儲系統中,供以后的讀取。存儲系統采用單寫多讀的線程模型,寫線程進入索引結構時始終面對最新的B+樹根節點,這點不同于讀線程面對的情況。如圖6,寫操作的流程大致如下I、寫操作需要進行的第一步和讀操作是一致的,是通過一次B+樹的查找來確定要插入新數據記錄的正確位置,所進行的操作與讀操作基本一樣,就不再贅述。有一點不同的是,因為對于Memory Pool模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖了。2、完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號。3、寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用Memory Pool的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作。在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號。4、父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照機制完成的。如果子節點發生了分裂,則還需要插入分裂點。5、當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。本發明還公開一種基于SSD的Key-Value型本地存儲系統,包括內存快照B+樹索引模塊,用于對于數據采用內存快照B+樹索引結構,進行內存中的讀寫分離操作;內存池管理模塊,用于經過索引后的數據,針對B+樹頁面使用FIFO隊列管理緩存;日志型數據管理模塊,用于對所述數據頁面追加寫入SSD,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。所述的基于SSD的Key-Value型本地存儲系統,所述內存快照B+樹索引模塊包括
首節點更新操作模塊,用于根節點A為B+樹根節點,如對首節點D做一次更新操作;首先將首節點D頁面進行拷貝,拷貝的副本頁面為首節點D’,然后在首節點D’頁面中進行所需要的更新;中間節點更新操作模塊,用于進行完這個操作以后,需要對中間節點B中對首節點D’的索引也做更新,根據內存快照的原則,為了防止讀寫競爭,需要先對中間節點B進行拷貝,然后在副本中間節點B’中進行更新操作;依次操作,所述拷貝過程也在根節點A上發生;更新完成模塊,用于當整個更新操作完成時,形成了一棵以根節點A’為根節點的新B+樹,根節點A’相比較A,指向B’的索引有變化,而其他索引仍然不變;頁面指向模塊,用于中間節點B’更新了指向首節點D’的頁面,其他索引沒有變化。所述的基于SSD的Key-Value型本地存儲系統,所述內存池管理模塊包括形成隊列結構模塊,用于FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可以供讀操作從緩存中獲得;指針位置前移模塊,用于write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由read指針指向新近提交的頁面位置;持久化模塊,用于在這個過程中,后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,供write指針獲得新頁面的區域;對應寫入模塊,用于在后臺異步寫入線程將相應頁面寫入SSD中的過程中,已經在環形隊列中存在更新拷貝的頁面屬于冗余頁面,不需要進行寫入,本系統中將跳過該種頁面,同時在SSD的數據文件中制造同樣大小的文件空洞,該文件空洞不占用實際空間也不進行實際寫入操作,但保持了邏輯頁號和數據頁面在文件中位移的對應關系。所述的基于SSD的Key-Value型本地存儲系統,所述日志型數據管理模塊包括索引入口模塊,用于獲得當前的B+樹根節點,作為B+樹索引查找的起點;
獲得索引項模塊,用于對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號,這一查找過程直到獲得葉子節點后終結;因為內存快照技術的使用,讀操作無需對頁面進行加鎖;調用內存池管理模塊,用于通過邏輯頁號獲得物理頁面的操作通過調用內存池管理模塊完成;內存池管理模塊將該頁號與FIFO隊列中最小的頁號相比較,判斷是否在隊列中,如果比最小頁號大,也就是緩存命中的情況,直接返回內存池管理模塊中的頁面引用;分配頁面空間模塊,用于如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取;用邏輯頁號獲得SSD中的數據需要通過調用日志型數據管理模塊的功能來完成;因為文件空洞機制的作用,日志型數據管理模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可;完成查找I旲塊,用于最后在葉子節點頁面中完成最終的Key-Value對查找,返回
結果。 所述的基于SSD的Key-Value型本地存儲系統,所述日志型數據管理模塊還包括插入位置模塊,用于通過B+樹的查找來確定要插入新數據記錄的正確位置,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;對于內存池管理模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖;頁面壓入模塊,用于完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號;頁面修改模塊,用于寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用內存池管理模塊的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作;在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號;修改邏輯頁號模塊,用于父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照完成;如果子節點發生了分裂,則還需要插入分裂點;提交模塊,用于當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。本領域的技術人員在不脫離權利要求書確定的本發明的精神和范圍的條件下,還可以對以上內容進行各種各樣的修改。因此本發明的范圍并不僅限于以上的說明,而是由權利要求書的范圍來確定的。
權利要求
1.一種基于SSD的Key-Value型本地存儲方法,其特征在于,包括 步驟1,對于數據采用內存快照B+樹索引結構,進行內存中的讀寫分離操作; 步驟2,經過索引后的數據,針對B+樹頁面使用FIFO隊列管理緩存; 步驟3,對所述數據頁面追加寫入SSD,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。
2.如權利要求I所述的基于SSD的Key-Value型本地存儲方法,其特征在于,所述步驟I包括 步驟21,根節點A為B+樹根節點,如對首節點D做一次更新操作;首先將首節點D頁面進行拷貝,拷貝的副本頁面為首節點D’,然后在首節點D’頁面中進行所需要的更新;步驟22,進行完這個操作以后,需要對中間節點B中對首節點D’的索引也做更新,根據內存快照的原則,為了防止讀寫競爭,需要先對中間節點B進行拷貝,然后在副本中間節點 B’中進行更新操作;依次操作,所述拷貝過程也在根節點A上發生; 步驟23,當整個更新操作完成時,形成了一棵以根節點A’為根節點的新B+樹,根節點A’相比較A,指向B’的索引有變化,而其他索引仍然不變; 步驟24,中間節點B’更新了指向首節點D’的頁面,其他索引沒有變化。
3.如權利要求I所述的基于SSD的Key-Value型本地存儲方法,其特征在于,所述步驟2包括 步驟31,FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可以供讀操作從緩存中獲得; 步驟32, write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由read指針指向新近提交的頁面位置; 步驟33,在這個過程中,后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,供write指針獲得新頁面的區域;步驟34,在后臺異步寫入線程將相應頁面寫入SSD中的過程中,已經在環形隊列中存在更新拷貝的頁面屬于冗余頁面,不需要進行寫入,本方法中將跳過該種頁面,同時在SSD的數據文件中制造同樣大小的文件空洞,該文件空洞不占用實際空間也不進行實際寫入操作,但保持了邏輯頁號和數據頁面在文件中位移的對應關系。
4.如權利要求I所述的基于SSD的Key-Value型本地存儲方法,其特征在于,所述步驟3讀出操作包括 步驟41,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖; 步驟42,對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號,這一查找過程直到獲得葉子節點后終結;因為內存快照技術的使用,讀操作無需對頁面進行加鎖; 步驟43,通過邏輯頁號獲得物理頁面的操作通過調用內存池管理模塊完成;內存池管理模塊將該頁號與FIFO隊列中最小的頁號相比較,判斷是否在隊列中,如果比最小頁號大,也就是緩存命中的情況,直接返回內存池管理中的頁面引用; 步驟44,如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取;用邏輯頁號獲得SSD中的數據需要通過調用日志型數據管理模塊的功能來完成;因為文件空洞機制的作用,日志型數據管理模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可; 步驟45,最后在葉子節點頁面中完成最終的Key-Value對查找,返回結果。
5.如權利要求I所述的基于SSD的Key-Value型本地存儲方法,其特征在于,所述步驟3寫入操作流程還包括 步驟51,通過B+樹的查找來確定要插入新數據記錄的正確位置,獲得當前的B+樹根 節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;對于內存池管理模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖; 步驟52,完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號; 步驟53,寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用內存池管理的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作;在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號; 步驟54,父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照完成;如果子節點發生了分裂,則還需要插入分裂點; 步驟55,當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。
6.一種基于SSD的Key-Value型本地存儲系統,其特征在于,包括 內存快照B+樹索引模塊,用于對于數據采用內存快照B+樹索引結構,進行內存中的讀寫分離操作; 內存池管理模塊,用于經過索引后的數據,針對B+樹頁面使用FIFO隊列管理緩存; 日志型數據管理模塊,用于對所述數據頁面追加寫入SSD,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。
7.如權利要求6所述的基于SSD的Key-Value型本地存儲系統,其特征在于,所述內存快照B+樹索引模塊包括 首節點更新操作模塊,用于根節點A為B+樹根節點,如對首節點D做一次更新操作;首先將首節點D頁面進行拷貝,拷貝的副本頁面為首節點D’,然后在首節點D’頁面中進行所需要的更新; 中間節點更新操作模塊,用于進行完這個操作以后,需要對中間節點B中對首節點D’的索引也做更新,根據內存快照的原則,為了防止讀寫競爭,需要先對中間節點B進行拷貝,然后在副本中間節點B’中進行更新操作;依次操作,所述拷貝過程也在根節點A上發生; 更新完成模塊,用于當整個更新操作完成時,形成了一棵以根節點A’為根節點的新B+樹,根節點A’相比較A,指向B’的索引有變化,而其他索引仍然不變; 頁面指向模塊,用于中間節點B’更新了指向首節點D’的頁面,其他索引沒有變化。
8.如權利要求6所述的基于SSD的Key-Value型本地存儲系統,其特征在于,所述內存池管理模塊包括 形成隊列結構模塊,用于FIFO頁級寫緩存的設計使用環形隊列的結構,整個環劃分為write區域和read區域,write區域中為正在進行寫操作,尚未提交的頁面,read區域中為已經完成寫操作并提交的頁面,可 以供讀操作從緩存中獲得; 指針位置前移模塊,用于write指針指向write區域的末尾,該指針也是下一個寫操作向寫緩存申請新頁面時裝載的位置,在系統運行時,write指針位置不斷獲得新頁面并沿著環形隊列前移,同時完成寫操作的頁面提交為read區域,并由read指針指向新近提交的頁面位置; 持久化模塊,用于在這個過程中,后臺異步寫入線程將以適合應用需求的速度將read區域依次持久化到SSD中,已經完成持久化的頁面區域稱為flush區域,一個flush指針指向下一個要做持久化的頁面,flush區域為read區域的一部分,供write指針獲得新頁面的區域; 對應寫入模塊,用于在后臺異步寫入線程將相應頁面寫入SSD中的過程中,已經在環形隊列中存在更新拷貝的頁面屬于冗余頁面,不需要進行寫入,本系統中將跳過該種頁面,同時在SSD的數據文件中制造同樣大小的文件空洞,該文件空洞不占用實際空間也不進行實際寫入操作,但保持了邏輯頁號和數據頁面在文件中位移的對應關系。
9.如權利要求6所述的基于SSD的Key-Value型本地存儲系統,其特征在于,所述日志型數據管理模塊包括 索引入口模塊,用于獲得當前的B+樹根節點,作為B+樹索引查找的起點; 獲得索引項模塊,用于對于包括根節點在內的中間節點頁面進行頁面內部的折半查找,取得正確的索引項,獲得下一個需要進行查找的頁面邏輯頁號,這一查找過程直到獲得葉子節點后終結;因為內存快照技術的使用,讀操作無需對頁面進行加鎖; 調用內存池管理模塊,用于通過邏輯頁號獲得物理頁面的操作通過調用內存池管理模塊完成;內存池管理模塊將該頁號與FIFO隊列中最小的頁號相比較,判斷是否在隊列中,如果比最小頁號大,也就是緩存命中的情況,直接返回內存池管理模塊中的頁面引用; 分配頁面空間模塊,用于如果沒有命中緩沖,則需要分配額外頁面空間,然后到SSD中讀取;用邏輯頁號獲得SSD中的數據需要通過調用日志型數據管理模塊的功能來完成;因為文件空洞機制的作用,日志型數據管理模塊此時的任務非常簡單,只需要用邏輯頁號乘以頁面大小,然后讀取相應頁面即可; 完成查找模塊,用于最后在葉子節點頁面中完成最終的Key-Value對查找,返回結果。
10.如權利要求6所述的基于SSD的Key-Value型本地存儲系統,其特征在于,所述日志型數據管理模塊還包括 插入位置模塊,用于通過B+樹的查找來確定要插入新數據記錄的正確位置,獲得當前的B+樹根節點,作為B+樹索引查找的起點;讀操作無需對頁面進行加鎖;對于內存池管理模塊中的FIFO環形隊列Read Region的改變全部發生在寫線程中,所以寫線程本身對于頁面緩存命中的判斷就不需要進行加鎖;頁面壓入模塊,用于完成查找正確插入位置的操作時,寫線程將根節點到插入位置頁面整條路徑的頁面壓入一個棧結構中,該棧結構中除了保存指向對應頁面的指針外,還保存了路徑中的中間節點指向子節點的頁內索引號; 頁面修改模塊,用于寫入頁面的過程將會依次彈出棧中頁指針,這里使用內存快照的技術來避免加鎖保護,對一個頁面的修改,需要先調用內存池管理模塊的接口來請求一個新的頁面,然后將源頁面的內容拷貝到新頁面中,再進行修改操作;在隨后彈出的父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號; 修改邏輯頁號模塊,用于父節點頁面中,需要將原先指向子節點的索引頁號修改為新的邏輯頁號,這個修改也同樣是利用內存快照完成;如果子節點發生了分裂,則還需要插入分裂點; 提交模塊,用于當整個寫操作完成后,進行提交,需要進行的操作是將已經完成寫入或者更新的所有頁面并入Read Region中,然后修改新的B+樹根節點為當前的索引B+樹根節點。
全文摘要
本發明公開一種基于SSD的Key-Value型本地存儲方法和系統,所述方法包括步驟1,對于數據采用內存快照B+樹索引結構,進行內存的讀寫分離操作;步驟2,經過索引后的數據,針對B+樹使用FIFO隊列管理緩存;步驟3,對所述數據進行讀寫操作,通過空洞文件機制在日志型追加寫入的數據中實現邏輯頁號和物理位置的映射管理。
文檔編號G06F12/08GK102722449SQ20121016505
公開日2012年10月10日 申請日期2012年5月24日 優先權日2012年5月24日
發明者劉凱捷, 孫凝暉, 熊勁 申請人:中國科學院計算技術研究所