Lidar com a otimização da largura de banda (possivelmente) através do R-Sync

3

Atualmente, estou procurando soluções que possam otimizar o uso da largura de banda da rede.

Cenário: o servidor possui um arquivo. O cliente faz o download por meio de uma API REST. O cliente faz algumas alterações e faz o upload do arquivo alterado de volta ao servidor através do REST. O servidor substituirá o arquivo original pelo arquivo carregado.

Abordagens possíveis Eu tenho duas abordagens possíveis em mente.

1- Diferença local Antes de fazer qualquer alteração, o cliente fará uma cópia do arquivo original. Depois de fazer as alterações, o cliente usará algoritmos como BSDiff ou XDelta para extrair alterações comparando arquivos originais e alterados. Essas alterações serão enviadas ao servidor. O servidor aplicará o diff no arquivo original.

2- Use o R-Sync Faça uma chamada REST ao servidor e solicite o Rolling Checksum inicial e o MD5 Hash. Em seguida, com base na resposta, gere o diff e envie-o ao servidor. O servidor mesclará as alterações.

Fiz alguns testes rigorosos e descobri que o BSDiff é a solução mais eficiente (em termos de tamanho do diferencial - que é o principal objetivo de otimização). Ele gera a menor diferença possível, mas é preciso uma memória enorme, o que torna impossível o uso no lado do cliente para tamanhos de arquivos grandes. Por outro lado, os resultados do X-Delta e o restante das ferramentas binárias de comparação que experimentei não são tão boas em termos de tamanho de comparação gerado. O diff local também tem a desvantagem de usar espaço em disco extra por manter a cópia do arquivo original. Isso pode ser um problema no caso de arquivos grandes.

O problema de memória do BSDiff torna o R-Sync a escolha mais adequada (porque o restante das ferramentas não é tão eficiente em encontrar o diferencial). Então, eu decidi ir para o R-Sync.

O R-Sync funciona em duas etapas. Primeiro, ele obtém as assinaturas com base no arquivo e, em seguida, os dados são enviados de volta com base nas assinaturas enviadas anteriormente. Estou planejando otimizar ainda mais o R-Sync, mantendo as assinaturas do arquivo original no lado do cliente antes de fazer alterações. Isso removerá a necessidade de o servidor solicitante do cliente calcular e enviar assinaturas no momento do upload. O cliente pode apenas enviar dados com base em assinaturas já computadas para o servidor sempre que o cliente desejar fazer upload do arquivo.

Pergunta Eu sei que essa é uma pergunta estranha, é por isso que fiz uma pergunta antes de fazer aqui. Eu gostaria de saber se existem alternativas melhores para resolver esse tipo de problema. Quero confirmar minha abordagem apenas para garantir que estou no caminho certo e não perca nada importante.

Haris Hasan
fonte
Você é interessante apenas na otimização de tráfego no nível de arquivo?
achou
sim, apenas o nível do arquivo
Haris Hasan

Respostas:

1

Eu acho que sua decisão de seguir rsyncé a melhor. É rentável, preciso e bem pensado. Lembre-se de usar a --strictopção, md5sumpois caso contrário você poderá ter problemas. Você pode considerar ignorar algumas verificações em arquivos grandes, pois apenas consumirá recursos e produzirá o mesmo resultado. Imagine que você compare dois arquivos de 2 GB - é muito mais fácil excluir o antigo, copiar o novo e atualizar o hash e a soma de verificação do que criar um novo hash, compará-lo com o antigo e mesclar as alterações. Para arquivos pequenos, não faz diferença.

Outra idéia é apenas correr diffem hashes e, em seguida, transferir arquivos parcialmente - rsync de --checksum, --updatee --inplacesão seus amigos.

Para otimizar ainda mais o uso da largura de banda da rede, considere as opções --compresse --bwlimit=opções.

Não sei com que frequência você precisa transferir esses arquivos, com que frequência a sincronização deve ocorrer. Se com muita frequência, pode ser melhor configurar o Unison . Mais sobre isso no Linux Journal .

Boa sorte!

grs
fonte
0

Isso está principalmente na minha cabeça - especialmente com arquivos binários, mas o rsync antigo simples não transfere apenas as alterações para um destino não local por padrão? (Caso contrário, ele tem a opção --nowhole-files.)

Nesse caso, ele fará todo o trabalho para você.

Se precisar de mais detalhes, poste em [email protected], onde especialistas em rsync muito úteis estão. Você pode se inscrever em https://lists.samba.org/mailman/listinfo/rsync .

Para perguntas como essa, ajudaria muito se você especificasse qual sistema operacional e versão você está usando e a versão dos programas em questão. Nunca ouvi falar do R-Sync, mas uso o rsync no Linux o tempo todo.

Não tenho certeza, mas acredito ter visto referências à execução do rsync no cygwin no Windows, se esse for o seu ambiente.

Este fórum, em particular, trata de questões sobre Windows e Linux, por isso é ainda mais importante especificar seu ambiente aqui.

Veja também https://en.wikipedia.org/wiki/Rsync. Ele cobre o rsync em si, além de outros utilitários, como o rdiff, que você pode achar úteis.

Joe
fonte