Transferências de arquivos mais inteligentes que rsync? [fechadas]

6

Eu tenho um arquivo grande (2-3 GB, binário, formato não documentado) que eu uso em dois computadores diferentes (normalmente eu o uso em um sistema de desktop, mas quando viajo coloco no meu laptop). Eu uso o rsync para transferir esse arquivo para frente e para trás.

Eu faço pequenas atualizações para este arquivo de tempos em tempos, alterando menos de 100 kB. Isso acontece em ambos os sistemas.

O problema com o rsync, como eu entendo, é que, se achar que um arquivo foi alterado entre a origem e o destino, ele transfere o arquivo completo. Na minha situação, parece um grande desperdício de tempo quando apenas uma pequena parte de um arquivo sofre alterações. Eu imagino um protocolo onde os agentes de transferência na origem e no destino primeiro verificam o arquivo inteiro e então comparam o resultado. Quando eles percebem que a soma de verificação para o arquivo inteiro é diferente, eles dividem o arquivo em duas partes, A e B e soma-os separadamente.

Aha, B é idêntico nas duas máquinas, vamos ignorar essa metade. Agora divide A em A1 e A2. Ok, apenas A2 mudou. Dividir A2 em A2I e A2II e comparar, etc. Faça isso de forma recursiva até encontrar, por exemplo, três partes de 1 MB cada que diferem entre origem e destino e depois transferir apenas essas partes e inseri-las na posição correta no arquivo de destino. Hoje, com SSDs rápidos e CPUs com vários núcleos, essa paralelização deve ser muito eficiente.

Então, a minha pergunta é: existem ferramentas que funcionem assim (ou de outra maneira eu não poderia imaginar, mas com resultados semelhantes) disponíveis hoje?

Um pedido de esclarecimento foi publicado. Eu uso principalmente o Mac para que o sistema de arquivos seja o HFS +. Normalmente eu começo o rsync assim

rsync -av --delete --progress --stats - nesses casos, às vezes, uso o SSH e, às vezes, o rsyncd. Quando eu uso o rsyncd eu inicio assim rsync --daemon --verbose --no-detach .

Segundo esclarecimento: peço uma ferramenta que apenas transfira o delta para um arquivo que existe em dois locais com pequenas alterações e / ou se o rsync realmente oferece isso. Minha experiência com o rsync é que ele transfere os arquivos na íntegra (mas agora há uma resposta que explica isso: o rsync precisa de um servidor rsync para poder transferir apenas os deltas, caso contrário (por exemplo, usando ssh-shell) ele transfere todo arquivo no entanto muito mudou).

    
por d-b 25.01.2015 / 17:37

3 respostas

7

O Rsync não usará deltas, mas transmitirá o arquivo inteiro em sua totalidade, se - como um único processo - for responsável pelos arquivos de origem e de destino. Ele pode transmitir deltas quando há um processo separado de cliente e servidor em execução nas máquinas de origem e de destino.

O motivo pelo qual o rsync não enviará deltas quando for o único processo é que, para determinar se ele precisa enviar um delta, ele precisa ler os arquivos de origem e de destino. No momento em que é feito, pode muito bem ter copiado o arquivo diretamente.

Se você estiver usando um comando deste formulário, você tem apenas um processo de rsync:

rsync /path/to/local/file /network/path/to/remote/file

Se você estiver usando um comando deste formulário, você tem dois processos rsync (um no host local e um no remoto) e os deltas podem ser usados:

rsync /path/to/local/file remote_host:/path/to/remote/file
    
por 25.01.2015 / 21:44
1

Da seção DESCRIÇÃO de man rsync :

Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. It offers a large number of options that control every aspect of its behavior and permit very flexible specification of the set of files to be copied. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination.

Então, isso seria um "não".

    
por 25.01.2015 / 18:16
0

Você pode usar o RAID-1 (espelhamento) para otimizar isso. Isso está ficando estranho com a mudança feita para ambos os lados, mas isso torna o uso de rsync strange também. Você deve explicar como isso deve ser tratado.

  1. Você pode criar um arquivo ( dd if=/dev/zero of=/path/to/syncfile.img bs=1M count=3500 ) que é um pouco maior do que seu arquivo de sincronização crescerá em breve.
  2. Em seguida, você coloca um dispositivo de loop sobre esse arquivo ( losetup /dev/loop5 /path/to/syncfile.img ).
  3. Você faz isso em ambos os sistemas.
  4. No sistema em que as alterações devem ser sincronizadas com a outra, você disponibiliza o dispositivo de bloco do outro sistema com dispositivos de bloco de rede ( nbd ).
  5. Crie uma matriz RAID-1 nos dois dispositivos de bloco: mdadm create /dev/md5 --raid-devices=2 --level=raid1 --bitmap=/path/to/ext3volume/sync-bitmap --assume-clean /dev/loop5 --write-mostly /dev/path/to/nbd . Você deve fornecer --bitmap=/path/to/ext3volume/sync-bitmap quando montar o array mais tarde.
  6. Crie um sistema de arquivos no RAID mke2fs -j /dev/md5 e monte-o em algum lugar.
  7. Copie o arquivo para o volume. Isso deve ser feito com uma boa conexão de rede. Talvez exista uma maneira mais inteligente de escrever o conteúdo do arquivo diretamente no dispositivo de bloco, o que poderia ser feito localmente, mas como o conteúdo do arquivo é misturado com os metadados do sistema de arquivos, não sei como fazer isso.

Agora você pode desconectar o dispositivo de bloco de rede. Isso leva a um RAID-1 degradado nos dois lados. Se você quiser sincronizar você precisa:  1. desmonte e coloque o RAID no sistema que você sincronizar  2. configure o nbd novamente  3. adicione o nbd ao RAID no sistema de origem de sincronização.

Em seguida, os dois dispositivos de bloco serão sincronizados. Mas, devido ao bitmap, o sistema de origem sabe sem precisar ler no outro lado quais dados devem ser transferidos.

problemas

F * ck. Agora que escrevi tudo isso, percebo que isso não funciona (bem) com mudanças em ambos os lados (para diferentes áreas). Pode funcionar se você usar --build em vez de --create (o que permite que você finja que em ambos os hosts o dispositivo de bloco local é o dispositivo mestre).

Dependendo de como você deseja que as alterações em ambas as direções sejam tratadas, você pode tentar fazer backups dos arquivos de bitmap (quando ambos os RAIDs forem interrompidos!) e apenas executar sincronizações nas duas direções. Ou (se você quiser gravar alterações em apenas uma direção), pior ainda, execute a sincronização, pare o RAID, substitua o bitmap local pelo remoto e sincronize novamente (e depois sincronize os arquivos de bitmap). Isso promete ser muito divertido.

instantâneos do LVM

Algo semelhante pode ser feito com os instantâneos do LVM.

    
por 26.01.2015 / 02:11