A coisa mais fácil que você pode fazer para ter boas opções depois é escrever seu software de tal forma que as imagens nunca possam manter o mesmo nome de arquivo quando modificado - uma mudança em uma imagem sempre deve alterar o nome do arquivo. Isso significa que você pode definir tempos de vida de cache muito longos, seja por meio de seus próprios caches ou por meio de uma rede de entrega de conteúdo, o que reduzirá bastante o número de leituras de disco necessárias. (Pode ser necessário ter algum mecanismo para liberar imediatamente um arquivo específico do cache ou CDN, se houver circunstâncias em que uma imagem tenha para ser excluída completamente).
Para permitir a escala horizontal, divida as imagens em um grande número de grupos (100 ou mais) e prefixe o caminho para cada imagem com o grupo em que você está. Você pode servir todos os grupos do mesmo servidor agora, mas Posteriormente, será bastante fácil usar um balanceador de carga para direcionar o tráfego para diferentes servidores com base no grupo de imagens. Eu não usaria um sistema de arquivos em cluster para imagens, porque ele adiciona uma camada extra de complexidade, e provavelmente é mais fácil usar vários servidores e algumas regras do balanceador de carga para distribuir a carga.