Sistema de arquivos Linux ou CDN para milhões de arquivos com replicação

3

Por favor, me diga a solução para este cenário:

  • vários milhões de arquivos, localizados em um diretório ("img / 8898f6152a0ecd7997a68631768fb72e9ac2efe1_1.jpg")
  • ~ 80k de tamanho de arquivo em média
  • 90% de acesso de leitura aleatório
  • backup (replicação) para outros servidores (a cada 5 minutos ou imediatamente)
  • metadados de imagens salvos no banco de dados

Quando o número de arquivos se tornou maior que 2 milhões, temos um problema com o tempo de acesso aleatório lento. O sistema de arquivos é ext3 com as opções noatime e dir_index , mas não há necessidade de usar comandos como 'ls' ou 'find'.

Soluções que considero possíveis:

  1. mantenha o ext3 e simplesmente converta a estrutura da árvore de diretórios para "img / 889 / 8f6 / 152 / a0ecd7997a68631768fb72e9ac2efe1_1.jpg"
  2. migre para outro sistema de arquivos (ReiserFS, XFS, EXT4 etc.)
  3. configure o mecanismo de armazenamento com o sistema de arquivos distribuído (forneça exemplos)
  4. ou talvez outro ...

Se escolhermos 1 ou 2, como vamos replicar? O rsync não consegue lidar com tantos dados no sistema de arquivos ext3.

A melhor solução para nós é usar o Amazon S3, mas isso é muito caro com nosso tráfego ... Talvez você recomende alguns análogos (CDN barato ou projeto de código aberto)

    
por Roman S 04.09.2011 / 11:48

2 respostas

4

Milhões de arquivos em um diretório são design ruim e serão lentos. Subdivide-os em diretórios com menor número de entradas.

Dê uma olhada no link

Use RAID e / ou SSDs. Isso, por si só, não resolverá os tempos de acesso lentos, mas se você introduzir vários diretórios e reduzir o número de arquivos por diretório, digamos, por uma ordem de magnitude ou duas, ajudará a evitar pontos de acesso.

Considere o XFS, especialmente ao usar várias unidades e vários diretórios, isso pode proporcionar bons ganhos (veja, por exemplo, este thread para opções de uso. Ele dá algumas dicas para o XFS em md RAID).

    
por 04.09.2011 / 13:16
2

Pessoalmente, gostaria de:

  1. Fique com seu FS atual. Divida-os em diretórios como você sugeriu, se você quiser, ainda pode apresentá-lo como um único diretório, por exemplo, com mod_rewrite (supondo que este seja um aplicativo do tipo CDN)
  2. Alterações de registro que precisarão ser replicadas, por exemplo diária / horária, etc. de tal forma que toda vez que você precisar sincronizar os arquivos que precisam ser copiados pode ser tão simples quanto executar diff nos logs (ou seja, você sempre sincroniza os logs e os sincroniza primeiro, mas faz um diff antes de substituir para computar o que mais precisa de cópia).
por 04.09.2011 / 13:32