Sincronize dois arquivos enormes em grande parte idênticos

7

Eu tenho dois arquivos de 300 GB em diferentes volumes:

  • backup local criptografado
  • backup 'remoto' criptografado no NAS que está).

Por padrão, esses dois arquivos são idênticos em tamanho e também principalmente (> 90%), idênticos em conteúdo ...

Existe uma ferramenta eficiente para "rsync" esses arquivos, e só copiar sobre as diferentes seções, de modo que o arquivo de destino se torna idêntico com a fonte?

Talvez algo que construa somas de verificação de blocos para descobrir isso, eu não sei ... (qualquer coisa mais eficiente que cp -f ... rsync iria afaik também pegar todo o arquivo fonte para sobrescrever)

    
por Frank Nocke 25.02.2017 / 14:56

2 respostas

9

rsync pode ser usado para fazer isso.

Os parâmetros

--no-whole-file ou --no-W usam a sincronização no nível do bloco, em vez da sincronização no nível do arquivo.

Caso de teste

Gerou arquivos de texto aleatórios usando /dev/random e grandes blocos de arquivos de texto de sites da seguinte forma. Esses 4 arquivos são diferentes em todo o conteúdo. tf_2.dat é o nosso arquivo de destino.

~/logs/rs$ ls -tlh    
-rw-rw-r-- 1 vayu vayu 2.1G  二  25 23:11 tf_2.dat
-rw-rw-r-- 1 vayu vayu 978M  二  25 23:11 a.txt
-rw-rw-r-- 1 vayu vayu 556K  二  25 23:10 file2.txt
-rw-rw-r-- 1 vayu vayu 561K  二  25 23:09 nt.txt

Em seguida, copiou-os para um disco rígido diferente usando rsync (o destino está vazio).

rsync -r --stats rs/ /mnt/raid0/scratch/t2

A seguinte estatística foi recebida.

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 3,260,939,140 bytes
Total transferred file size: 3,260,939,140 bytes
Literal data: 3,260,939,140 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3,261,735,553
Total bytes received: 92

sent 3,261,735,553 bytes  received 92 bytes  501,805,483.85 bytes/sec
total size is 3,260,939,140  speedup is 1.00

Agora eu mesclo os arquivos para criar um novo arquivo com aproximadamente 60% de dados antigos.

cat file2.txt a.txt >> tf_2.dat

Agora, sincronizo as duas pastas, desta vez usando a opção --no-W .

rsync -r --no-W --stats rs/ /mnt/raid0/scratch/t2

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,593,685 bytes
Total transferred file size: 4,289,593,685 bytes
Literal data: 1,025,553,047 bytes
Matched data: 3,264,040,638 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 1,026,127,265
Total bytes received: 611,604

sent 1,026,127,265 bytes  received 611,604 bytes  21,169,873.59 bytes/sec
total size is 4,289,593,685  speedup is 4.18

Você pode ver que uma grande quantidade de dados é correspondida e aumenta a velocidade.

Em seguida, tento novamente, desta vez, mesclar vários arquivos de shell ao destino ( tf_2.dat ), de modo que a alteração seja de aproximadamente 2%,

cat *.sh >> rs/tf_2.dat

E, novamente, sincronize usando rsync .

rsync -r --no-whole-file --stats rs/ /mnt/raid0/scratch/t2


Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,727,173 bytes
Total transferred file size: 4,289,727,173 bytes
Literal data: 178,839 bytes
Matched data: 4,289,548,334 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 541,845
Total bytes received: 690,392

sent 541,845 bytes  received 690,392 bytes  43,236.39 bytes/sec
total size is 4,289,727,173  speedup is 3,481.25

Nós vemos uma correspondência grande e acelerada, oferecendo sincronização rápida.

    
por ankit7540 25.02.2017 / 16:43
1

Você também pode tentar usar o link (disclaimer: Eu sou o autor dessa bifurcação específica). Uma vantagem sobre o rsync é que ele lê o arquivo apenas uma vez (tanto quanto eu sei, o rsync não pode ser convencido a assumir dois arquivos diferentes sem calcular a soma de verificação antes de iniciar a transferência delta. É desnecessário dizer que ler discos rígidos de 160GB duas vezes não é uma boa estratégia). Uma nota de cautela - a versão atual do blockync funciona bem em conexões RTT curtas (por exemplo, localhost, LAN e WiFi local), mas não é particularmente útil para sincronização em longas distâncias.

    
por user3584196 12.01.2018 / 02:30