本申請涉及分布式存儲系統(tǒng),具體地說,涉及一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法、裝置。
背景技術(shù):
在大規(guī)模分布式存儲系統(tǒng)中,為了實(shí)現(xiàn)集中權(quán)限認(rèn)證、配額控制,大部分采用了集中式元數(shù)據(jù)管理的方法,即將整個(gè)存儲系統(tǒng)中所有數(shù)據(jù)的元數(shù)據(jù)集中存放在若干個(gè)元數(shù)據(jù)節(jié)點(diǎn)(NameNode)進(jìn)行存儲。這樣的架構(gòu)中,元數(shù)據(jù)節(jié)點(diǎn)的可用性直接關(guān)系到整個(gè)存儲系統(tǒng)的可用性。當(dāng)元數(shù)據(jù)節(jié)點(diǎn)出現(xiàn)升級或者是進(jìn)程重啟時(shí),快速恢復(fù)元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存數(shù)據(jù)成為主要的需求點(diǎn),因此,在存儲系統(tǒng)中會采用定期將元數(shù)據(jù)節(jié)點(diǎn)中的內(nèi)存數(shù)據(jù)寫到磁盤中(即dump內(nèi)存鏡像),并記錄數(shù)據(jù)操作日志來做到盡快恢復(fù)元數(shù)據(jù)節(jié)點(diǎn)中的內(nèi)存數(shù)據(jù),也就是說將磁盤中的保存的內(nèi)存鏡像讀出來重新加載到內(nèi)存中,其中,數(shù)據(jù)操作日志是對真正存儲的數(shù)據(jù)的修改(如增加或刪除等)記錄。例如在Hadoop分布式文件系統(tǒng)中,元數(shù)據(jù)節(jié)點(diǎn)每次收到數(shù)據(jù)節(jié)點(diǎn)(真正存儲數(shù)據(jù)的節(jié)點(diǎn))寫數(shù)據(jù)操作成功之前,修改元數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)操作日志并且同步到數(shù)據(jù)節(jié)點(diǎn)的文件系統(tǒng)。
發(fā)明人在實(shí)現(xiàn)本發(fā)明的過程中發(fā)現(xiàn):隨著元數(shù)據(jù)的指數(shù)級增長,現(xiàn)有的dump內(nèi)存鏡像時(shí),磁盤成為內(nèi)存鏡像的瓶頸,大量的元數(shù)據(jù)節(jié)點(diǎn)在dump內(nèi)存鏡像時(shí)需要占用的磁盤空間大,給磁盤造成較大的空間壓力問題。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請?zhí)峁┮环N元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法、裝置,可以解決現(xiàn)有的dump內(nèi)存鏡像時(shí)磁盤空間壓力較大問題。
為了解決上述技術(shù)問題,本申請第一方面提供一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法,包括:
在檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊的大小不超過所述第一閾值;
對每個(gè)數(shù)據(jù)塊進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)塊寫入磁盤。
可選地,所述的方法還包括:
在檢測到內(nèi)存數(shù)據(jù)的大小等于預(yù)設(shè)的第一閾值時(shí),對所述內(nèi)存數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的內(nèi)存數(shù)據(jù)寫入磁盤。
可選地,所述的方法還包括:
在檢測到內(nèi)存數(shù)據(jù)的大小小于預(yù)設(shè)的第二閾值時(shí),將小于所述第二閾值的內(nèi)存數(shù)據(jù)寫入磁盤。
可選地,在檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊之后,若存在小于所述第二閾值的數(shù)據(jù)塊時(shí),則所述方法還包括:
將小于所述第二閾值的數(shù)據(jù)塊寫入磁盤。
可選地,將小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊寫入磁盤,包括:
將小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊連續(xù)寫入磁盤,且記錄每個(gè)小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊的起始位置和數(shù)據(jù)長度,即小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊之間不存在大于等于所述第二閾值的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)。
可選地,對每個(gè)數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮,包括:
采用多個(gè)線程對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮。
可選地,采用多個(gè)線程對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮,包括:
在對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮,生成每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)對應(yīng)的校驗(yàn)值。
本發(fā)明還提供一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像裝置,包括:
數(shù)據(jù)拆分模塊,用于在檢測模塊檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊的大小不超過所述第一閾值;
壓縮模塊,用于對所述數(shù)據(jù)拆分模塊拆分后的每個(gè)數(shù)據(jù)塊進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)塊通過寫入模塊寫入磁盤。
可選地,所述壓縮模塊,還用于在所述檢測模塊檢測到內(nèi)存數(shù)據(jù)的大小等于預(yù)設(shè)的第一閾值時(shí),對所述內(nèi)存數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的內(nèi)存數(shù)據(jù)通過所述寫入模塊寫入磁盤。
可選地,所述寫入模塊,還用于所述檢測模塊在檢測到內(nèi)存數(shù)據(jù)的大小小于預(yù)設(shè)的第二閾值時(shí),將小于所述第二閾值的內(nèi)存數(shù)據(jù)寫入磁盤。
可選地,所述寫入模塊,還用于在所述檢測模塊檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊之后,若存在小于所述第二閾值的數(shù)據(jù)塊時(shí),將小于所述第二閾值的數(shù)據(jù)塊寫入磁盤。
可選地,所述寫入模塊,具體用于將小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊連續(xù)寫入磁盤,且記錄每個(gè)小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊的起始位置和數(shù)據(jù)長度,即小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊之間不存在大于等于所述第二閾值的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)。
可選地,所述壓縮模塊,具體用于采用多個(gè)線程對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮。
可選地,所述壓縮模塊,具體用于在對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮,生成每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)對應(yīng)的校驗(yàn)值。
本發(fā)明還提供一種元數(shù)據(jù)節(jié)點(diǎn),包括:上述的內(nèi)存鏡像裝置。
本發(fā)明實(shí)施例通過在dump內(nèi)存鏡像時(shí),當(dāng)內(nèi)存數(shù)據(jù)較大時(shí),對內(nèi)存數(shù)據(jù)進(jìn)行拆分為數(shù)據(jù)塊,且對每個(gè)拆分后的數(shù)據(jù)塊進(jìn)行多線程的壓縮,不僅可以加快dump內(nèi)存鏡像速度,而且可以提高磁盤的空間利用率。
附圖說明
此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實(shí)施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
圖1為一種分布式存儲系統(tǒng)的構(gòu)架圖;
圖2為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖;
圖3為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖;
圖4為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖;
圖5為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像裝置的結(jié)構(gòu)圖。
具體實(shí)施方式
以下將配合附圖及實(shí)施例來詳細(xì)說明本申請的實(shí)施方式,藉此對本申請如何應(yīng)用技術(shù)手段來解決技術(shù)問題并達(dá)成技術(shù)功效的實(shí)現(xiàn)過程能充分理解并據(jù)以實(shí)施。
在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、動(dòng)態(tài)隨機(jī)存取存儲器(DRAM)、其他類型的隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
如在說明書及權(quán)利要求當(dāng)中使用了某些詞匯來指稱特定組件。本領(lǐng)域技術(shù)人員應(yīng)可理解,硬件制造商可能會用不同名詞來稱呼同一個(gè)組件。本說明書及權(quán)利要求并不以名稱的差異來作為區(qū)分組件的方式,而是以組件在功能上的差異來作為區(qū)分的準(zhǔn)則。如在通篇說明書及權(quán)利要求當(dāng)中所提及的“包含”為一開放式用語,故應(yīng)解釋成“包含但不限定于”?!按笾隆笔侵冈诳山邮盏恼`差范圍內(nèi),本領(lǐng)域技術(shù)人員能夠在一定誤差范圍內(nèi)解決所述技術(shù)問題,基本達(dá)到所述技術(shù)效果。此外,“耦接”一詞在此包含任何直接及間接的電性耦接手段。因此,若文中描述一第一裝置耦接于一第二裝置,則代表所述第一裝置可直接電性耦接于所述第二裝置,或通過其他裝置或耦接手段間接地電性耦接至所述第二裝置。說明書后續(xù)描述為實(shí)施本申請的較佳實(shí)施方式,然所述描述乃以說明本申請的一般原則為目的,并非用以限定本申請的范圍。本申請的保護(hù)范圍當(dāng)視所附權(quán)利要求所界定者為準(zhǔn)。
還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的商品或者系統(tǒng)不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種商品或者系統(tǒng)所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的商品或者系統(tǒng)中還存在另外的相同要素。
圖1為一種分布式存儲系統(tǒng)的構(gòu)架圖,如圖1所示,其中,datanodes是真正存儲數(shù)據(jù)的數(shù)據(jù)節(jié)點(diǎn),本發(fā)明所述的數(shù)據(jù)節(jié)點(diǎn)不限于圖1所示,可以有多個(gè);namenodes是存儲數(shù)據(jù)的元數(shù)據(jù)的節(jié)點(diǎn)(簡稱元數(shù)據(jù)節(jié)點(diǎn)),本發(fā)明的元數(shù)據(jù)節(jié)點(diǎn)不限于圖1所示,可以包括多個(gè)。
基于圖1所示的系統(tǒng)架構(gòu)圖,例如,當(dāng)終端想在數(shù)據(jù)節(jié)點(diǎn)中寫數(shù)據(jù)時(shí),數(shù)據(jù)節(jié)點(diǎn)首先向元數(shù)據(jù)節(jié)點(diǎn)發(fā)起寫請求(如圖1中的DFSclient,一種請求消息),元數(shù)據(jù)節(jié)點(diǎn)接收到寫請求之后,元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存中保存有該寫請求中包括的待寫入數(shù)據(jù)的大小、存儲位置、名稱或標(biāo)識等元數(shù)據(jù)信息,記錄本次寫數(shù)據(jù)的日志,之后向數(shù)據(jù)節(jié)點(diǎn)返回寫請求的響應(yīng)消息并攜帶本次寫數(shù)據(jù)的日志,以使數(shù)據(jù)節(jié)點(diǎn)根據(jù)元數(shù)據(jù)節(jié)點(diǎn)返回的響應(yīng)消息將待寫入數(shù)據(jù)真正保存到數(shù)據(jù)節(jié)點(diǎn)中。
又例如,終端向從數(shù)據(jù)節(jié)點(diǎn)中讀數(shù)據(jù)時(shí),數(shù)據(jù)節(jié)點(diǎn)首先向元數(shù)據(jù)節(jié)點(diǎn)發(fā)起讀請求,元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存接收到讀請求之后,獲取讀請求中攜帶的待讀取數(shù)據(jù)的名稱或標(biāo)識等信息,元數(shù)據(jù)節(jié)點(diǎn)查詢元數(shù)據(jù)信息庫,獲取到與待讀取數(shù)據(jù)的名稱或標(biāo)識匹配的元數(shù)據(jù)信息,將獲取的元數(shù)據(jù)信息返回給數(shù)據(jù)節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)根據(jù)元數(shù)據(jù)節(jié)點(diǎn)返回的元數(shù)據(jù)信息,其中,元數(shù)據(jù)信息中有待讀取數(shù)據(jù)的存儲位置等信息,數(shù)據(jù)節(jié)點(diǎn)根據(jù)元數(shù)據(jù)信息可以將待讀取數(shù)據(jù)讀出展示給終端用戶。
因此,當(dāng)數(shù)據(jù)節(jié)點(diǎn)每操作一次數(shù)據(jù)時(shí),元數(shù)據(jù)節(jié)點(diǎn)都保存了該次操作數(shù)據(jù)的元數(shù)據(jù)信息以及操作日志,這樣元數(shù)據(jù)節(jié)點(diǎn)中保存有大量的元數(shù)據(jù)信息。元數(shù)據(jù)節(jié)點(diǎn)的可用性直接關(guān)系到整個(gè)存儲系統(tǒng)的可用性。當(dāng)元數(shù)據(jù)節(jié)點(diǎn)出現(xiàn)升級或者是進(jìn)程重啟時(shí),快速恢復(fù)元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存數(shù)據(jù)成為主要的需求點(diǎn)。
發(fā)明人在實(shí)現(xiàn)本發(fā)明的過程中發(fā)現(xiàn):現(xiàn)有技術(shù)中,在dump內(nèi)存鏡像時(shí),是直接將內(nèi)存的數(shù)據(jù)拷貝到磁盤中,隨著元數(shù)據(jù)的指數(shù)級增長,磁盤成為內(nèi)存鏡像的瓶頸,大量的元數(shù)據(jù)節(jié)點(diǎn)在dump內(nèi)存鏡像時(shí)需要占用的磁盤空間大,給磁盤造成較大的空間壓力問題。
本發(fā)明實(shí)施例采用的方案是:在dump內(nèi)存鏡像時(shí),根據(jù)內(nèi)存數(shù)據(jù)的大小采取不同的壓縮策略的方法,當(dāng)內(nèi)存數(shù)據(jù)小于一定閾值時(shí),不對內(nèi)存數(shù)據(jù)壓縮,當(dāng)內(nèi)存數(shù)據(jù)大于一定閾值時(shí),對內(nèi)存數(shù)據(jù)進(jìn)行壓縮。
本發(fā)明人在實(shí)現(xiàn)本發(fā)明的過程中發(fā)現(xiàn):
對于小于4k的數(shù)據(jù),如果每次都組成一個(gè)512k的緩存(buffer)進(jìn)行壓縮,并不能很多的減少數(shù)據(jù)大小,反而浪費(fèi)了處理器的處理資源,增加了內(nèi)存拷貝的時(shí)間,造成dump內(nèi)存鏡像的速度降低。因此,對于小于4k的數(shù)據(jù),采用將這部分小于4k的數(shù)據(jù)放置到一個(gè)非壓縮的buffer中,而這個(gè)buffer中存放的小于4k的數(shù)據(jù)一定是連續(xù)的,就是說相鄰的小于4k的數(shù)據(jù)塊間不能出現(xiàn)大于等于4k的數(shù)據(jù)。
例如,一個(gè)buffer是512k,那么buffer中的數(shù)據(jù)放置的過程可能是1k,2k,3k,不可能是1k,5k,2k,因?yàn)槌霈F(xiàn)5k時(shí),會換一個(gè)buffer來寫,這個(gè)buffer就將1k的數(shù)據(jù)寫下去。
進(jìn)一步地,Buffer中會記錄這段小于4k的數(shù)據(jù)的起始位置以及長度,通常,每一個(gè)buffer還有一個(gè)附屬記錄的變量,來記錄這個(gè)數(shù)據(jù)的起始位置。
對于大于等于4k的數(shù)據(jù):首先會將大于等于4k的數(shù)據(jù)拆包,一個(gè)數(shù)據(jù)最大為512k,在將拆包后的數(shù)據(jù)進(jìn)行壓縮時(shí),會自動(dòng)識別數(shù)據(jù)的大小,將小于4k數(shù)據(jù)的buffer解鎖掉,即直接進(jìn)行寫磁盤,然后將這部分小于4k的數(shù)據(jù)存放到buffer中。對于大于等于4k的數(shù)據(jù)采用多個(gè)線程進(jìn)行壓縮,每個(gè)線程會不斷的從需要壓縮的隊(duì)列中取出需要壓縮的大于等于4k的數(shù)據(jù),然后對大于等于4k的數(shù)據(jù)進(jìn)行壓縮。之后,將壓縮后的數(shù)據(jù)放到需要寫的隊(duì)列中,寫線程會不斷的從寫隊(duì)列中取出需要寫的壓縮后的數(shù)據(jù),寫到寫數(shù)據(jù)的buffer中。
需要注意的是,在寫數(shù)據(jù)到磁盤時(shí),為減少磁盤的輸入和輸出操作,寫數(shù)據(jù)時(shí),每2M數(shù)據(jù)寫一次磁盤,這樣就不會浪費(fèi)磁盤的輸入和輸出資源,也減少了對磁盤的操作壓力。
因此,本發(fā)明的技術(shù)方案中對內(nèi)存數(shù)據(jù)進(jìn)行壓縮后再寫磁盤,可以緩解dump內(nèi)存鏡像時(shí)的磁盤空間壓力,提高磁盤空間利用率;而且對內(nèi)存數(shù)據(jù)采用多線程進(jìn)行壓縮,提高dump內(nèi)存鏡像的速度和效率。
圖2為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖,如圖2所示,包括:
201、檢測內(nèi)存數(shù)據(jù)大??;
具體應(yīng)用場景是,元數(shù)據(jù)節(jié)點(diǎn)每隔一定時(shí)間去檢查內(nèi)存數(shù)據(jù)(如fsimage文件,該文件其實(shí)是元數(shù)據(jù)信息的文件),在每個(gè)檢查時(shí)間點(diǎn)(checkpoint)寫下內(nèi)存數(shù)據(jù)(如fsimage文件)。根據(jù)本發(fā)明的技術(shù)方案,在每個(gè)檢查時(shí)間點(diǎn)(checkpoint)寫下內(nèi)存數(shù)據(jù)(如fsimage文件)之前,需要檢測內(nèi)存數(shù)據(jù)大小,且根據(jù)內(nèi)存數(shù)據(jù)(如fsimage文件)的大小進(jìn)行不同的壓縮策略。
202、在檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊;
其中,每個(gè)數(shù)據(jù)塊的大小不超過所述第一閾值,本發(fā)明實(shí)施例中,第一閾值例如可以設(shè)置為512k;
例如,當(dāng)檢測到fsimage文件的大小大于512k時(shí),將fsimage文件拆 分為多個(gè)子文件,每個(gè)子文件的大小不超過512k。
需要說明的是,為了能夠識別子文件,每個(gè)拆分后的子文件攜帶有拆分前的母文件的標(biāo)識。
203、對每個(gè)數(shù)據(jù)塊進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)塊寫入磁盤。
具體地,為了減少寫磁盤的空間壓力,本發(fā)明實(shí)施例對每個(gè)數(shù)據(jù)塊進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)塊寫入磁盤;
進(jìn)一步地,為了提高寫磁盤的速度,節(jié)省寫磁盤的時(shí)間,本發(fā)明實(shí)施例可以采用多個(gè)線程對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮;
進(jìn)一步地,在對每個(gè)需要壓縮的數(shù)據(jù)塊進(jìn)行壓縮,生成每個(gè)需要壓縮的數(shù)據(jù)塊對應(yīng)的校驗(yàn)值,這里的校驗(yàn)值可以根據(jù)每個(gè)需要壓縮的數(shù)據(jù)塊內(nèi)容生成的一串字符,用這個(gè)來校驗(yàn)值對每個(gè)數(shù)據(jù)塊內(nèi)容做校驗(yàn),從而可以保證數(shù)據(jù)正確性,防止錯(cuò)誤數(shù)據(jù)的發(fā)生。
在發(fā)明另一個(gè)可選的實(shí)施方式中,在檢測到內(nèi)存數(shù)據(jù)的大小等于預(yù)設(shè)的第一閾值時(shí)(例如,當(dāng)檢測到fsimage文件的大小剛好等于512k時(shí)),對該內(nèi)存數(shù)據(jù)采用多線程進(jìn)行壓縮,并且生成該內(nèi)存數(shù)據(jù)的校驗(yàn)值,并將壓縮后的內(nèi)存數(shù)據(jù)寫入磁盤。
本發(fā)明實(shí)施例通過在dump內(nèi)存鏡像時(shí),當(dāng)內(nèi)存數(shù)據(jù)較大時(shí),對內(nèi)存數(shù)據(jù)進(jìn)行拆分為數(shù)據(jù)塊,且對每個(gè)拆分后的數(shù)據(jù)塊進(jìn)行多線程的壓縮,不僅可以加快dump內(nèi)存鏡像速度,而且可以提高磁盤的空間利用率。
圖3為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖,如圖3所示,包括:
301、檢測內(nèi)存數(shù)據(jù)大??;
參考圖2所示實(shí)施例的步驟201;
302、在檢測到內(nèi)存數(shù)據(jù)的大小小于預(yù)設(shè)的第二閾值時(shí),將小于所述第二閾值的內(nèi)存數(shù)據(jù)寫入磁盤;
其中,發(fā)明人在實(shí)現(xiàn)本發(fā)明的過程中發(fā)現(xiàn):對于小于4k的數(shù)據(jù),如果每次都組成一個(gè)512k的緩存進(jìn)行壓縮,并不能減少很多的內(nèi)存數(shù)據(jù)的大小,反而浪費(fèi)了因?yàn)閴嚎s需要消耗的處理資源,增加了內(nèi)存拷貝的時(shí)間,造成寫 checkpoint會比較慢,即導(dǎo)致dump內(nèi)存鏡像速度的降低,因此,本發(fā)明實(shí)施例中,將4k設(shè)置為第二閾值,小于4k的內(nèi)存數(shù)據(jù)不進(jìn)行壓縮。
進(jìn)一步地,在如圖2所示實(shí)施例的步驟202中,當(dāng)將內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊,其中存在小于第二閾值的數(shù)據(jù)塊時(shí),將小于第二閾值的數(shù)據(jù)塊寫入磁盤。
進(jìn)一步地,本發(fā)明實(shí)施例中,將小于第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊連續(xù)寫入磁盤,且記錄每個(gè)小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊的起始位置和數(shù)據(jù)長度,即小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊之間不存在大于等于所述第二閾值的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)。具體實(shí)現(xiàn)時(shí),例如,會將小于4k的數(shù)據(jù)放置到一個(gè)非壓縮的緩存(buffer)中,而這個(gè)非壓縮的buffer中存放的數(shù)據(jù)一定是連續(xù)的,就是說相鄰的小于4k的數(shù)據(jù)塊間不能出現(xiàn)大于等于4k的數(shù)據(jù)塊,這個(gè)非壓縮的Buffer中會記錄這段小于4k的數(shù)據(jù)塊的起始位置以及長度。
本發(fā)明實(shí)施例通過在dump內(nèi)存鏡像時(shí),當(dāng)內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊較小,即小于4k時(shí),對小于4k的數(shù)據(jù)塊不進(jìn)行壓縮,而是采用將小于4k的數(shù)據(jù)塊連續(xù)存放非壓縮的緩存中,不會消耗額外的處理資源,保證dump內(nèi)存鏡像速度,可以實(shí)現(xiàn)dump內(nèi)存鏡像速度和處理資源的平衡。
下面通過具體應(yīng)用對本發(fā)明實(shí)施例所述的方法進(jìn)行說明:
圖4為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像方法的流程圖,如圖4所示,包括:
401、檢測內(nèi)存數(shù)據(jù)大??;
在內(nèi)存數(shù)據(jù)的大小大于512k時(shí)執(zhí)行步驟402,在內(nèi)存數(shù)據(jù)小于4k時(shí)執(zhí)行步驟405。
402、將內(nèi)存數(shù)據(jù)拆分為多個(gè)數(shù)據(jù)塊;
假設(shè)內(nèi)存數(shù)據(jù)大小為10M(即10000k),每個(gè)數(shù)據(jù)塊的大小最大不超過512k,這樣,可以拆分為19個(gè)512k大小的數(shù)據(jù)塊,1個(gè)272k大小的數(shù)據(jù)塊;
假設(shè)內(nèi)存數(shù)據(jù)大小為1025k,按照每個(gè)數(shù)據(jù)塊的大小最大不超過512k,這樣,可以拆分為2個(gè)512k大小的數(shù)據(jù)塊,1個(gè)1k的數(shù)據(jù)塊;
當(dāng)數(shù)據(jù)塊的大小超過4k時(shí),執(zhí)行步驟403,當(dāng)數(shù)據(jù)塊的大小小于等于4k時(shí),執(zhí)行步驟404;
403、對于大于4k的數(shù)據(jù)塊采用多線程進(jìn)行壓縮;
例如,本發(fā)明實(shí)施例中設(shè)置一個(gè)512k的壓縮緩存(buffer),即給壓縮緩存打上需要壓縮的標(biāo)簽,對于超過4k的數(shù)據(jù)塊,將這些數(shù)據(jù)放入這個(gè)512k的壓縮緩存,然后放入到壓縮隊(duì)列中等待壓縮;為了加快壓縮速度,采用多線程進(jìn)行壓縮。
進(jìn)一步地,在壓縮每個(gè)數(shù)據(jù)塊時(shí),可以根據(jù)每個(gè)數(shù)據(jù)塊內(nèi)容產(chǎn)生該壓縮數(shù)據(jù)塊的校驗(yàn)值,用于保證該壓縮數(shù)據(jù)塊的正確性。
404、對壓縮后的數(shù)據(jù)塊寫入磁盤;
將每個(gè)壓縮后的數(shù)據(jù)塊放入到寫磁盤隊(duì)列中,在寫磁盤時(shí),為減少磁盤的輸入和輸出操作,每2M數(shù)據(jù)寫一次磁盤,也就是說,當(dāng)壓縮后的數(shù)據(jù)塊到2M時(shí)才進(jìn)行一次寫磁盤,這樣就不會浪費(fèi)磁盤的輸入和輸出資源,也減少了對磁盤的操作壓力。
405、對小于4k的數(shù)據(jù)塊不壓縮寫入磁盤。
例如,對小于4k的數(shù)據(jù)塊,將這些小于4k的數(shù)據(jù)塊放入512k的非壓縮緩存中,對于非壓縮緩存需要解鎖壓縮標(biāo)簽,即不放入壓縮隊(duì)列中,而是直接放入寫磁盤隊(duì)列中;
需要說明的是,在將小于4k的數(shù)據(jù)塊放入非壓縮的buffer中時(shí),存放的小于4k的數(shù)據(jù)塊在非壓縮的buffer中一定是連續(xù)的,就是說相鄰的小于4k的數(shù)據(jù)塊間不能出現(xiàn)大于等于4k的數(shù)據(jù)塊,這個(gè)非壓縮的Buffer中會記錄每一段小于4k的數(shù)據(jù)塊的起始位置以及長度。
在寫磁盤時(shí),為減少磁盤的輸入和輸出操作,每2M數(shù)據(jù)寫一次磁盤,也就是說,當(dāng)小于4k的數(shù)據(jù)塊放入非壓縮的buffer中達(dá)到2M時(shí)才進(jìn)行一次寫磁盤,這樣就不會浪費(fèi)磁盤的輸入和輸出資源,也減少了對磁盤的操作壓力。
如果沒有數(shù)據(jù)可以壓縮,那么線程會處于等待(condition wait)的狀態(tài),當(dāng)有新的數(shù)據(jù)需要壓縮時(shí)寫線程會發(fā)信號給(signal)壓縮線程。
本發(fā)明的技術(shù)方案中對內(nèi)存數(shù)據(jù)進(jìn)行壓縮后再寫磁盤,可以緩解dump內(nèi)存鏡像時(shí)的磁盤空間壓力,提高磁盤空間利用率;而且對內(nèi)存數(shù)據(jù)采用多線程進(jìn)行壓縮,提高dump內(nèi)存鏡像的速度和效率。
圖5為本發(fā)明實(shí)施例提供的一種元數(shù)據(jù)節(jié)點(diǎn)的內(nèi)存鏡像裝置的結(jié)構(gòu)圖,如圖5所示,包括:
檢測模塊51,用于檢測到內(nèi)存數(shù)據(jù)的大小
數(shù)據(jù)拆分模塊52,用于在檢測模塊檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊的大小不超過所述第一閾值;
壓縮模塊53,用于對所述數(shù)據(jù)拆分模塊拆分后的每個(gè)數(shù)據(jù)塊進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)塊通過寫入模塊54寫入磁盤。
可選地,所述壓縮模塊53,還用于在所述檢測模塊51檢測到內(nèi)存數(shù)據(jù)的大小等于預(yù)設(shè)的第一閾值時(shí),對所述內(nèi)存數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的內(nèi)存數(shù)據(jù)通過所述寫入模塊54寫入磁盤。
可選地,所述寫入模塊54,還用于所述檢測模塊51在檢測到內(nèi)存數(shù)據(jù)的大小小于預(yù)設(shè)的第二閾值時(shí),將小于所述第二閾值的內(nèi)存數(shù)據(jù)寫入磁盤。
可選地,所述寫入模塊54,還用于在所述檢測模塊51檢測到內(nèi)存數(shù)據(jù)的大小大于預(yù)設(shè)的第一閾值時(shí),將所述內(nèi)存數(shù)據(jù)拆分為一個(gè)以上的數(shù)據(jù)塊之后,若存在小于所述第二閾值的數(shù)據(jù)塊時(shí),將小于所述第二閾值的數(shù)據(jù)塊寫入磁盤。
可選地,所述寫入模塊54,具體用于將小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊連續(xù)寫入磁盤,且記錄每個(gè)小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊的起始位置和數(shù)據(jù)長度,即小于所述第二閾值的內(nèi)存數(shù)據(jù)或數(shù)據(jù)塊之間不存在大于等于所述第二閾值的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)。
可選地,所述壓縮模塊53,具體用于采用多個(gè)線程對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮。
可選地,所述壓縮模塊53,具體用于在對每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)進(jìn)行壓縮,生成每個(gè)需要壓縮的數(shù)據(jù)塊或內(nèi)存數(shù)據(jù)對應(yīng)的校驗(yàn)值。
圖5所示裝置可以執(zhí)行上述圖2-圖3任一實(shí)施例所述的方法,其實(shí)現(xiàn)原理和技術(shù)效果不再贅述。
本發(fā)明實(shí)施例還提供一種元數(shù)據(jù)節(jié)點(diǎn),包括圖3所示實(shí)施例所述的內(nèi)存鏡像裝置。
上述說明示出并描述了本發(fā)明的若干優(yōu)選實(shí)施例,但如前所述,應(yīng)當(dāng)理解本發(fā)明并非局限于本文所披露的形式,不應(yīng)看作是對其他實(shí)施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述發(fā)明構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識進(jìn)行改動(dòng)。而本領(lǐng)域人員所進(jìn)行的改動(dòng)和變化不脫離本發(fā)明的精神和范圍,則都應(yīng)在本發(fā)明所附權(quán)利要求的保護(hù)范圍內(nèi)。