王海霞,趙正軍
(1.中國電信股份有限公司研究院,廣州 510630;2.廣州智光自動化有限公司,廣州 510760)
隨著互聯網和信息技術不斷發展,數據信息對經濟和社會生活產生重大影響,我們進入了一個信息爆炸的時代,每個行業每天都在制造和產生大量數據。IDC白皮書預測到2025年,全球的數據總量將高達163ZB。尤其是物聯網、5G和人工智能等新技術等各種應用產生的數據,呈現指數級增長,甚至可能會涌現高達百億級的海量小文件。海量小文件(Lots Of Small Files,LOSF)在數據訪問和存儲等方面面臨巨大的挑戰,日漸成為業屆公認的難題。
海量小文件問題簡稱LOSF,通常是指文件大小在1MB以內,數量級別在百萬及以上。典型應用場景,例如我們生活中常用的最大電子商務網站淘寶,系統平臺上保存大量的圖片文件,平均大小僅為15KB,總量至少超過200億張。還有著名的社交網站Facebook,系統存儲了600億張以上的圖片。還有動漫渲染的后期制作過程中需要大量的視音頻素材,這些文件的大小都集中在10-20KB之間,數量通常超過500萬個。
目前的文件系統,例如本地文件系統、分布式文件系統等,在數據管理、數據存儲和緩存管理等實現方式和策略都是針對大文件設計的,例如GlusterFS、GFS、HDFS,海量小文件在現有的文件系統的存儲效率比較低,甚至無法實現快速訪問。
如果忽略成本的因素,最直接的優化策略就是升級硬件配置,通過降低數據訪問時間來提高LOSF性能。例如,存儲介質用SSD替換原有的機械硬盤,或者增加存儲的Cache,或者采用分層存儲的部署,這樣可以大大提升IOPS/OPS的讀寫性能;或者采用處理性能更強的CPU,直接有效地提升并發處理能力及I/O訪問速度;還可以增大內存容量,顯著提高數據讀寫緩存命中率;以及使用傳輸效率更高的網絡設備,網絡訪問的帶寬高,延時小,這樣事務并發處理效率高,數據訪問的吞吐量大。硬件優化的核心思想,就是通過提升硬件的性能,消除I/O物理通道上的障礙,但是代價是成本較高。
Cache技術的優化思路是用空間換取時間,通過提高數據訪問的緩存命中率,突破數據訪問的時間和空間的限制,提升文件訪問的性能。Cache技術可以應用到多個領域,例如CPU的Cache、存儲介質Cache和文件系統的Cache等。Cache技術的特點是先將數據集中讀寫到Cache中,然后再將數據用異步的方式移到穩定的存儲介質上。Cache技術通過異步的數據存取的模式來解決數據高并發訪問和延時的問題,有效減小存儲介質的訪問次數,來進一步提高存儲的效率。但是Cache容量不能無止境的增加,當達到一定閾值時,即便再繼續增大Cache容量,Cache的命中率也不會有顯著提高。
Cache技術對訪問過的數據進行短時間的保留,但是如果數據更新頻繁,緩存在性能改善方面的影響不再明顯,因此針對大量小文件的訪問,可以采用先預測頻繁訪問的文件集合,預先讀到Cache系統中,有效提高系統存儲的性能。預存取是一種主動緩存的技術,它充分利用數據的空間局部性,對未來可能發生的數據訪問請求進行預測,在實際訪問之前讀取數據并緩存,方便用戶快速訪問,有效減少數據訪問的時延。對于用戶來說,不是所有的預測都是有效的,正確的預測可以提升系統的性能,而不正確的預測就會造成Cache的浪費,I/O帶寬的占用,還有數據訪問的延時。
對于大量小文件而言,可以采用小文件合并存儲的優化策略,首先,減少元數據數量。先將多個小文件合并成一個大文件,通過減少文件數量來提升元數據的訪問和查詢效率,減少文件讀寫的I/O操作次數,節約數據傳輸的時間。合并成大文件存儲在文件系統上,可以降低文件系統的I/O的壓力,提升存儲性能。在小文件合并存儲的同時,會生成索引文件,訪問數據時通過索引來查找,索引文件可以先預存到Cache中,這樣讀寫小文件時,只需要一次I/O就可實現。
對比傳統的文件系統,文件的元數據和數據是存儲在文件系統的不同的地方,而小文件合并存儲的方式是將元數據和數據連續存儲在大文件中,這樣增加了單個小文件內部的數據局部性,存儲系統上的I/O方式由隨機轉換成了順序,大大提高I/O讀寫性能。此外,采用小文件單獨存儲,磁盤上會產生大量的碎片。采用小文件合并存儲的方式,磁盤上的碎片會隨著文件數量大幅減少而降低,有效提高LOSF存儲效率。
傳統的文件系統,系統讀寫文件時,主要的系統開銷在open調用方面,例如路徑查找和路徑解析。采用小文件合并存儲的機制,I/O訪問流程也會發生變化,多個小文件合并成一個大文件,open系統調用的開銷轉換成了seek操作,先訪問Cache中的索引,再在大文件對應的位置上查找,節省了之前的大部分的系統調用的開銷。
小文件合并存儲的方式,對于存在大量修改和刪除操作的存儲系統不是很適用。文件在修改和刪除操作時,存儲系統會產生大量碎片,執行碎片整理,又會產生額外系統開銷。如果不進行空間整理,采用直接追加寫的方式,就會導致數據分布的隨機性增加,浪費存儲空間,降低性能,這些問題的存在,是小文件合并存儲的優化策略所面臨的挑戰。
綜上所述,小文件合并存儲是解決目前LOSF問題最為有效的策略。著名的社交網站Facebook和電子商務網站淘寶等都采用了這種方式。小文件合并存儲的機制,核心思想是將多個小文件合并成一個大文件中,合并時同步生成索引文件,小文件的元數據,例如位置信息、文件名稱等與實際文件是分開存儲的,在具體訪問文件的時候,會首先獲取元數據的offset和size等關鍵信息,然后依據索引檢索實際文件。
但是這種合并存儲方法也存在以下一些問題:
小文件以合并存儲的方式存放到磁盤上,小文件之間需要嚴格的邊界來區分,一旦寫入便不能再修改邊界,因此在不同數據塊上修改或刪除單個小文件時,無法立即回收存儲空間,會產生一些磁盤碎片,不僅造成訪問性能下降,還導致磁盤空間浪費。
本文提出對一種改進的小文件合并存儲的方法,針對現有的小文件合并存儲的方法在修改和刪除單個小文件時,無法立即回收存儲空間,導致磁盤空間浪費等問題,提出以文件的大小為參數,先對小文件進行分組,再對同一組的小文件進行合并存儲在同一個數據塊中,存儲時優先選擇數據塊中空閑的單元。在修改單個小文件時,如果修改后的文件大小發生變化,就將小文件移至其對應的文件組里,存儲到相應的數據塊里;如果修改后的文件大小不變,就直接修改。這樣可以減少因修改和刪除單個小文件產生的數據塊中空閑單元,優化數據布局,及時回收存儲空間,提高磁盤空間的利用率,彌補現有的合并存儲方法的不足。
(1)客戶端發出請求
(2)判斷文件大小
(3)根據文件大小選擇數據塊組group_x
(4)在數據塊組 group_x中找到一個可寫的block_id
(5)判斷block_id中是否有空閑的存儲單元
(6)如果沒有,對同一組待寫的小文件合并成一個大文件,如果有,在block_id中選擇空閑的存儲單元
(7)把文件寫入磁盤,同時生成元數據+索引文件
(8)向客戶端返回成功信息
小文件合并存儲改進方案在新增文件時,會以文件的大小為參數,先對小文件進行分組,再對同一組的小文件進行合并存儲在同一個數據塊中,存儲時優先選擇block中空閑的單元。而原有方案不考慮文件大小,對新增文件直接合并,以追寫的方式,存儲在數據塊中。

