ti-enxame.com

MongoDB como armazenamento de arquivos

estou tentando encontrar a melhor solução para criar armazenamento escalável para arquivos grandes. O tamanho do arquivo pode variar de 1 a 2 megabytes e até 500 a 600 gigabytes.

Encontrei algumas informações sobre o Hadoop e o HDFS, mas parece um pouco complicado, porque não preciso de nenhum trabalho de Mapear/Reduzir e muitos outros recursos. Agora, estou pensando em usar o MongoDB e o GridFS como solução de armazenamento de arquivos.

E agora as perguntas:

  1. O que acontecerá com o gridfs quando eu tentar escrever alguns arquivos simultaneamente. Haverá algum bloqueio para operações de leitura/gravação? (Vou usá-lo apenas como armazenamento de arquivos)
  2. Os arquivos do gridfs serão armazenados em cache no RAM e como isso afetará o desempenho de leitura e gravação?
  3. Talvez haja outras soluções que possam resolver meu problema com mais eficiência?

Obrigado.

21
cmd

Só posso responder pelo MongoDB aqui, não vou fingir que sei muito sobre o HDFS e outras tecnologias desse tipo.

A implementação do GridFs é totalmente do lado do cliente no próprio driver. Isso significa que não há nenhum carregamento ou entendimento especial do contexto da veiculação de arquivos no próprio MongoDB; o próprio MongoDB nem mesmo entende que são arquivos ( http://docs.mongodb.org/manual/applications/gridfs/ ).

Isso significa que a consulta de qualquer parte da coleção files ou chunks resultará no mesmo processo que faria em qualquer outra consulta, na qual carrega os dados necessários no seu conjunto de trabalho (- http://en.wikipedia.org/wiki/Working_set ) que representa um conjunto de dados (ou todos os dados carregados no momento) exigidos pelo MongoDB dentro de um determinado período para manter o desempenho ideal. Faz isso paginando-o em RAM (bem tecnicamente o sistema operacional faz)).

Outro ponto a ser levado em consideração é que este é um driver implementado. Isso significa que a especificação pode variar, no entanto, acho que não. Todos os drivers permitem que você consulte um conjunto de documentos da coleção files que hospeda apenas os metadados dos arquivos, permitindo que você sirva posteriormente o próprio arquivo da coleção chunks com uma única consulta.

No entanto, isso não é importante, você deseja veicular o próprio arquivo, incluindo seus dados; isso significa que você estará carregando a coleção files e sua coleção subsequente chunks no seu conjunto de trabalho.

Com isso em mente, já atingimos o primeiro obstáculo:

Os arquivos do gridfs serão armazenados em cache no RAM e como isso afetará o desempenho de leitura e gravação?

O desempenho de leitura de arquivos pequenos pode ser incrível, diretamente da RAM; as gravações seriam igualmente boas.

Para arquivos maiores, não é assim. A maioria dos computadores não possui 600 GB de RAM e é provável, na verdade, abrigar uma partição de 600 GB de um único arquivo em uma única instância mongod. cria um problema, pois esse arquivo, para ser veiculado, precisa caber no seu conjunto de trabalho, no entanto, é impossivelmente maior que a sua RAM; nesse momento, você pode ter a página debulhada ( http: //en.wikipedia. org/wiki/Thrashing_% 28computer_science% 29 ) em que o servidor apenas falha de página 24/7 tentando carregar o arquivo.As gravações aqui também não são melhores.

A única maneira de contornar isso é começar a colocar um único arquivo em muitos shards :\.

Nota: mais uma coisa a considerar é que o tamanho médio padrão de um chunks "chunk" é de 256 KB, portanto, existem muitos documentos para um arquivo de 600 GB. Essa configuração é manipulável na maioria dos drivers.

O que acontecerá com o gridfs quando eu tentar escrever alguns arquivos simultaneamente. Haverá algum bloqueio para operações de leitura/gravação? (Vou usá-lo apenas como armazenamento de arquivos)

O GridFS, sendo apenas uma especificação, usa os mesmos bloqueios que em qualquer outra coleção, bloqueios de leitura e gravação no nível do banco de dados (2.2+) ou global (pré-2.2). Os dois também interferem entre si, ou seja, como você pode garantir uma leitura consistente de um documento que está sendo gravado?

Dito isto, a possibilidade de contenção existe com base nas especificidades do seu cenário, tráfego, número de gravações/leituras simultâneas e muitas outras coisas sobre as quais não temos idéia.

Talvez haja outras soluções que possam resolver meu problema com mais eficiência?

Pessoalmente, descobri que o S3 (como o @mluggy disse) em formato de redundância reduzida funciona melhor para armazenar uma mera porção de metadados sobre o arquivo no MongoDB, como usar o GridFS, mas sem a coleção de partes, deixe o S3 lidar com toda essa distribuição, backup e outras coisas para você.

Espero ter sido claro, espero que ajude.

Edit: Ao contrário do que eu disse acidentalmente, o MongoDB não tem um bloqueio de nível de coleção, é um bloqueio de nível de banco de dados.

18
Sammaye

Vou começar respondendo aos dois primeiros:

  1. Existe um bloqueio de gravação ao escrever no GridFS, sim. Nenhum bloqueio para leituras.
  2. Os arquivos não serão armazenados em cache na memória quando você os consultar, mas seus metadados serão.

O GridFS pode não ser a melhor solução para o seu problema. Os bloqueios de gravação podem se tornar um problema quando você está lidando com esse tipo de situação, principalmente para arquivos grandes. Existem outros bancos de dados por aí que podem resolver esse problema para você. O HDFS é uma boa escolha, mas como você diz, é muito complicado. Eu recomendaria considerar um mecanismo de armazenamento como o Riak ou o S3 da Amazon. Eles são mais orientados para o armazenamento de arquivos e não acabam com as principais desvantagens. O S3 e o Riak possuem excelentes recursos administrativos e podem lidar com arquivos enormes. Embora com Riak, pela última vez que eu soubesse, você tinha que fazer algumas partes de arquivos para armazenar arquivos acima de 100mb. Apesar disso, geralmente é uma prática recomendada executar algum nível de chunking para grandes tamanhos de arquivo. Há muitas coisas ruins que podem acontecer ao transferir arquivos para bancos de dados - desde tempos limite da rede até estouros de buffer etc. De qualquer maneira, sua solução exigirá uma quantidade razoável de ajustes para tamanhos de arquivos grandes.

4
Christopher WJ Rueber

Você já pensou em salvar metadados no MongoDB e gravar arquivos reais no Amazon S3? Ambos possuem excelentes drivers e o último é altamente redundante, armazenamento de arquivos pronto para nuvem/cdn. Eu daria uma chance.

4
mluggy