Como posso armazenar e servir com mais de 1.000.000 de arquivos compactados em gzip em um servidor da Web Linux?

10

Eu tenho um grande conteúdo estático que preciso entregar por meio de um servidor Web baseado em Linux. É um conjunto de mais de um milhão de arquivos gzip pequenos. 90% dos arquivos têm menos de 1K e os arquivos restantes têm no máximo 50K. No futuro, isso poderá aumentar para mais de 10 milhões de arquivos gzip.

Devo colocar esse conteúdo em uma estrutura de arquivos ou devo considerar colocar todo esse conteúdo em um banco de dados? Se estiver em uma estrutura de arquivos, posso usar diretórios grandes ou devo considerar diretórios menores?

Disseram-me que uma estrutura de arquivos seria mais rápida para a entrega, mas, por outro lado, eu sei que os arquivos ocuparão muito espaço no disco, pois os blocos de arquivos terão mais de 1K.

Qual é a melhor estratégia em relação ao desempenho da entrega?

ATUALIZAR

Para os registros, eu realizei um teste no Windows 7, com meio milhão de arquivos:

insira a descrição da imagem aqui

Jérôme Verstrynge
fonte

Respostas:

6

Eu acho que uma estrutura FS seria mais rápida, mas você precisará de uma boa estrutura de diretórios para evitar ter diretórios com um número muito grande de arquivos.

Eu não me preocuparia muito com o espaço em disco perdido. Como exemplo, no tamanho de um bloco de 16K, você perderá 15 GB de espaço no pior caso, quando precisar de um bloco adicional para cada arquivo. Com os tamanhos de disco atuais, isso não é nada e você pode adaptar os parâmetros do seu sistema de arquivos para suas necessidades específicas.

Sven
fonte
5

Se você escolher a opção de estrutura de arquivo, uma coisa que você pode fazer para melhorar o desempenho de E / S do disco, pelo menos até certo ponto, é montar a partição com noatime + nodiratime, a menos que você precise deles. Eles não são realmente importantes, então eu recomendo fazer isso. Talvez você também possa usar uma unidade de estado sólido.

tributo
fonte
4

Eu acho que a resposta correta aqui depende de como os arquivos serão indexados ... o que determina quando um determinado arquivo é selecionado para entrega.

Se você já está fazendo uma consulta ao banco de dados para determinar o nome do seu arquivo, pode muito bem achar que é melhor manter o arquivo ali no registro db, poderá encontrar os melhores resultados ao ajustar algumas configurações de paginação no banco de dados de escolha e, em seguida, armazene os arquivos no banco de dados (por exemplo: páginas maiores para contabilizar todos os registros de blob), ou você pode achar que ainda está melhor usando o sistema de arquivos.

A opção de banco de dados tem uma chance um pouco melhor de funcionar porque, com um milhão de registros, é provável que cada arquivo não tenha a mesma probabilidade de ser consultado. Se você estiver em uma situação em que um arquivo pode ser consultado várias vezes seguidas ou quase seguidas, o banco de dados pode atuar como um cache de fato para arquivos recuperados recentemente; nesse caso, você geralmente obtém o resultado do arquivo já carregado na memória. Pode ser necessário ajustar cuidadosamente os componentes internos do mecanismo de banco de dados para obter o comportamento desejado.

Mas o principal a tirar da minha resposta é que você realmente não sabe o que funcionará melhor até tentar com alguns dados de teste representativos e medir os resultados.

Joel Coel
fonte
1

Com sistemas de arquivos modernos, não deve ser um grande problema. Testei o XFS com 1 bilhão de arquivos no mesmo diretório e tenho certeza que o ext4 também funcionará bem (desde que o sistema de arquivos em si não seja muito grande). Tem memória suficiente para armazenar em cache as entradas do diretório; cache maior do processador também ajudará bastante.

wazoox
fonte
2
Os sistemas de arquivos EXT não estão lidando muito bem com a alta contagem de arquivos no mesmo diretório; especialmente não com as configurações padrão de directory_index. Não testei o XFS com uma contagem tão alta de arquivos no mesmo diretório, mas tenho certeza de que o EXT não funcionará com nada remotamente próximo a 1 bilhão no mesmo diretório.
Hrvoje Špoljar
1
Ouvi dizer que o reiserfs é bom para arquivos pequenos, mas também ouvi o cara que mantém o software na prisão (!), Portanto o futuro próximo do reiserfs é bastante incerto. Eu pessoalmente optaria por EXT4 e XFS como uma segunda opção. O XFS não é melhor para arquivos grandes?
Öde
Costumava ser, mas se você estiver executando um novo kernel (3.0 e superior), também funciona bem para arquivos pequenos.
wazoox