Temos 3 pastas em uma máquina Ubuntu 14.04, cada uma contendo 250K imagens com tamanho de 2KB-30KB em cada pasta, esperando crescer até 1M de arquivos por diretório.
Ao tentar dimensionar o aplicativo para vários servidores, estamos procurando no Glusterfs um armazenamento compartilhado. Como arquivos de 250K não são um problema no ext4, parece ser problemático para glusterfs. Tentar copiar os arquivos trava totalmente a máquina.
Estou procurando particionar os arquivos em diretórios em 2 níveis:
mkdir -p {000..255}/{000..255}
/000/000/filename
/001/000/filename
/001/001/filename
...
Isso soa como uma boa maneira razoável? A estrutura inteira conterá milhões de arquivos posteriormente. Isso permitiria que o glusterfs fosse confiável em produção com um bom desempenho, hospedando milhões de arquivos?
Usar o GlusterFS para armazenar e acessar muitos e muitos arquivos muito pequenos é uma dificuldade que muitas implementações enfrentam, e parece que você já está no caminho certo para resolver o problema: dividir os arquivos em diretórios separados.
Você poderia implementar uma solução como essa. Basta criar um monte de diretórios, escolher um limite para quantos arquivos podem ir em cada diretório e esperar que você não fique sem lugares para colocar os arquivos. No seu exemplo, você está criando mais de 65k de diretórios, então isso provavelmente não será um problema tão cedo.
Outra opção é criar diretórios com base na data em que um arquivo é criado. Por exemplo, se o arquivo
cust_logo_xad.png
foi criado hoje, ele seria armazenado aqui:Se você estiver hospedando dados para diferentes entidades (clientes, departamentos etc.), poderá separar os arquivos com base na propriedade, atribuindo à entidade um ID exclusivo de algum tipo. Por exemplo:
Além disso, seria uma boa ideia dar uma olhada na documentação do GlusterFS para ajustar o cluster de armazenamento para hospedar arquivos pequenos. No mínimo, certifique-se de que:
mkfs
opção)Se você puder (e se ainda não o fez), é uma boa ideia criar um banco de dados para atuar como um índice para os arquivos, em vez de ter que escanear (por exemplo
ls
) ou pesquisar (por exemplofind
) arquivos o tempo todo.