源于10年大數(shù)據(jù)項目實踐經(jīng)驗,博睿宏遠開源海量小文件存儲技術(shù)
博睿宏遠10年深耕APM技術(shù)領域,致力于技術(shù)創(chuàng)新,推出了眾多行業(yè)領先產(chǎn)品,如Bonree SDK、Bonree Browser、Bonree Server等,這些產(chǎn)品每天都會回收大量的數(shù)據(jù)文件進行存儲,如網(wǎng)頁截圖、網(wǎng)絡抓包、代碼堆??煺盏?,由于此類文件體積小但數(shù)量多的特點,導致在存儲上會遇到很多問題。如使用系統(tǒng)原生文件系統(tǒng)進行存儲,則會遇到Linux索引節(jié)點(inode)耗盡導致磁盤存儲空間無法有效利用的問題,同時也無法原生支持分布式及高可用的要求。但如果采用HDFS或HBASE方案存儲,則一方面硬件資源開銷較大,NameNode內(nèi)存開銷過大的問題,同時該方案讀寫效率也不足夠高效,尤其當內(nèi)部進行塊文件合并時集群I/O壓力過大的時候,讀寫效率更是難以保證。
博睿宏遠以10年大數(shù)據(jù)項目實踐經(jīng)驗,針對海量(10億個文件以上)小文件(普遍大小在1KB-50KB)的分布式存儲的場景,打磨出BRFS(即:Bonree Distributed FileSystem)系統(tǒng),以滿足博睿宏遠目前各產(chǎn)品線對海量小文件數(shù)據(jù)存儲需求。
目前,此項目已在Github上開源(https://github.com/zhangnianli/BRFS),歡迎Star、Fork和PR。作為博睿宏遠對那些擁有海量小文件存儲需求公司的一份幫助,分享給大家。

解鎖BRFS
BRFS是一個主要針對海量小文件(快照、圖片、語音等)存儲而設計的高可用、高性能、易擴展的分布式文件系統(tǒng)。BRFS對存儲的文件格式?jīng)]有限制和要求,任何格式的文件都會以byte字節(jié)流的方式進行存儲。
此系統(tǒng)功能不僅包含了現(xiàn)有其他開源產(chǎn)品具備的權(quán)限控制、數(shù)據(jù)增刪讀、多副本備份、數(shù)據(jù)檢驗等基礎功能,同時博睿宏遠還設計了獨特且高效的副本自動遷移和平衡策略、多應用數(shù)據(jù)隔離且獨立配置,系統(tǒng)資源管理插件、集群狀態(tài)可視化監(jiān)控與報警等功能。
BRFS系統(tǒng)包含如下三個部分:
1、FS_Server.jar:在集群每個節(jié)點上運行的核心服務模塊。在模塊運行時會啟動若干ReginNode(管理節(jié)點)和DataNode(數(shù)據(jù)節(jié)點)進程來提供服務。其中ReginNode進程主要職責是管理存儲域元信息、管理數(shù)據(jù)節(jié)點、把用戶數(shù)據(jù)分配到不同的數(shù)據(jù)節(jié)點上進行處理;DataNode進程主要職責是用戶數(shù)據(jù)文件的寫入和讀取、副本自動平衡恢復、執(zhí)行定時任務(副本數(shù)校驗、CRC校驗、數(shù)據(jù)刪除、數(shù)據(jù)歸并)執(zhí)行等。
2、FS_ResouceManager.jar:系統(tǒng)資源管理模塊,用于實時收集和監(jiān)控集群各節(jié)點資源負載情況,以支持系統(tǒng)可根據(jù)節(jié)點負載情況分配資源,解決各節(jié)點資源利用和負載不均衡問題。BRFS系統(tǒng)內(nèi)部默認提供了一組資源管理的策略,主要包含CPU、內(nèi)存、I/O、磁盤容量等負載指標。目前此模塊采用可熱插拔的設計方式,但如果用戶有特殊需求,可自定義此插件,自行實現(xiàn)集群資源的分配和管理。
3、server.properties.example:用于后臺服務運行時所有的關(guān)鍵控制參數(shù)的默認值配置,如果想變更參數(shù)值,可以復制一個名為server.properties的文件,并把需要修改的屬性和值添加到此文件中即可,程序運行時server.properties文件中的配置的參數(shù)值會覆蓋server.properties.example文件中參數(shù)的默認值。
同時,用戶如需調(diào)用BRFS服務,則需要在工程中引入FS_Client.jar,并在代碼中調(diào)用相關(guān)的接口對BRFS系統(tǒng)進行操作;BRFS分布式文件系統(tǒng)接收的數(shù)據(jù)形式可以是快照、圖片或者任何以byte數(shù)組方式進行存儲的數(shù)據(jù)文件。
BRFS的價值
1、文件存儲采用寫時合并機制,幫助客戶解決環(huán)境IO瓶頸的問題;
?
2、文件副本自動平衡恢復,幫助客戶解決數(shù)據(jù)的安全性的問題;
?
3、硬件資源負載管理,幫助客戶解決集群資源使用熱點的問題;
?
4、引入應用分區(qū)的概念,幫助客戶解決不同業(yè)務數(shù)據(jù)個性化處理的問題;
?
5、集群橫向擴容,幫助客戶解決集群擴容不方便的問題。
?
BRFS與FASTDFS的功能對比
以開源產(chǎn)品FastDFS為參考,我們在二者功能設計上做了如下對比:

