GridFS是MongoDB之上的Distributed File System,其利用了MongoDB的分布式儲存機制並通過MongoDB來隱藏檔資料和檔案中繼資料,兼具文檔型資料庫和檔案系統的優勢。GridFS是當前大資料潮流和複雜資料分析需求的產物。
簡單來說,GridFS通過將檔案資料和檔案中繼資料儲存在MongoDB裡來實現檔案系統,通過複製(Replication)來應對故障切換,Data Integration,還可以用來做讀擴充,熱備份或者作為離線批處理的資料來源,通過分區來實現自動切分資料,實現大資料存放區和負載平衡,通過資料庫對集合中文檔的管理和查詢(包括MapReduce)實現輕量級檔案系統介面和搜尋與分析。
GridFS的一個基本思想是可以將大檔案分成很多塊,每一塊作為一個單獨的文檔儲存,則有就能儲存大檔案了。由於MongoDB支援在文檔中儲存位元據,可以最大限度減小塊的儲存開銷。GridFS使用MongoDB的複製,分區等機制來實現分布式檔案儲存體,使用MongoDB進行管理和複雜分析。
GridFS使用兩個文檔來隱藏檔,一個用來隱藏檔本身的塊,另外一個用來儲存分塊的資訊和檔案的中繼資料,預設對應的集合分別為fs.chunks和fs.files.
Chunks集合:
{
“_id”:<string>,
“files_id”: <string>,
“n”: <num>,
“data”: <binary>
}
塊集合中文檔包含以下屬性:chunk_id:塊ID。Chunks.files_id:對應files集合中文檔的_id。Chunks.n:塊的編號,由GridFS管理,從0開始。Chunks.data:檔案資料,是BSON二進位類型。
Chunks集合使用files_id和n作為混合索引,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:每個塊的大小,預設為256KB,GridFS根據這個值將檔案分成多個快,files.uploadDate:GridFS第一次儲存此檔案的時間,類型為ISODate。Files.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的Distributed File System,可以直接使用MongoDB Replication和Sharding機制,資料可靠性和水平擴充性都得到保證。GridFS不產生磁碟片段,因為MongoDB分配資料檔案空間時以2GB為一塊。
MapReduce:可以進行複雜管理和查詢分析。
索引和緩衝:中繼資料存放區在MongoDB中,非常方便索引,並且可以對檔案和檔案中繼資料進行索引,能提高系統效率。
Checksum: GridFS會為檔案產生散列值,可用於校正檔案以檢查完整性。
開發人員友好:利用Grid可以簡化需求,減小開發成本。要是已經用了MongoDB,GridFS就可以不需要使用獨立檔案儲存體架構,並且使代碼和資料真正分離,方便管理。
其他: GridFS可以避免用於儲存使用者上傳內容的檔案系統出現的某些問題。例如,GridFS在同一個目錄下防止大量的檔案是沒有任何問題的。GridFS不產生磁碟片段,因為MongoDB分配資料檔案空間時以2GB為一塊。