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

3

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

Cenário: O servidor tem um arquivo. O cliente faz o download por meio de uma API REST. O cliente faz algumas alterações e carrega o arquivo alterado de volta ao servidor por meio do REST. O servidor substituirá o arquivo original pelo arquivo enviado.

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

1- Diff 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 o BSDiff ou o XDelta para extrair as alterações, comparando os arquivos originais e alterados. Essas alterações serão enviadas para o servidor. O servidor aplicará o diff no arquivo original.

2- Use R-Sync Faça uma chamada REST para o servidor e solicite a soma de verificação inicial e a hash MD5. Em seguida, com base na resposta, gere o diff e POST para o servidor. Servidor irá mesclar as alterações.

Eu fiz alguns testes difíceis e descobri que o BSDiff é a solução mais eficiente (tamanho do diff - que é o principal alvo de otimização). Ele gera a menor diferença possível, mas é necessária uma grande memória, o que impossibilita o uso no lado do cliente para arquivos grandes. Por outro lado, os resultados do X-Delta e do resto das ferramentas de diferenças binárias que experimentei não são tão bons em termos de tamanho de diff gerado. O diff local também tem a desvantagem de usar espaço extra em disco 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 faz com que o R-Sync seja a escolha mais adequada (porque o resto das ferramentas não é tão eficiente em encontrar o diff). Então eu decidi ir para o R-Sync.

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

Pergunta Eu sei que isso é um pouco estranho porque perguntei a pergunta antes de realmente perguntar aqui. Eu só gostaria de saber se existem alternativas melhores para resolver esse tipo de problema? Quero confirmar minha abordagem apenas para ter certeza de que estou no caminho certo e não perder nada importante.

    
por Haris Hasan 28.12.2012 / 10:40

2 respostas

1

Acho que sua decisão de usar rsync é a melhor. É rentável, preciso e bem pensado. Lembre-se de usar a opção --strict para md5sum , caso contrário, você poderá ter problemas. Você pode considerar ignorar algumas verificações em arquivos grandes, pois ele apenas consumirá recursos e gerará o mesmo resultado. Imagine que você compara dois arquivos de 2 GB - é muito mais fácil simplesmente 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 ideia é simplesmente executar diff em hashes e depois transferir arquivos parcialmente - --checksum , --update e --inplace de rsync são seus amigos.

Para otimizar ainda mais o uso da largura de banda da rede, você pode considerar as opções --compress e --bwlimit= .

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, for melhor configurar Unison . Mais sobre isso em Linux Journal .

Boa sorte!

    
por 04.01.2013 / 18:50
0

Isso é principalmente sobre a minha cabeça - especialmente com arquivos binários, mas o rsync simples não transfere apenas as mudanças para um destino não local por padrão? (Se não, tem a opção --nowhole-files.)

Se assim for, fará todo o trabalho para você.

Se você precisar de mais detalhes, poste em [email protected] onde especialistas rsync muito úteis se encontram. Você pode se inscrever no link .

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

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

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

Veja também o link Ele cobre o próprio rsync, assim como outros utilitários, como o rdiff, que você pode achar útil.

    
por 01.01.2013 / 01:30