GridFS é uma simples abstração do sistema de arquivos sobre o MongoDB. Se você estiver familiarizado com o Amazon S3, o GridFS é uma abstração muito semelhante. Agora, por que um banco de dados orientado a documentos como o MongoDB fornece uma abstração de camada de arquivo? Acontece que existem algumas razões muito boas:
-
Armazenando conteúdo de arquivo gerado pelo usuário
Um grande número de aplicativos da Web permite que os usuários façam upload de arquivos. Historicamente, ao trabalhar com bancos de dados relacionais, esses arquivos gerados pelo usuário são armazenados no sistema de arquivos separado do banco de dados. Isso cria uma série de problemas. Como replicar os arquivos para todos os servidores necessários? Como excluir todas as cópias quando o arquivo é excluído? Como fazer backup dos arquivos para segurança e recuperação de desastres? O GridFS resolve esses problemas para o usuário armazenando os arquivos junto com o banco de dados, e você pode aproveitar o backup do banco de dados para fazer backup dos seus arquivos. Além disso, devido à replicação do MongoDB, uma cópia de seus arquivos é armazenada em cada réplica. Deletar o arquivo é tão fácil quanto deletar um objeto no banco de dados.
-
Acessando partes do conteúdo do arquivo
Quando um arquivo é carregado no GridFS, o arquivo é dividido em partes de 256k e armazenado separadamente. Portanto, quando você precisa ler apenas um determinado intervalo de bytes do arquivo, apenas esses pedaços são trazidos para a memória e não o arquivo inteiro. Isso é extremamente útil ao lidar com conteúdo de mídia grande que precisa ser lido ou editado seletivamente.
-
Armazenando documentos com mais de 16 MB no MongoDB
Por padrão, o tamanho do documento MongoDB é limitado a 16 MB. Portanto, se você tiver documentos maiores que 16 MB, poderá armazená-los usando o GridFS.
-
Superando limitações do sistema de arquivos
Se você estiver armazenando um grande número de arquivos, precisará considerar as limitações do sistema de arquivos, como o número máximo de arquivos/diretório, etc. Com o GridFS, você não precisa t precisa se preocupar com os limites do sistema de arquivos. Além disso, com a fragmentação do GridFS e do MongoDB, você pode distribuir seus arquivos entre diferentes servidores sem aumentar significativamente a complexidade operacional.
GridFS – Nos bastidores
GridFS usa duas coleções para armazenar os dados:
> mostrar coleções;fs.chunksfs.filessystem.indexes>
As coleções fs.files contêm metadados sobre os arquivos, e as coleções fs.chunks armazenam os pedaços reais de 256k. Se você tiver uma coleção de fragmentos, os pedaços serão distribuídos em diferentes servidores e você poderá obter um desempenho melhor do que um sistema de arquivos!
> db.fs.files.findOne();{"_id" :ObjectId("530cf1bf96038f5cb6df5f39"),"filename" :"./conn.log","chunkSize" :262144,"uploadDate" :ISODate("2014-02 -25T19:40:47.321Z"),"md5" :"6515e95f8bb161f6435b130a0e587ccd","length" :1644981}>
O MongoDB também cria um índice composto em files_id e o número do bloco para ajudar a acessar rapidamente os blocos:
> db.fs.chunks.getIndexes();[{"v" :1,"key" :{"_id" :1},"ns" :"files.fs.chunks","name" :"_id_"} ,{"v" :1,"key" :{"files_id" :1,"n" :1},"ns" :"files.fs.chunks","name" :"files_id_1_n_1"}]>Exemplos do MongoDB GridFS
O MongoDB possui um utilitário embutido chamado “mongofiles” para ajudar a exercitar os cenários GridFS. Consulte a documentação do driver para saber como usar o GridFS com o driver.
Coloque#mongofiles -h -u -p --db arquivos coloque /conn.logconectado a:127.0.0.1arquivo adicionado:{ _id:ObjectId('530cf1009710ca8fd47d7d5d'), nome do arquivo:"./conn.log", chunkSize :262144, uploadDate:new Date(1393357057021), md5:"6515e95f8bb161f6435b130a0e587ccd", comprimento:1644981 }done!Get#mongofiles -h -u -p --db files get /conn.logconnected to:127.0.0.1done write to:./conn.logList# mongofiles -h -u -p listconnected to:127.0.0.1/conn.log 1644981Delete[root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.logconnected to:127.0.0.1done!Módulos GridFS
Se você quiser servir os dados do arquivo armazenados no MongoDB diretamente do seu servidor web ou sistema de arquivos, existem vários módulos de plug-in GridFS disponíveis:
- GridFS-Fuse – Plugin GridFS no sistema de arquivos
- GridFS-Nginx - Plugin para servidores de arquivos GridFS diretamente do Nginx
Limitações do GridFS
-
Conjunto de trabalho
Servir arquivos junto com o conteúdo do banco de dados pode alterar significativamente o conjunto de trabalho da memória. Se você não quiser perturbar seu conjunto de trabalho, talvez seja melhor servir seus arquivos de um servidor MongoDB diferente.
-
Desempenho
O desempenho do serviço de arquivo será mais lento do que o serviço nativo do arquivo de seu servidor web e sistema de arquivos. No entanto, os benefícios adicionais de gerenciamento podem valer a pena a desaceleração.
-
Atualização atômica
GridFS não fornece uma maneira de fazer uma atualização atômica de um arquivo. Se esse cenário for necessário, você precisará manter várias versões de seus arquivos e escolher a versão correta.