宋 凱
中國(guó)傳媒大學(xué)文科科研處,北京 100024
現(xiàn)代化高校的數(shù)字圖書(shū)館改變傳統(tǒng)的紙質(zhì)媒體的信息查看和傳播方式而借助于網(wǎng)絡(luò)信息技術(shù),傳播各種以數(shù)字多媒體為存儲(chǔ)單位的知識(shí)、文獻(xiàn)信息,電子文獻(xiàn)資源、教師課件、課程視頻等。數(shù)字圖書(shū)館是用數(shù)字技術(shù)處理和存儲(chǔ)各種圖文并茂文獻(xiàn)的圖書(shū)館,實(shí)質(zhì)上是一基于種多媒體的信息分享系統(tǒng)。通過(guò)數(shù)字圖書(shū)館所提供的搜索功能,提高了讀者檢索資源的效率;同時(shí),通過(guò)數(shù)字圖書(shū)館提供的web端、移動(dòng)端等相關(guān)應(yīng)用平臺(tái)極大的提高了讀者的訪問(wèn)便利度。數(shù)字圖書(shū)館需要大量的磁、光、電等新型存儲(chǔ)媒介來(lái)存儲(chǔ)文本、圖像、聲音、動(dòng)畫(huà)、影視作品等文獻(xiàn)信息資源的數(shù)字化信息[1]。海量數(shù)據(jù)信息的存儲(chǔ)和管理是數(shù)字圖書(shū)館的顯著特征之一。數(shù)字圖書(shū)館數(shù)據(jù)信息資源的種類、數(shù)量、性質(zhì)及其使用方式等均對(duì)讀者訪問(wèn)的性能、資源的傳輸速度、可靠性等方面起著決定性的作用。數(shù)字圖書(shū)館具有系統(tǒng)用戶數(shù)量龐大,并發(fā)存取海量數(shù)據(jù)及業(yè)務(wù)類型多的特點(diǎn)。
數(shù)字圖書(shū)館的數(shù)據(jù)信息種類繁多,形式復(fù)雜多樣,數(shù)據(jù)的重要性程度不一,數(shù)據(jù)訪問(wèn)方式各異,因而不同的數(shù)據(jù)類型則對(duì)讀寫(xiě)性能等方面有不同的要求[1]。大文件的順序讀寫(xiě),如視頻數(shù)據(jù)等多媒體資源,讀寫(xiě)數(shù)據(jù)量很大,要求數(shù)據(jù)存儲(chǔ)吞吐量性能高。小文件隨機(jī)讀,如數(shù)字期刊、數(shù)字圖書(shū)等,資源訪問(wèn)頻率很高,下載流量也比較大,對(duì)存儲(chǔ)系統(tǒng)的IOPS要求很高。因此如何在復(fù)雜的數(shù)據(jù)環(huán)境中提升存儲(chǔ)系統(tǒng)的I/O性能以滿足數(shù)字圖書(shū)館各種數(shù)據(jù)訪問(wèn)的要求是一個(gè)急需要解決的問(wèn)題。
因此,針對(duì)上述問(wèn)題本文提出一種適用于數(shù)字圖書(shū)館應(yīng)用環(huán)境的存儲(chǔ)系統(tǒng)性能優(yōu)化方法KVCache,其基本原理為將最近訪問(wèn)的文件保持在由高速非易失性存儲(chǔ)介質(zhì)組成的緩存層中,下次訪問(wèn)相同的文件數(shù)據(jù)時(shí)則不需要再訪問(wèn)低速的磁盤(pán),直接從緩存層中得到,以獲得較高的 I/O 性能。該優(yōu)化方法的特點(diǎn)主要包含以下方面:
1)采用非易失性高速存儲(chǔ)設(shè)備,例如SSD,作為存儲(chǔ)系統(tǒng)的緩存層存儲(chǔ)介質(zhì),充分保障數(shù)據(jù)在各種應(yīng)用環(huán)境下的性能[8]。
2)采用Key-Value技術(shù)實(shí)現(xiàn)了緩存的持久化存儲(chǔ),提升了存儲(chǔ)系統(tǒng)的訪問(wèn)性能。
3)利用多級(jí)存儲(chǔ)下的兩段更新事務(wù)原子性管理,在提升存儲(chǔ)系統(tǒng)I/O性能的前提下,保證多級(jí)存儲(chǔ)數(shù)據(jù)一致性和可靠性。
目前緩存對(duì)于緩存的研究主要集中在通用塊層。
FlashCache是Linux內(nèi)核中的一種磁盤(pán)緩存實(shí)現(xiàn)模塊,于2010年由Facebook公司開(kāi)發(fā),F(xiàn)lashCache的具體實(shí)現(xiàn),將請(qǐng)求IO以一定的哈希映射關(guān)系同時(shí)映射到閃存設(shè)備和磁盤(pán)設(shè)備中。并在讀寫(xiě)路徑中,先請(qǐng)求閃存設(shè)備,再請(qǐng)求磁盤(pán)設(shè)備,從而實(shí)現(xiàn)了使用閃存設(shè)備對(duì)傳統(tǒng)磁盤(pán)進(jìn)行緩存的設(shè)計(jì)。磁盤(pán)與閃存之間的映射,F(xiàn)lashCache使用了對(duì)磁盤(pán)以及閃存邏輯上進(jìn)行條帶化,哈希映射的方式完成[5]。
BCache作為同樣實(shí)現(xiàn)在Linux內(nèi)核中的一種磁盤(pán)緩存實(shí)現(xiàn),其則是基于通用塊層實(shí)現(xiàn)的,與FlashCache不同,其實(shí)現(xiàn)與IO調(diào)度層之上,可以使用更少的設(shè)備來(lái)緩存整個(gè)存儲(chǔ)子系統(tǒng)的數(shù)據(jù)。同時(shí),由于其實(shí)現(xiàn)于通用塊層,BCache可以有效利用閃存設(shè)備對(duì)隨機(jī)IO讀寫(xiě)的優(yōu)異性能,將隨機(jī)IO組合為順序IO再寫(xiě)入傳統(tǒng)磁盤(pán)中,大大增加了磁盤(pán)的讀寫(xiě)能力。
塊存儲(chǔ)方案用于實(shí)現(xiàn)持久化緩存,可以將緩存模型簡(jiǎn)化,也是傳統(tǒng)緩存模型常用的解決方案。使用塊存儲(chǔ)接口調(diào)用持久化緩存設(shè)備,可以將設(shè)備直接與內(nèi)存中的緩存塊相映射,從而快速索引持久化設(shè)備中的緩存數(shù)據(jù)。然而此方式的缺點(diǎn)是,由于塊存儲(chǔ)方案存儲(chǔ)流程非常簡(jiǎn)單,通過(guò)對(duì)內(nèi)核的系統(tǒng)調(diào)用實(shí)現(xiàn)數(shù)據(jù)的存取,如果在寫(xiě)入過(guò)程中阻塞等待內(nèi)核塊接口的完成回調(diào)則損失了緩存性能,而如果不阻塞等待則無(wú)法達(dá)到第一階段寫(xiě)事務(wù)的原子性和可靠性要求[2]。
而基于Key-Value的方式則很好地解決了塊存儲(chǔ)方案的缺點(diǎn)。Key-Value的方式可以很好地完成內(nèi)存與磁盤(pán)設(shè)備的映射過(guò)程,因而邏輯視圖上對(duì)于持久化緩存項(xiàng)和內(nèi)存緩存項(xiàng)的映射規(guī)則簡(jiǎn)單,模型類似塊存儲(chǔ)緩存方案;而對(duì)于更新操作的一致性和可靠性以及性能特點(diǎn),又可以超越塊存儲(chǔ)緩存方案。
KVCache的實(shí)現(xiàn)主要包括:key-Value原子更新策略、緩存數(shù)據(jù)分布與置換策略。
當(dāng)更新I/O請(qǐng)求到達(dá)時(shí),需要將I/O請(qǐng)求通過(guò)分割成多個(gè)細(xì)顆粒度的對(duì)象請(qǐng)求,并且為每個(gè)對(duì)象請(qǐng)求將創(chuàng)建一個(gè)更新事務(wù),如圖1所示。
第一階段的寫(xiě)事務(wù)將對(duì)象請(qǐng)求更新提交到保存在內(nèi)存中的緩存目錄,并同時(shí)提交到內(nèi)存緩存。完成對(duì)內(nèi)存緩存的更新后,又將根據(jù)更新的緩存目錄,將緩存寫(xiě)入到持久化緩存設(shè)備中。
第二階段的寫(xiě)事物則是待Flush線程達(dá)到某個(gè)預(yù)設(shè)值時(shí),將本地緩存寫(xiě)回到后端存儲(chǔ)設(shè)備中。為了保證第二階段寫(xiě)事務(wù)的可靠性和一致性,需要在第一階段寫(xiě)事務(wù)完成后,以日志形式將該事務(wù)記錄在持久化緩存中,并在第二階段寫(xiě)事務(wù)完成后將該日志刪除。
KVCache中使用LevelDB作為持久化緩存接口,將對(duì)象緩存數(shù)據(jù)合并成可以并行讀寫(xiě),快速索引的磁盤(pán)數(shù)據(jù)因而本文選擇使用鍵值對(duì)存儲(chǔ)方案LevelDB來(lái)完成系統(tǒng)對(duì)數(shù)據(jù)的持久化緩存[4]。
LevelDB是一個(gè)開(kāi)源的鍵值對(duì)存儲(chǔ)方案,其使用LSM樹(shù)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),并利用內(nèi)存暫存區(qū)設(shè)計(jì)優(yōu)化了寫(xiě)性能,通過(guò)將內(nèi)存中數(shù)據(jù)和持久化后數(shù)據(jù)進(jìn)行多級(jí)存儲(chǔ),簡(jiǎn)化了索引對(duì)內(nèi)存產(chǎn)生的開(kāi)銷。同時(shí),由于LevelDB本身的鍵值對(duì)語(yǔ)義與內(nèi)存緩存使用的map語(yǔ)義十分契合,減少了存儲(chǔ)接口轉(zhuǎn)換帶來(lái)的開(kāi)銷。
圖2為KVCache對(duì)于更新請(qǐng)求結(jié)合LevelDB所進(jìn)行的數(shù)據(jù)流圖。為了提高數(shù)據(jù)寫(xiě)入性能,LevelDB對(duì)緩存持久化的操作其實(shí)是一個(gè)異步事務(wù)。也就是圖中看到當(dāng)寫(xiě)操作寫(xiě)入LevelDB的memtable中后,并不是立刻會(huì)被寫(xiě)入LevelDB SSTable。LevelDB 會(huì)將多個(gè)更新操作進(jìn)行合并和等待到某預(yù)設(shè)值到達(dá),才將數(shù)據(jù)寫(xiě)入imm_memtable,并分級(jí)存儲(chǔ)到SSTable中。但是由于LevelDB本身的事務(wù)原子性管理,系統(tǒng)可以完全假設(shè)當(dāng)數(shù)據(jù)寫(xiě)入LevelDB的memtable時(shí),即完成了對(duì)持久化緩存的寫(xiě)入事務(wù),因而系統(tǒng)可以向系統(tǒng)提交緩存更新成功響應(yīng)。
圖2 單節(jié)點(diǎn)多級(jí)緩存更新事務(wù)處理流程
本文設(shè)計(jì)了緩存目錄,用于記錄與管理所有的緩存數(shù)據(jù)。緩存目錄只用于記錄緩存的最新版本號(hào),本地版本號(hào),后端版本號(hào)以及所在位置。緩存目錄主要結(jié)構(gòu)如表1所示。
通過(guò)版本號(hào)記錄更新事務(wù)的狀態(tài)以及是否可提供讀操作。寫(xiě)請(qǐng)求映射到緩存目錄后,最新緩存版本號(hào)(version)首先被更新,從而表明該緩存有更新的數(shù)據(jù)將存入,而其余本地版本號(hào)(lversion)以及后端版本號(hào)(bversion)不同則標(biāo)記了該寫(xiě)事務(wù)并未完成,如圖3所示。由于KVCache基于內(nèi)存緩存與持久化緩存進(jìn)行兩級(jí)緩存,所以當(dāng)寫(xiě)事務(wù)已成功提交給內(nèi)存緩存與持久化緩存時(shí),第一階段寫(xiě)事務(wù)已完成。對(duì)于后端的寫(xiě)提交為一個(gè)新的寫(xiě)事務(wù),通過(guò)異步寫(xiě)操作執(zhí)行。當(dāng)提交給后端的寫(xiě)操作完成后,緩存目錄的后端版本號(hào)更新至提交該操作時(shí)的最新緩存版本號(hào)。緩存更新事件在任一狀態(tài)時(shí)失敗,則可以通過(guò)緩存目錄有效回滾回上一個(gè)狀態(tài)點(diǎn),且重新執(zhí)行該寫(xiě)事務(wù),保證了更新事務(wù)的原子性。
圖3 緩存目錄項(xiàng)狀態(tài)轉(zhuǎn)換
由于緩存設(shè)備的空間有限,且內(nèi)存存儲(chǔ)空間遠(yuǎn)小于持久化設(shè)備的緩存空間,當(dāng)緩存空間不足時(shí)的換出策略則變成多級(jí)緩存的另一個(gè)重要問(wèn)題。KVCache中內(nèi)存緩存與持久化緩存之間采用直寫(xiě)策略。持久化緩存到后端采用寫(xiě)回策略。
KVCache使用LRU(Latest Recent Update)替換算法來(lái)完成在緩存空間不足時(shí)的剔除管理。
由于目錄緩存記錄了所有在緩存中的數(shù)據(jù),因而系統(tǒng)在對(duì)象緩存數(shù)據(jù)被內(nèi)存緩存LRU換出后,并不需要因此對(duì)緩存目錄進(jìn)行修改;而當(dāng)持久化緩存設(shè)備空間不足時(shí),系統(tǒng)則需要修改緩存目錄。
KVCache通過(guò)LRU類來(lái)記錄存儲(chǔ)在內(nèi)存緩存中的所有對(duì)象緩存項(xiàng)指針以及保存在緩存目錄中的所有指針。LRU類以被更新時(shí)間作為視圖,記錄被定義為L(zhǎng)RU對(duì)象的指針列表。通過(guò)該方式,只需要在每次更新內(nèi)存緩存與更新緩存目錄時(shí),通過(guò)將LRU指針列表中該項(xiàng)提到列表頂部,則在空間不足時(shí),只需要將LRU對(duì)象底部指針指向的數(shù)據(jù)在緩存中刪除則完成了系統(tǒng)的緩存替換算法。
實(shí)驗(yàn)環(huán)境基于SAN的架構(gòu),存儲(chǔ)設(shè)備中采用8GB的內(nèi)存,使用40GB的SSD作為KVCache的持久化緩存[3][6][7]。SAN與應(yīng)用服務(wù)器采用1Gb以太網(wǎng)進(jìn)行互聯(lián)。測(cè)試模擬在數(shù)字圖書(shū)館的應(yīng)用環(huán)境下的流媒體文件的順序讀寫(xiě)和小文件的隨機(jī)讀寫(xiě)為主的數(shù)據(jù)訪問(wèn)方式。
讀寫(xiě)性能對(duì)比測(cè)試見(jiàn)圖4。
實(shí)驗(yàn)結(jié)果表明,在使用了KVCache的存儲(chǔ)系統(tǒng)中,所有壓力測(cè)試節(jié)點(diǎn)的順序讀帶寬總和為111MB/s,順序?qū)憥挒?13MB/s,基本接近千兆網(wǎng)卡傳輸上限。
小文件的隨機(jī)讀寫(xiě)模擬測(cè)試通過(guò)二組數(shù)據(jù)完成:(a) 沒(méi)有加入緩存系統(tǒng)隨機(jī)讀寫(xiě)測(cè)試。(b) 使用300G空間進(jìn)行持久化緩存隨機(jī)讀寫(xiě)測(cè)試。(c) 使用16G內(nèi)存空間進(jìn)行緩存隨機(jī)讀寫(xiě)測(cè)試。
圖4 順序讀寫(xiě)帶寬
圖5 隨機(jī)寫(xiě)性能比較
圖5為模擬隨機(jī)小文件寫(xiě)性能測(cè)試結(jié)果。橫坐標(biāo)為不同的客戶節(jié)點(diǎn),縱坐標(biāo)為每一個(gè)VM使用IOSTAT獲取到的IOPS。通過(guò)對(duì)于總的IOPS計(jì)算發(fā)現(xiàn),內(nèi)存緩存與SSD緩存得到了幾乎相同的IOPS數(shù)。由于使用內(nèi)存作為緩存的過(guò)程中,系統(tǒng)內(nèi)存空間上限為16G,所以僅使用10G內(nèi)存空間作為緩存。而系統(tǒng)的持久化緩存策略與內(nèi)存緩存策略均使用寫(xiě)回方式,因而內(nèi)存緩存和持久化緩存獲得了幾乎相同的每秒吞吐量。同時(shí)可以看出由于KVCache使用了高速SSD進(jìn)行緩存,I/O請(qǐng)求在一定范圍內(nèi)均在SSD中命中,因而全面提升隨機(jī)I/O的性能,可以看到其擁有幾乎僅使用HDD作為后端9倍的吞吐量。
圖6 隨機(jī)讀性能比較
如圖6模擬隨機(jī)小文件讀性能上,KVCache使用SSD作為持久化緩存后的性能優(yōu)勢(shì)更明顯。實(shí)驗(yàn)結(jié)果可見(jiàn),由于KVCache使用SSD作為緩存,并且采用Keyvalue的方式進(jìn)行緩存數(shù)據(jù)的更新,使得其隨機(jī)讀總帶寬達(dá)到26.11MB/s,其讀寫(xiě)性能基本上達(dá)到了內(nèi)存讀的性能。
針對(duì)高校數(shù)字圖書(shū)館的多樣化數(shù)據(jù)訪問(wèn)的應(yīng)用環(huán)境,提出了適用于數(shù)字圖書(shū)館應(yīng)用環(huán)境的存儲(chǔ)系統(tǒng)性能優(yōu)化方法KVCache,包括key-Value原子更新策略和數(shù)據(jù)分布與置換策略等內(nèi)容。KVCache利用SSD閃存設(shè)備和key-Value技術(shù)實(shí)現(xiàn)緩存數(shù)據(jù)的緩存持久化存儲(chǔ),并且利用多級(jí)存儲(chǔ)下的兩段更新事務(wù)原子性管理,保證多級(jí)存儲(chǔ)數(shù)據(jù)一致性和可靠性。
通過(guò)模擬實(shí)驗(yàn)表明KVCache有效的增加了存儲(chǔ)系統(tǒng)中的數(shù)據(jù)在順序讀寫(xiě)、隨機(jī)讀寫(xiě)下的性能,并且使其隨機(jī)讀寫(xiě)性能接近本地內(nèi)存讀寫(xiě)性能。
[1]黎春蘭,鄧仲華.信息資源視角下云計(jì)算面臨的挑戰(zhàn)[J].圖書(shū)與情報(bào),2011(3):23-28.
[2]Fred Douglis and John K. Ousterhout. Beating the I/O bottleneck: A case for logstructured files systems. Technical Report UCB/CSD 88/467, Universityof California, Berkeley, October 1988.
[3]Howard Gobioff, Garth Gibson, and Doug Tygar. Security for network attached storage devices.Technical Report TR CMU-CS-97-185, Carniege Mellon,October 1997.
[4]LevelDB. leveldb: A fast and lightweight key/value database library by Google.
[5]Alex Robson. Consistent Hashing. http://sharplearningcurve.com/blog/2010/09/27/consistenthashing/,September 2010.
[6]T. Clark.Designing Storage Area Networks: A Practical Reference for Implementing Fibre Channel and IP SANS (Second Edition). Addison-Wesley Networking Basics Series, 2003.
[7]D. Nagle, G. Ganger, J. Butler, et al.Network Support for Network-Attached Storage. In:Proceedings of Hot Interconnects. 18-20, 1999.
[8]Kim Y, Gupta A, Urgaonkar B, et al.Hybridstore: A cost-efficient, high-performance storage system combining SSDs and HDDs[C]//Modeling,Analysis & Simulation of Computer and Telecommunication Systems (MASCOTS), 2011 IEEE 19th International Symposium on. IEEE, 227-236. 2011.