本發(fā)明涉及計算機數(shù)據(jù)存儲技術(shù)領(lǐng)域,尤其涉及一種新型緩存系統(tǒng),具體涉及到新型掉電非易失性存儲器Persistent Memory和軟件RAID。
背景技術(shù):
隨著SSD的興起,主流的存儲系統(tǒng)都逐漸采用SSD與機械硬盤混合的分層存儲方式。目前的存儲方案例如dm-cache,其設計與實現(xiàn)均基于Linux Device Mapper框架,實質(zhì)上是通用的塊設備緩存模塊,利用SSD隨機讀寫性能好的特點,將SSD作為磁盤的緩存。與SSD相比,新生的非易失性存儲器(Persistent Memory,簡稱PMEM,也可稱為是持久性存儲器),具有高速I/O,大存儲容量,掉電非易失性和可字節(jié)尋址等卓越特性,因此提出一種基于Persistent Memory和軟件RAID的新型緩存系統(tǒng)。
非易失性存儲器:Persistent Memory,簡稱PMEM,其特點是完全斷電后信息不丟失。除了保證介質(zhì)數(shù)據(jù)掉電后不丟失的特性外,還具有可字節(jié)尋址(Byte-addressable)和I/O性能優(yōu)越等特性。在寫回模式(write back)下,此類設備根據(jù)材料不同,其寫耗費時間、讀耗費時間均逼近DRAM,因此將其作為軟件RAID的高速緩存十分有吸引力。現(xiàn)有的PMEM研究方案多集中于硬件領(lǐng)域,目前尚未有廠商和研究機構(gòu)推出結(jié)合PMEM與軟件RAID的解決方案提出。
AEP:Apache Pass,Intel公司為即將在2017年推出的服務器平臺“Purley”而研發(fā)的新一代Persistent Memory,在緩存系統(tǒng)中作為軟件RAID的緩存使用。
軟件RAID:Software Redundant Arrays of Independent Disks,稱作軟件獨立磁盤冗余陣列,簡稱軟件陣列。與硬件RAID相比,軟件RAID不需要外插RAID卡實現(xiàn),而是將若干機械硬盤或固態(tài)硬盤之類的底層存儲設備,以純軟件形式聚合成為一個大的虛擬RAID設備。借助PMEM作為高速緩存,軟件RAID可在成本遠低于硬件RAID的前提下,性能方面逼近甚至超過后者。Linux系統(tǒng)中目前以MD(Multiple Devices)虛擬塊設備的方式實現(xiàn)軟件RAID,利用多個底層的塊設備虛擬出一個新的虛擬塊設備,并且利用條帶化(stripping)技術(shù)將數(shù)據(jù)塊均勻分布到多個磁盤上來提高虛擬設備的讀寫性能。目前在Linux下,軟件RAID支持RAID-0、RAID-1、RAID-4,、RAID-5,RAID-6和RAID-10。
傳統(tǒng)軟件RAID方案瓶頸:嚴重依賴于服務器的CPU性能和電流負載,在寫回模式下,斷電故障會導致內(nèi)存中的數(shù)據(jù)丟失且無法恢復,與硬件RAID相比優(yōu)勢不明顯。PMEM作為近幾年興起的熱門新型存儲設備,目前尚未有廠商和研究機構(gòu)推出結(jié)合Persistent Memory與軟件RAID的解決方案,因此本發(fā)明選用在掉電介質(zhì)數(shù)據(jù)不丟失和I/O性能方面性能卓越的Persistent Memory作為軟件RAID的高速緩存,提出一種新型高效的緩存系統(tǒng)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是針對傳統(tǒng)軟件RAID解決方案在掉電恢復和讀寫性能方面的不足,并且針對目前尚未有非易失性存儲器(Persistent Memory,簡稱PMEM)與軟件RAID結(jié)合的方案推出,提出一種基于PMEM和軟件RAID的緩存系統(tǒng)。
本發(fā)明基于Linux的Device Mapper磁盤映射機制,開發(fā)內(nèi)核驅(qū)動模塊Buaacache,將高速設備PMEM作為低速RAID的高速緩存,從而構(gòu)建一個兩級緩存系統(tǒng)。
本發(fā)明所述內(nèi)核驅(qū)動模塊Buaacache將低速RAID與高速PEME作為一個整體創(chuàng)建為一個虛擬混合塊設備,用戶可像讀寫普通塊設備一樣使用混合塊設備。虛擬塊設備中的緩存設備PMEM與緩存對象RAID對用戶均不可見,用戶均無法直接訪問。用戶讀寫這個新創(chuàng)建的虛擬塊設備時,實際的存儲過程經(jīng)過Buaacache緩存,如果讀寫命中則直接返回緩存里的數(shù)據(jù)(或直接寫到緩存),否則將讀寫磁盤陣列。
本發(fā)明所述緩存設備PMEM的數(shù)據(jù)空間分為元數(shù)據(jù)空間和數(shù)據(jù)空間,采用組相聯(lián)映射方式,將數(shù)據(jù)空間劃分成預先定義大小的緩存塊,進一步將緩存塊按固定個數(shù)組合為一個組(Set)。元數(shù)據(jù)主要記錄硬盤塊與一個確定組中的某個緩存塊的一一映射關(guān)系,通過PMEM特有的字節(jié)尋址(Byte-addressable)方式實現(xiàn)讀寫。
本發(fā)明借助PMEM設備掉電后介質(zhì)數(shù)據(jù)不丟失的特性,彌補了傳統(tǒng)寫回機制掉電數(shù)據(jù)丟失的缺陷,避免對磁盤陣列的多次訪問,極大縮短了讀寫時間。采用及時回寫內(nèi)存元數(shù)據(jù)的方式,實現(xiàn)在緩存系統(tǒng)運行的過程中實時備份元數(shù)據(jù)到緩存設備,保存系統(tǒng)運行現(xiàn)場。當發(fā)生斷電事故后,主機重新上電后可從緩存設備中恢復系統(tǒng)運行現(xiàn)場,避免緩存中的臟數(shù)據(jù)因為失去與所緩存的磁盤塊的對應關(guān)系而無法寫回到磁盤,實現(xiàn)掉電恢復功能。
本發(fā)明選用開源方案dm-cache進行二次開發(fā),由于dm-cache作為Linux成熟內(nèi)核的一部分,可采用一個或多個快速設備為后端慢速存儲系統(tǒng)扮演緩存的角色。然而dm-cache最新版本僅可在內(nèi)核3.10版本上編譯運行,內(nèi)核版本跨度過大導致不能在新版本穩(wěn)定內(nèi)核上正常運行。鑒于目前尚未有新內(nèi)核移植版本發(fā)行,因此本發(fā)明進行了針對性移植工作。
附圖說明
圖1緩存系統(tǒng)Linux I/O層次圖;
圖2 Buaacache驅(qū)動模塊圖;
圖3緩存系統(tǒng)整體架構(gòu)圖;
圖4緩存設備Apache Pass結(jié)構(gòu)圖;
圖5緩存系統(tǒng)映射方式示意圖;
圖6緩存系統(tǒng)讀請求流程示意圖;
圖7緩存系統(tǒng)寫請求流程示意圖;
圖8內(nèi)核移植工作示意圖;
圖9 bio部分內(nèi)核移植示意圖;
圖10 Device Mapper部分內(nèi)核移植示意圖;
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點表達得更加清楚明白,下面結(jié)合附圖及具體實施例對本發(fā)明再作進一步詳細的說明。
本發(fā)明的目的針對目前基于軟件RAID的磁盤陣列系統(tǒng)在存儲性能和掉電數(shù)據(jù)易丟失等方面的不足,提出一種基于非易失性存儲器(Persistent Memory,簡稱PMEM)和軟件RAID的緩存系統(tǒng)。本發(fā)明基于Linux的Device Mapper機制,開發(fā)內(nèi)核驅(qū)動模塊Buaacache,采用Intel研發(fā)的PMEM設備Apache Pass,作為低速RAID的高速緩存。所述軟件RAID在Linux4.4內(nèi)核下通過mdadm軟件的“-C”或者“-create”參數(shù)完成創(chuàng)建,并由mdadm進行管理。
本發(fā)明在Linux I/O體系中的層次如圖1所示。如圖2所示,Buaacache運行在Linux 64位穩(wěn)定內(nèi)核4.4版本下,工作在Linux塊設備I/O體系結(jié)構(gòu)中的塊設備驅(qū)動層,注冊為Linux kernel Device Mapper框架下的目標驅(qū)動(Target Driver),以內(nèi)核驅(qū)動的方式動態(tài)加載使用。該驅(qū)動模塊調(diào)用Device Mapper中的dmsetup程序?qū)④浖疟P陣列和Apache Pass作為一個整體創(chuàng)建為一個混合塊設備,用戶可像讀寫普通塊設備一樣操作該設備。
本發(fā)明的系統(tǒng)結(jié)構(gòu)如圖3所示,當用戶執(zhí)行讀寫請求時,該請求首先被文件系統(tǒng)捕捉,由文件系統(tǒng)下發(fā)請求給通用塊設備層,具體以內(nèi)核數(shù)據(jù)結(jié)構(gòu)bio的形式呈現(xiàn),然后繼續(xù)下發(fā)給Device Mapper層,Device Mapper層對bio進行分割和重組等操作后,最終下發(fā)給Buaacache驅(qū)動層。
本發(fā)明的緩存結(jié)構(gòu)如圖4所示,每個非易失性存儲器Apache Pass的第一個緩存塊可作為超級塊(Super Block),用于存放整個緩存相關(guān)的關(guān)鍵信息,也可保留留作它用。緊接著元數(shù)據(jù)空間保存若干元數(shù)據(jù)(Meta Data),元數(shù)據(jù)區(qū)存儲用于管理數(shù)據(jù)緩存塊(Data Block)的元數(shù)據(jù)。數(shù)據(jù)區(qū)劃分為若干指定大小的數(shù)據(jù)緩存塊(Data Block),默認每8個扇區(qū)組成一個緩存塊,每512個緩存塊組成一個組(Set),同時軟件RAID中的硬盤也按此劃分。每個緩存塊記錄對應硬盤塊的起始扇區(qū)編號,由元數(shù)據(jù)結(jié)構(gòu)體記錄,每個元數(shù)據(jù)結(jié)構(gòu)體維護相應的狀態(tài),必要的鎖和tag信息。元數(shù)據(jù)和數(shù)據(jù)塊都是按照先后順序線性存放。
本發(fā)明的緩存映射方式如圖5所示。本發(fā)明采用512路組相聯(lián)映射機制,避免以元數(shù)據(jù)為代表的高熱度數(shù)據(jù)發(fā)生聚集現(xiàn)象。組相聯(lián)映射可分為直接映射和線性哈希探測兩步驟進行:第一步:直接映射,將磁盤塊映射到緩存設備中的一個組;第二部:線性哈希探測,一旦找到目標組,就在組內(nèi)線性查找對應的數(shù)據(jù)塊;通過組相聯(lián)映射可以將磁盤上局部范圍的順序數(shù)據(jù)塊緩存到一個目標組里。
本發(fā)明的緩存讀寫流程圖分別如圖6和圖7所示,本發(fā)明緩存回收機制僅支持寫回模式。當用戶讀寫請求未命中緩存時,并且緩存塊全部為臟塊無空閑緩存塊時,緩存回收機制采用Two-Handed時鐘算法,寫回最近20分鐘內(nèi)未訪問過的臟塊到磁盤陣列,維護了數(shù)據(jù)的一致性。
本發(fā)明的掉電恢復機制如圖8所示,本發(fā)明在用戶讀寫請求未命中時,一旦有元數(shù)據(jù)更新,以字節(jié)尋址方式從內(nèi)存及時寫入緩存設備。發(fā)生意外斷電事故后,內(nèi)存中的元數(shù)據(jù)均及時備份在緩存設備中,在主機重新上電后,Buaacache驅(qū)動模塊會將緩存設備中已備份的元數(shù)據(jù)重新加載到內(nèi)存中,然后將緩存設備中元數(shù)據(jù)對應的臟數(shù)據(jù)(因斷電從緩存未及時寫回磁盤陣列的數(shù)據(jù))寫回到RAID,實現(xiàn)掉電恢復。
本發(fā)明基于開源方案dm-cache進行二次開發(fā),如發(fā)明內(nèi)容所述,將dm-cache從內(nèi)核3.10版本移植到內(nèi)核4.4長期支持版本。移植工作對塊設備讀寫請求字段bio和Device Mapper中的部分字段進行內(nèi)核變更跟蹤,進行相應適配。bio是linux內(nèi)核中通用塊層的一個核心數(shù)據(jù)結(jié)構(gòu),負責聯(lián)系內(nèi)存緩沖區(qū)與塊設備。
如圖9所示,與內(nèi)核3.10版本相比,內(nèi)核4.4版本中的bio字段新增bvec_iter結(jié)構(gòu)體,封裝了原來屬于bio中bi_sector,bi_size,bi_idx和bi_bvec_done四個關(guān)鍵字段。
如圖10所示,Device Mapper框架提供同步或者異步的IO服務,在kernel 4.4中dm-io一共有四種dm_io_mem_type類型。與內(nèi)核3.10版本相比較,內(nèi)核4.4版本中,dm_io_memory用struct bio*bio替代struct bio_vec,dm_io_memtype用DM_IO_BIO替代DM_IO_BVEC。