Mongodb GridFS——適合大小超過16MB的文件


一、概述

    GridFS是基於mongodb存儲引擎是實現的“分布式文件系統”,底層基於mongodb存儲機制,和其他本地文件系統相比,它具備大數據存儲的多個優點。GridFS適合存儲超過16MB的大型文件,不過16M數據在當今互聯網時代,已經不足為奇。我們可以使用GridFS構建大規模的“圖片服務器”、“文檔服務器”、“視頻、音頻”文件服務器,GridFS對於web應用,可以結合nginx插件“ningx-gridfs”能夠簡單的實現負載均衡等特性,非常便捷;可以簡單認為GridFS是為web應用而生。個人認為,目前架構比較簡單的NoSQL文件系統中GridFS是最優秀的。

 

    GridFS並不是將單個文件直接存儲為一個document,而是將文件分成多個parts或者說chunks,然后將每個chunk作為作為一個單獨的document存儲,然后將chunks有序保存。默認情況下,GridFS的chunk大小位255k。GridFS使用2個collections來存儲這些文件,一個collection存儲文件的chunks(實際文件數據),另一個則存儲文件的metadata(用戶自定義的屬性,filename,content-type等)。

 

    當用戶查詢GridFS中的文件時,客戶端或者driver將會重新按序組裝這些chunks。用戶可以range查詢文件,也可以獲取文件的任意部分的信息,比如:跳過(skip)視頻或者音頻(任何文件)的中間部,實現“range access of single file”。

 

    對於mongodb而言,每個document最大尺寸為16M,如果想存儲一條數據(比如一個文件)超過16M,那么只能使用GridFS支持;GridFS可以支持單個文件尺寸達到數G,讀取文件時可以分段讀取。此外,GridFS可以從Mongodb的高性能、高可用特性中獲益,比如我們可以在“replica set”或者“sharding”架構模式下使用GridFS。

 

二、使用場景

    document的大小超過16M是使用GridFS的條件之一,因為mongodb普通的collection無法支持16M以上的document,我們不得不選擇其他方案;在一些情況下,將這些大文件存儲在GridFS中,比直接存儲在本地文件系統中更加適合:

    1)如果你的文件系統對每個目錄下文件的個數有限制(或者太多,將會影響文件的打開速度等)。

    2)如果你的文件數據,有分數據中心鏡像保存(大數據情況,可用性保證)。

    3)如果你希望訪問一個超大的文件,而不希望將它全部加入內存,而是有“range access”的情況,即分段讀取,那么GridFS天生就具備這種能力,你可以隨意訪問任意片段。

 

    對於一個大文件,如果你希望原子性的更新它的全部內容,那么GridFS將不適合;比如同時更新一個文件的多個chunk,因為mongodb本身沒有事務機制。

 

    對於小於16M的文件,比如一些圖片、CSS、js文件等,應該將它們直接存儲在普通的collection中而非GridFS(bindata,參見org.bson.types.Binary),因為它們通常較小,GridFS無法發揮其優勢。當然,你為了統一application的“文件系統”存儲方式,也可以將這些小文件保存在GridFS中,性能也不會差的太多,為了提升性能,對這些小文件,可以在存儲時手動設置它的chunkSize,避免文件被切分成多個chunks來提高性能。

 

參考:

http://shift-alt-ctrl.iteye.com/blog/2195646

https://www.quora.com/Is-it-okay-to-store-large-binary-files-in-MongoDB


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM