web-dev-qa-db-fra.com

Sync deux fichiers énormes en grande partie identiques

J'ai deux fichiers de 300 Go sur différents volumes:

  • sauvegarde locale cryptée
  • sauvegarde ‘distante’ cryptée sur NAS c’est-à-dire).

De par leur conception, ces deux fichiers ont une taille identique et également la plupart du temps (> 90%) du même contenu ...

Existe-t-il un outil efficace pour "rsync" ces fichiers, et ne copie que sur les différentes sections, de sorte que le fichier cible devienne identique au fichier source?

Peut-être que quelque chose qui construit des sommes de contrôle de blocs pour le comprendre, je ne sais pas ... (quelque chose de plus efficace que cp -f... rsync aurait toujours pris le fichier source entier pour l'écraser)

7
Frank Nocke

rsync peut être utilisé pour cela.

Les paramètres --no-whole-file ou --no-W utilisent la synchronisation au niveau du bloc au lieu de la synchronisation au niveau du fichier.


Cas de test

Génération de fichiers texte aléatoires à l'aide de /dev/random et de gros morceaux de fichier texte provenant de sites Web, comme suit. Ces 4 fichiers sont différents dans tous les contenus. tf_2.dat est notre fichier cible.

~/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

Puis copiez-les sur un disque dur différent en utilisant rsync (la destination est vide).

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

La statistique suivante a été reçue.

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

Maintenant, je fusionne les fichiers pour créer un nouveau fichier contenant environ 60% de données anciennes.

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

Maintenant, je synchronise les deux dossiers, cette fois en utilisant l'option --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

Vous pouvez voir que des données volumineuses sont mises en correspondance et accélérées.

Ensuite, je réessaye, cette fois je fusionne plusieurs fichiers Shell avec la cible (tf_2.dat) de telle sorte que le changement soit ~ 2%,

cat *.sh >> rs/tf_2.dat

Et synchronisez à nouveau avec 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

Nous voyons un grand match et une accélération donnant une synchronisation rapide.

11
ankit7540

Vous pouvez également essayer d'utiliser https://bitbucket.org/ppershing/blocksync (disclaimer: je suis l'auteur de ce fork). Un avantage sur rsync est qu’il ne lit le fichier qu’une seule fois (pour autant que je sache, rsync ne peut pas être convaincu de supposer que deux fichiers sont différents sans calculer la somme de contrôle avant de commencer le transfert delta. Inutile de dire que deux lecteurs de disque dur de 160 Go sont lus n'est pas une bonne stratégie). Attention - la version actuelle de blocksync fonctionne bien avec des connexions RTT courtes (par exemple, localhost, LAN et WiFi local) mais n'est pas particulièrement utile pour la synchronisation sur de longues distances.

1
user3584196