Eu mantenho o inferno longe de qualquer tipo de sistema de arquivos de cluster, depois de passar um ano tentando (e falhando) manter o GFS rodando de qualquer maneira sã. É ridiculamente complicado, e não funciona muito bem sob carga. Esta avaliação se estende por associação a todos os outros sistemas de arquivos em cluster que eu examinei - o número de partes móveis, a falta de documentação efetiva e a fragilidade geral de toda a invenção de Rube Goldberg faz com que cada parte de mim seja "aeeeeeeee!"
Eu tive um grande sucesso, por outro lado, com o uso de abstrações específicas de aplicativos de nível superior - pensando sobre o que o aplicativo especificamente precisa para fazer com os dados envolvidos e, em seguida fornecendo um meio de fazer exatamente isso. É bastante incomum que os dados em um aplicativo da Web, na verdade, precisem de uma abstração completa do sistema de arquivos POSIX para os dados no aplicativo; em vez disso, pode se safar com alguns verbos mais funcionais. Essa é a camada de acesso entre a camada da web e os dados.
Por exemplo, tire fotos. Se você os possui, você provavelmente os coloca no seu servidor NFS e os servidores da Web os removem e os manipulam quando necessário. Mas o que você realmente faz com eles? Cada um deles é identificado por uma chave única, você os armazena (uma solicitação PUT), os recupera (uma solicitação GET), os exclui (uma solicitação DELETE) e talvez os obtém em tamanhos diferentes (uma solicitação GET com um par de parâmetros) - ei pronto, há uma API REST para isso. Não gosta de REST? SOAP, XML-RPC, o que flutua no seu barco. Inferno, você nem precisa usar HTTP (embora seja uma escolha natural para aplicativos da web, porque suas solicitações GET podem ser enviadas diretamente para os servidores de arquivos). Seja qual for o meio de redimensionamento que você possa realizar (e o armazenamento em cache desses redimensionamentos) pode ser tratado no servidor de armazenamento, o que economiza largura de banda de rede, localiza a lógica envolvida em lidar com eles e mantém as imagens armazenadas próximas do poder de processamento que as manipula (mais perto == mais rápido == impressionante).
O escalonamento desses sistemas de armazenamento geralmente é mais fácil do que dimensionar um servidor de arquivos generalizado também. Eles não precisam de escalonamento tão rapidamente, porque são mais eficientes, mas quando o fazem, é uma simples questão de determinar um algoritmo de fragmentação e implementá-lo em alguns locais-chave. Gosto da simplicidade de determinar quantas imagens (por exemplo) um único servidor pode suportar e, em seguida, use id / capacity
para obter o número do servidor a ser usado para qualquer solicitação de imagem.
Esta não é a primeira vez que escrevo esta resposta; veja esta pergunta para uma abordagem um pouco diferente sobre essa questão.