GridFS:基于MongoDB的分布式文件存儲系統

jopen 11年前發布 | 40K 次閱讀 MongoDB NoSQL數據庫

GridFSMongoDB之上的分布式文件系統,其利用了MongoDB的分布式存儲機制并通過MongoDB來存儲文件數據和文件元數據,兼具文檔型數據庫和文件系統的優勢。GridFS是當前大數據潮流和復雜數據分析需求的產物。

簡單來說,GridFS通過將文件數據和文件元數據保存在MongoDB里來實現文件系統,通過復制(Replication)來應對故障切換,數據集成,還可以用來做讀擴展,熱備份或者作為離線批處理的數據源,通過分片來實現自動切分數據,實現大數據存儲和負載均衡,通過數據庫對集合中文檔的管理和查詢(包括MapReduce)實現輕量級文件系統接口和搜索與分析。

GridFS的一個基本思想是可以將大文件分成很多塊,每一塊作為一個單獨的文檔存儲,則有就能存儲大文件了。由于MongoDB支持在文檔中存儲二進制數據,可以最大限度減小塊的存儲開銷。GridFS使用MongoDB的復制,分片等機制來實現分布式文件存儲,使用MongoDB進行管理和復雜分析。

GridFS使用兩個文檔來存儲文件,一個用來存儲文件本身的塊,另外一個用來存儲分塊的信息和文件的元數據,默認對應的集合分別為fs.chunksfs.files.

Chunks集合:

{

“_id”:<string>,

“files_id”: <string>,

“n”: <num>,

“data”: <binary>

}

塊集合中文檔包含以下屬性:chunk_id:IDChunks.files_id:對應files集合中文檔的_idChunks.n:塊的編號,由GridFS管理,從0開始。Chunks.data:文件數據,是BSON二進制類型。

Chunks集合使用files_idn作為混合索引,files集合:

{

“_id”: <ObjectID>,

“length”: <num>,

“chunkSize”:<num>,

“uploadDate”: <timestamp>,

“md5”: <hash>,

“filename”: <string>,

“contentType”: <string>,

“aliases”: <string array>,

“metadata”: <dataObject>

}

Files集合中的文檔包含以下屬性,應用還可以創建額外任意的屬性:files_id:唯一的文件表示。MongoDB的默認值是BOSN ObjectID Files.length: 文件的字節數大小。Files.chunkSize:每個塊的大小,默認為256KBGridFS根據這個值將文件分成多個快,files.uploadDate:GridFS第一次存儲此文件的時間,類型為ISODateFiles.md5:文件的md5散列值,是字符串。 Files.filename:可選。人類可讀的文件名。Files.contentType:可選。合法的文件MIME類型。Files.aliases:可選。別名的字符串數組。Files.metadata:可選。自定義存儲的文件元數據。

可以通過mongofiles工具或者MongoDB驅動程序來使用GridFS,GridFS主要提供5種操作接口:

List:獲取文件列表

Get:獲取文件

Put:寫入文件

Search:根據文件名搜索文件

Delete:刪除文件

因為GridFS文件的元數據存儲在files集合中,因此GridFS可以非常方便地進行文件管理,比如根據文件名,上傳時間,文件大小或者自定義的文件元數據進行查詢,還可以利用MapReduce做復雜數據分析。這是GridFS把傳統文件系統和數據庫相結合得到的眾多好處之一。

對比傳統文件系統的優勢

分布式:GridFS是基于MongoDB的分布式文件系統,可以直接使用MongoDB ReplicationSharding機制,數據可靠性和水平擴展性都得到保證。GridFS不產生磁盤碎片,因為MongoDB分配數據文件空間時以2GB為一塊。

MapReduce:可以進行復雜管理和查詢分析。

索引和緩存:元數據存儲在MongoDB中,非常方便索引,并且可以對文件和文件元數據進行索引,能提高系統效率。

Checksum: GridFS會為文件產生散列值,可用于校驗文件以檢查完整性。

開發者友好:利用Grid可以簡化需求,減小開發成本。要是已經用了MongoDB,GridFS就可以不需要使用獨立文件存儲架構,并且使代碼和數據真正分離,方便管理。

其他: GridFS可以避免用于存儲用戶上傳內容的文件系統出現的某些問題。例如,GridFS在同一個目錄下防止大量的文件是沒有任何問題的。GridFS不產生磁盤碎片,因為MongoDB分配數據文件空間時以2GB為一塊。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!