Se este for o desenvolvimento greenfield, então eu absolutamente usaria a nuvem para isso . 100 M arquivos é um monte de dados; seria uma grande melhoria para transferir o armazenamento redundante disso para o fx Amazon S3.
Considerando que estamos falando de arquivos de 100 M, acredito que podemos dizer com segurança que algumas partes do conjunto de dados estarão "quentes" (frequentemente solicitadas) e a maioria das partes estará com problemas. Por isso, realmente queremos o armazenamento em cache.
Uma visão geral de como isso pode ser feito no Amazon Web Services:
- Primeira camada: Elastic Load Balancing gerenciado pela Amazon e o Amazon CloudWatch monitorando algumas pequenas instâncias do EC2 com nginx ou Apache. Esses servidores são apenas balanceadores de carga com arquivos de configuração estáticos, então o Cloudwatch pode monitorá-los para nós e gerar automaticamente novas instâncias se um deles falhar.
- A partir da primeira camada: Hasteamento consistente com base na URL de solicitação (nome do arquivo) para uma camada de servidores de cache. Você deseja hashing com base no nome do arquivo para garantir que cada arquivo não seja armazenado em cache várias vezes (reduzindo a taxa de acertos do cache), mas com N servidores de cache que cada servidor manipula 1 / N do espaço de endereço.
- Segunda camada: servidor (es) de cache. Seus servidores de cache são instâncias EC2 com mais memória e cache Squid ou Varnish ou Servidor de Tráfego Apache instalado.
- Da segunda camada: HTTP antigo simples para o armazenamento de arquivos do Amazon S3.
Como essa configuração é fracamente acoplada, é fácil escalá-la horizontalmente (conforme os problemas de dimensionamento).
A rapidez com que isso vai depender muito da relação entre dados quentes e frios. Se a sua carga de trabalho estiver mais quente, não ficaria surpreso em ver bem acima de 10.000 req / s de apenas 2 EC2s de balanceadores de carga pequenos e 2 instâncias do EC2 de cache de alta mem.