Mesmo sabendo que versões desta pergunta foram feitas a googol várias vezes, vou tentar não repeti-los.
Eu tenho muitos conjuntos de muitos arquivos (alguns arquivos são pequenos, mas alguns são grandes, como ~ 10 a 20GB). Eu tenho vários servidores, cada um pode hospedar um ou mais desses conjuntos de arquivos. É claro que um servidor pode hospedar 50% do número total de conjuntos e outros 50% podem hospedar outro número de conjuntos.
Você pode pensar em definir a partir da coleção de grandes arquivos de mídia, bibliotecas de imagens realmente grandes, aplicativos completos, o que realmente não importa, contanto que existam arquivos grandes no conjunto .
O servidor pode atualizar sua cópia do conjunto a qualquer momento (seja substituindo arquivos no conjunto por arquivos completamente novos ou aplicando patches em alguns arquivos, o que resultaria em ter quase os mesmos arquivos com pequenas diferenças) .
Por outro lado, eu tenho muitos clientes, que devem ser capazes de obter qualquer conjunto (ou vários conjuntos) de servidores, e manter suas cópias de conjuntos atualizados (sincronizados) com conjuntos no servidor, sempre Ninguém quer usar o conjunto.
As ferramentas que considero seguem:
- rsync - É ótimo para sincronizar muitos arquivos de pequeno a médio porte, mas não é tão ideal ao sincronizar arquivos grandes, pois usa um algoritmo que lê arquivos inteiros em ambos os lados para determinar se o arquivo deve ser copiado ou não. Está tudo bem quando o arquivo deve ser copiado pela primeira vez, ou quando o arquivo é completamente alterado, mas não tão bem, quando, digamos, apenas 1% do arquivo de 10GB é alterado.
- SVN - É ótimo quando se trata de encontrar diferenças e transferir apenas esses deltas, mas não tenho certeza de como é ótimo quando se trata de uso de disco (o conjunto inteiro será duas vezes maior em cliente e servidor, uma vez que uma vez definido é armazenado no repositório?).
- Torrent - Este pode ser viável, em termos de distribuição. Por exemplo, crie um torrent para cada conjunto no servidor, comece a propagá-lo para lá e os clientes que receberem esses conjuntos também continuarão a propagar para outros clientes, distribuindo assim a carga em todos os computadores que contêm cópia do conjunto. No entanto, não tenho certeza se seria capaz de distribuir as diferenças de alguma forma, uma vez definido no servidor é alterado ... Seria necessário a criação de nova torrent para cada alteração? Além disso, eu não sei como o torrent se comportaria na rede local, em termos de velocidade (ele poderia transferir arquivos entre um servidor e um cliente no máximo, velocidade limitada pela rede ou adicionar alguma sobrecarga de protocolo séria? congestão de rede?)
- Solução personalizada. Bem, não há muito a acrescentar aqui, mas é muito provável que ele esteja reinventando a roda e que algumas soluções existentes provavelmente atendem às minhas necessidades, se eu soubesse disso.
Então, a questão é: qual método de distribuição / sincronização (utilitários, abordagem) seria mais adequado para minha situação?