從上面對比可知,F(xiàn)astDFS引入了一個group組的概念,可以簡化數(shù)據(jù)副本的備份策略,但在并發(fā)訪問、寫入、磁盤利用及集群擴展方面就帶來一定局限。另外,在資源控制和副本動態(tài)恢復和平衡等方面BRFS的在設計上也優(yōu)于FastDFS。
?
壓力測試性能對比
集群規(guī)模:由2臺物理機器組成集群,數(shù)據(jù)保存一副本;
單臺配置:CPU:4核、內(nèi)存:18G、磁盤:STAT盤 4T 7.2K;
網(wǎng)絡:千兆;
壓測結(jié)果指標:QPS、CPU、MEMORY、IO。
壓測方式:分別使用1個/2個/3個/5個/8個/10個JMeter客戶端對BRFS和FastDFS進行壓測,每個JMeter客戶端開啟50個并發(fā)線程;
目標文件:隨機生成1KB和5KB數(shù)據(jù)文件;
?
1、1KB數(shù)據(jù)文件
1-1.數(shù)據(jù)寫入

此輪壓測結(jié)論:
通過上面壓測對比來看,在處理海量1KB的數(shù)據(jù)文件并發(fā)寫入時,BRFS的寫入性能要明顯優(yōu)于FASTDFS,平均效率是FastDFS的5倍以上。FASTDFS在寫入數(shù)據(jù)時,硬件資源明顯沒有被充分利用。
?
1-2.數(shù)據(jù)讀取

此輪壓測結(jié)論:
FastDFS:8個Jmeter客戶端壓測時IO占用100%,帶寬也打滿,到了機器的極限,QPS達到了12.9萬,但當增加到11個Jmeter客戶端時QPS反而降到了12萬,說明已經(jīng)到了極限;
BRFS:在11 jemter壓測時,CPU占用91%,帶寬占用53MB,QPS達到10萬;由于壓測機器數(shù)量不足,BRFS機器資源還沒有測到極限,QPS應該還有上升的空間;
通過此輪對比來看,在處理海量1KB大小的數(shù)據(jù)文件并發(fā)讀取時,BRFS的讀取性能基本與FastDFS持平。
?
2、5KB數(shù)據(jù)文件
2-1.數(shù)據(jù)寫入