圖1 新增文件流程圖
(1)客戶端請求
(2)查找文件的元數據,獲取文件名稱、位置信息等屬性
(3)確認文件所在group_x和block_id
(4)根據元數據和索引表的文件名稱、offset和size,找到文件File_xx
(5)刪除File_xx,修改文件File_xx的存儲單元變為空閑狀態,同時更新元數據和索引表
(6)向客戶端返回成功信息
小文件合并存儲改進方案在刪除文件時,會將文件所在的存儲單元修改為空閑狀態,當有相同大小的文件寫入時,優先考慮。

圖2 修改文件流程圖
(1)客戶端請求
(2)判斷文件大小是否變化
(3)如果是,把文件File_xx看作一份新文件處理,增加新文件(詳見新增文件流程),刪除舊文件(詳見刪除文件流程)
(4)如果不是,查找文件的元數據,獲取文件名稱、位置信息等屬性,確認文件所在group_x和block_id,根據元數據和索引表的文件名稱、offset和size,找到文件File_xx,修改 File_xx
(5)向客戶端返回成功信息
小文件合并存儲改進方案在修改文件時,會先判斷文件大小是否發生改變,如果發生改變,會將文件看作一份新文件處理,同時刪除舊文件。

圖3 刪除文件流程圖
小文件合并存儲改進方案相對于現有方案,具備以下優點:
(1)及時回收存儲空間,有效減少磁盤碎片;
(2)優化數據布局,提高磁盤空間的利用率;
(3)顯著提高存儲系統的數據訪問的效率。
小文件合并存儲改進方案將來可能的應用場景,分布式存儲系統和海量小文件云存儲等。
本文在分析海量小文件存儲的主要問題的基礎上,探討了LOSF優化策略,提出了一種小文件合并存儲的改進方法和流程,具體包括新增文件、刪除文件和修改文件的流程,并闡明了小文件合并存儲改進方案的主要優點,為小文件合并存儲提供了一種解決方案。