Bonjour tout le monde
Je synchonise des gros fichier (de l'ordre de 500Go) via Rsync et plus particulièrement la commande suivante :
rsync --times --inplace --no-whole-file /Datastore/VM1.img root@192.168.0.1:/Save/VM1.img
Ca fonctionne bien, puisqu'il synchronise l'image sans fichier temporaire et en n'envoyant via le réseau que la différence.
Cependant, quand je regarde l’occupation des machines, je constate le fonctionnement suivant :
sending incremental file list
Etape 1 : Lecture sur le serveur de destination
Copie du fichier
Etape 2 : Lecture sur le serveur source
Comment faire pour que l'étape 1 et 2 se déroule en même temps. Car c'est du temps perdu de voir les serveurs travailler chacun leurs tours.
# Tout se fait en même temps
Posté par Kerro . Évalué à 2.
Cette explication n'est pas claire. Par exemple tu n'indiques pas à quel moment les données sont transférées. Tu indiques « Copie du fichier » mais ce n'est pas une étape numérotée, et après cette copie il y aurait une étape de lecture ce qui n'a aucun sens. De plus rsync ne fait une copie qu'en local, à distance c'est un transfert des différences qui se fait en même temps que la vérification des sommes de contrôles progressives (rolling checksum).
Imagine que VM1.img fasse 200 Gio et que tes machines source et cible aient 16 Gio de mémoire.
Il n'est pas réaliste que rsync fasse sa somme de contrôle progressive sur une machine et la garde en mémoire pour ensuite la comparer avec la même chose de l'autre côté --> la comparaison des fichiers se fait bien simultanément des deux côtés.
Donc ce que tu vois est peut-être autre chose que ce que tu imagines.
[^] # Re: Tout se fait en même temps
Posté par Christ . Évalué à 2.
Merci c'est cool d'avoir du monde pour discuter.
Je vais redéfinir plus précisément alors.
Etape 1, juste après l’exécution de la commande, Rsync indique "sending incremental file list"
Cette étape dure et je constate via atop une occupation disque en mode lecture sur le serveur de destination et rien su le serveur source.
Puis arrive l'étape 2 où Rsync affiche la progession des pourcentage pour donner "exemple : 48,474,357,760 100% 26.23MB/s 0:29:22 (xfr#1, to-chk=0/1)"
Durant cette étape, toujours via mes atop, je constate de la lecture sur la source cette fois ci et rien sur la destination.
Au passage, il n'y a pas d'écriture car l'image est tellement modifiée.
Tu as raison, je vais faire le test avec une image plus grande que ma RAM dispo. Mais en attendant, j'ai tout de même des accès en lecture sur la destination puis longtemp après sur la source. Je comprend pas pourquoi, où plus exactement j'aimerais que Rsync lance les check sur les 2 serveurs simultanément et synchronise que les blocs nécessaires.
[^] # Re: Tout se fait en même temps
Posté par Christ . Évalué à 1.
Kerro quand tu dit : "magine que VM1.img fasse 200 Gio et que tes machines source et cible aient 16 Gio de mémoire. Il n'est pas réaliste que rsync fasse sa somme de contrôle progressive sur une machine et la garde en mémoire pour ensuite la comparer avec la même chose de l'autre côté --> la comparaison des fichiers se fait bien simultanément des deux côtés."
En fait une img qui fait 200Go, ce ne sont que les checksum qui sont gardé et ça rentrerait donc largement bien dans une RAM de 16Go. Donc pas de soucis, Rsync arrive bien à calculer et retenir l'ensemble des checksum des blocs du fichier destination avant de traiter la source.
[^] # Re: Tout se fait en même temps
Posté par Kerro . Évalué à 2.
rsync fait des sommes de contrôles pour chaque bloc de 700 octets (de mémoire) : une somme de contrôle MD5 (128 bits) et une somme de contrôle « roulantes » (32 bits).
200 Gio / 700 octets x 160 bits --> environ 6 Gio
Tu verras facilement que rsync utilise beaucoup moins de mémoire que cela.
Rsync stocke les sommes de contrôles aux alentours du bloc actuellement évalué, mais pas plus.
[^] # Re: Tout se fait en même temps
Posté par Kerro . Évalué à 3.
Je viens de vérifier : sur les anciennes versions de rsync ça fonctionne comme j'ai expliqué. Mais sur les récentes (depuis plus de 6 ans) ça fonctionne avec la cible qui effectue d'abord les sommes de contrôles puis la source qui vérifie. Donc ça correspond à tes observations.
Bon, je viens encore d'apprendre un truc important. C'est un changement majeur vu que rsync ne permet plus de transférer des fichiers énormes sans bouffer toute la mémoire (je suppose, je n'ai pas vérifié, il y a peut-être des bricolages dans l'algo).
Ça ne résout pas ton soucis légitime :-)
[^] # Re: Tout se fait en même temps
Posté par Matthieu Moy (site web personnel) . Évalué à 3.
Un peu plus d'infos sur la question dans le man :
[^] # Re: Tout se fait en même temps
Posté par Kerro . Évalué à 2.
Le changement que tu pointes est valable pour l'étape de transfert de la liste des fichiers. Avant ça prenait des plombes sur une grosse arborescence et tout était stocké en mémoire.
Dans le cas ici, il ne transfert qu'un seul fichier. L'étape « sending incremental file list » est donc réduite au strict minimum.
# comment connaitre la difference
Posté par NeoX . Évalué à 4.
tu ne peux decemment pas commencer l'envoi AVANT de savoir ce qu'il faut envoyer (le calcul de la difference)
il te faut donc bien 2 etapes :
- le calcul distant, recuperation des infos, extraction de ce qui pourrait avoir changé
- l'envoi de la dite difference
[^] # Re: comment connaitre la difference
Posté par Christ . Évalué à 2.
La date est différente, donc de base il n'a pas besoin d'un checsum pour savoir si il faut resynchroniser. Où si il le fait quand même alors ma question est :
Quel argument dois je passer pour lui dire qu'en cas de timestamp différent de synchroniser sans faire un checksum ?
[^] # Re: comment connaitre la difference
Posté par Axone . Évalué à 3.
D'après le man de rsync, par défaut, rsync se fonde sur la taille du fichier et sa date de dernière modification pour savoir s'il y a eu modification.
Tu peux passer l'option --checksum pour forcer rsync à vérifier si les fichiers sont différents par un checksum, au lieu de la taille et de la date.
Ensuite, si j'ai bien compris, l'algorithme de rsync découpe le fichier en morceau, fait des checksums pour chaque partie, permettant ainsi de ne transférer que les parties du fichier qui ont effectivement changé.
Tu peux également passer l'option --whole-file pour forcer rsync à copier le fichier entièrement, sans utiliser cette méthode de découpage.
[^] # Re: comment connaitre la difference
Posté par Christ . Évalué à 2.
J'ai essayer ces 2 arguments. Pour --checksum, il check alors l'intégrité dans tous les cas, même si les dates sont identiques. Mon problème reste le même dans le sens où il test l'intégrité du fichier destination puis celui de source. Et toujours pas simultanément.
Pour l'argument --whole-file, cela supprime le contrôle checksum, donc je n'est plus mon soucis. Cependant, il transfert l'intégralité via le réseau. Donc la solution ne répond plus au besoin de départ.
[^] # Re: comment connaitre la difference
Posté par NeoX . Évalué à 2.
je repose ma question,
la date permet de savoir que le fichier a changé,
mais comment savoir à quel endroit le fichier a changé…
il faut donc bien que rsync calcule chaque portion de fichier, fasse les checksum, et compare local et distant,
pour n'envoyer que la difference.
l'interet ?
ne pas renvoyer 500Go à chaque backup
inconvenient
il faut chercher ou est la difference
sinon tu fais comme le propose l'ami en dessous,
tu transfert tout le fichier (donc les 500Go), tu economises alors le temps de calcul des differences, mais tu perd le temps du transfert des 500Go là ou seulement 100Mo sont peut-etre necessaire et tu sature eventuellement ton reseau plus longtemp
à toi donc de voir entre le temps CPU du calcul des checksum, et le temps de transfert/saturation reseau, ce qui est le plus critique pour toi
[^] # Re: comment connaitre la difference
Posté par Christ . Évalué à 2.
NeoX, je suis entièrement d'accord avec toi, c'est normal qu'il contrôle l'intégrité de tous les blocs du fichier afin de connaitre lequels sont à synchroniser. Donc oui le checksum est necessaire.
Cependant, il calcul les checksum du fichier de destination puis et seulement après, il calcul les checksum du fichier source. Et là, c'est du temps perdu, s'il pouvait calculer les deux simultanément …
[^] # Re: comment connaitre la difference
Posté par Anonyme . Évalué à 3.
ben voila ! comme ca c'est plus clair.
amha, tu devrais contacter https://rsync.samba.org/ pour ce besoin précis voir ouvrir un ticket avec ton commentaire ci dessus
sauf si tu a la réponse dans ce fil.
# alternatives a rsync
Posté par Marc Quinton . Évalué à 2.
il y en a de nombreuses, il me semble. On peut citer restic, borg. Il y en a bien d'autres. Ce sujet a été régulièrement abordé ici.
Pour ce qui concerne restic, il maintient localement une table de hash et en principe, le site distant est en synchro avec la table de hash local. Il n'est pas nécessaire de calculer tous les blocs distants. Et cas de nécessité (perte de synchro), je suppose que cela peut se faire. De toute facon, restic maintient un ensemble de blocs sur le site d'archivage et non pas le fichier directement. Une session restic peut donc démarrer immédiatement après avoir calculé le hash localement. Il s'agit d'un hash partiel et par block de taille variable et non pas d'un hash sur l'ensemble du fichier.
BTRFS possède aussi des fonctions de synchro entre 2 snapshots. Seul le différentiel est envoyé. Je ne sais pas comment se déroule la session (dialogue entre source et destination).
[^] # Re: alternatives a rsync
Posté par Vroum . Évalué à 2.
Ne pas oublier que
rsync
remplace aussi avantageusementscp
!À chacun sa méthode… :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.