此輪壓測結(jié)論:
FastDFS:1個Jmeter壓測時I/O占用接近80%,增加到3個時I/O基本滿了;?
BRFS:在1個、2個、3個jemter壓測時,QPS均要明顯優(yōu)于FastDFS;同時BRFS的QPS、TPS、I/O、CPU等指標是隨著Jmeter壓力增加而線性提高的;
通過上述對比來看,在處理海量5KB文件并發(fā)寫入時,BRFS的寫入性能要明顯優(yōu)于FASTDFS,性能提升約2-3倍。FASTDFS在寫入數(shù)據(jù)時,明顯硬件資源沒有被合理的利用起來。
?
2-2.數(shù)據(jù)讀取

此輪壓測結(jié)論:
FastDFS:1個jmeter壓測時的QPS要優(yōu)于BRFS,帶寬也基本達到瓶頸;增加到3個時QPS沒有明顯提高;
BRFS:QPS、I/O、CPU等指標隨著Jmeter個數(shù)增加而線性提高的,在3個時的QPS要優(yōu)于FastDFS;在3個Jmeter時未到帶寬瓶頸,再增加jmeter時QPS應還會有提高的空間;
通過上述對比來看,在處理海量5KB文件的并發(fā)讀取時,BRFS的讀取性能會隨著并發(fā)數(shù)的提高性能優(yōu)勢逐漸體現(xiàn)出來,BRFS在讀取性能方面占有優(yōu)勢。
?
BRFS整體系統(tǒng)架構(gòu)

此系統(tǒng)主要由Zookeeper、Client、Server以及可視化監(jiān)控UI等四部分模塊組成。
?
BRFS使用Zookeeper來管理集群服務,同步節(jié)點狀態(tài),確保服務高可用。Zookeeper上保存具體信息包括:機器節(jié)點信息、Storage信息、SID信息、任務信息、副本信息、lock鎖信息、用戶信息、臨時信息等元數(shù)據(jù)信息。
?
Client即用戶客戶端,它是以Jar的形式被用戶在用戶工程代碼中引用,并通過調(diào)用其相應的接口對BRFS進行數(shù)據(jù)添加、修改、讀取等操作。
?
Server即后臺集群服務,包括RegionNode和DataNode兩組進程。主要功能包含了安全認證、副本管理、磁盤管理、任務(副本數(shù)校驗、crc校驗、刪除、歸并等)管理、節(jié)點資源管理和副本自動平衡與恢復、可視化監(jiān)控與報警等功能模塊。后臺服務運行的相關(guān)進程是通過zookeeper進行管理的。
?
可視化監(jiān)控與報警,它是把集群節(jié)點上存儲的文件情況、后臺任務執(zhí)行情況、資源負載情況、服務運行狀態(tài)等都通過可視化監(jiān)控直觀的觀察到,當某些狀態(tài)達到閥值后可以自動觸發(fā)報警。
?
BRFS核心運行機制

使用BRFS只需簡單四步
?
BRFS系統(tǒng)除依賴JDK等基礎組件外,其他組件只依賴Zookeeper服務進行集群狀態(tài)同步,且核心服務只有兩個Jar文件,因此安裝部署極為簡單,部署安裝只需簡單四步:
?
1、安裝基礎組件,主要包括Zookeeper、JDK等;
2、根據(jù)業(yè)務需要配置server.properties文件;
3、啟動各節(jié)點FS_Server.jar服務;
4、通過測試客戶端,測試讀寫功能是否正常。
?
從未停止技術(shù)創(chuàng)新的腳步
?
未來,BRFS新版本還將進行兩方面升級,一是對大文件存儲的支持和優(yōu)化,不再區(qū)分大文件或是小文件,而定位為海量非結(jié)構(gòu)化數(shù)據(jù)分布式存儲系統(tǒng);二是解決目前所有類似服務都存在的需要用戶保存文件FID的問題,對于用戶來說,存儲海量文件的FID同樣是個很大的開銷,BRFS將開發(fā)一款全新的基于磁盤的key-value系統(tǒng),以解決海量FID和文件元數(shù)據(jù)關(guān)聯(lián)存儲的問題。
技術(shù)是博睿宏遠發(fā)展的驅(qū)動力,10年從未停止技術(shù)創(chuàng)新的腳步,未來持續(xù)與大家分享更多、更先進的技術(shù)理念和方法,讓世界變得更美好!
?