Je me demande s'il est possible que RSYNC copie un répertoire sur plusieurs destinations distantes, tout en une seule fois, ou même en parallèle. (pas nécessaire, mais serait utile.)
Normalement, quelque chose comme ce qui suit fonctionnerait bien:
$ rsync -Pav /junk user@Host1:/backup
$ rsync -Pav /junk user@Host2:/backup
$ rsync -Pav /junk user@Host3:/backup
Et si c'est la seule option, je vais l'utiliser. Toutefois,/Junk est situé sur un lien lent avec assez de fichiers et reconstruire le filélateur de quelque ~ 12 000 fichiers à chaque fois est lent agonistement (environ 5 minutes) par rapport au transfert/mise à jour réels. Est-il possible de faire quelque chose comme ça, d'accomplir la même chose:
$ rsync -Pav /junk user@Host1:/backup user@Host2:/backup user@Host3:/backup
Merci de regarder!
Voici les informations de la page Man pour RSYNC sur le mode BATCH.
TEMPS DIFFÉRÉ
Le mode de lot peut être utilisé pour appliquer le même ensemble de mises à jour de nombreux systèmes identiques. Supposons que l'on a un arbre qui est reproduit sur plusieurs hôtes. Supposons maintenant que certaines modifications ont été apportées à cet arborescence source et ces changements doivent être propagés aux autres hôtes. Pour ce faire, utilisez le mode BATCH, RSYNC est exécuté avec l'option d'écriture-lots pour appliquer les modifications apportées à l'arborescence source à l'un des arbres de destination. L'option Écrire par lots entraîne la conservation du client RSYNC dans un "fichier de commandes" toutes les informations nécessaires pour répéter cette opération contre d'autres arbres de destination identiques.
La génération du fichier de commandes une fois enregistré pour effectuer l'état du fichier, la somme de contrôle et la génération de bloc de données plus d'une fois lors de la mise à jour de plusieurs arbres de destination. Les protocoles de transport multicast peuvent être utilisés pour transférer les fichiers de mise à jour de lots en parallèle à de nombreux hôtes à la fois, au lieu d'envoyer les mêmes données à chaque hôte individuellement.
Pour appliquer les modifications enregistrées dans un autre arborescence de destination, exécutez RSYNC avec l'option Lecture de lots, en spécifiant le nom du même fichier de commandes et de l'arborescence de destination. RSYNC met à jour l'arborescence de destination à l'aide des informations stockées dans le fichier de commandes.
Pour votre commodité, un fichier de script est également créé lorsque l'option d'écriture-lots est utilisée: elle sera nommée identique au fichier de commandes avec ".sh" ajouté. Ce fichier de script contient une ligne de commande adaptée à la mise à jour d'une arborescence de destination à l'aide du fichier de commandes associé. Il peut être exécuté à l'aide d'une coque de Bourne (ou de type Bourne), passant éventuellement en passant dans un autre chemin de destination de destination qui est ensuite utilisé au lieu du chemin de destination d'origine. Ceci est utile lorsque le chemin d'arborescence de destination sur l'hôte actuel diffère de celui utilisé pour créer le fichier de commandes.
Examples:
$ rsync --write-batch=foo -a Host:/source/dir/ /adest/dir/
$ scp foo* remote:
$ ssh remote ./foo.sh /bdest/dir/
$ rsync --write-batch=foo -a /source/dir/ /adest/dir/
$ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo
Dans ces exemples, RSYNC est utilisé pour mettre à jour/adap/dir/de/source/dir/et les informations pour répéter cette opération est stockée dans "FOO" et "FOO.SH". L'hôte "Remote" est ensuite mise à jour avec les données par lots entrant dans le répertoire/BDEST/DIR. Les différences entre les deux exemples révèlent une partie de la flexibilité que vous avez dans la façon dont vous traitez avec des lots:
Le premier exemple montre que la copie initiale ne doit pas être locale - vous pouvez appuyer ou tirer des données sur/à partir d'un hôte distant à l'aide de la syntaxe de la coque à distance ou de la syntaxe Daemon RSYNC, comme vous le souhaitez.
Le premier exemple utilise le fichier "FOO.SH" créé pour obtenir les options RSYNC droit lors de l'exécution de la commande lecture-lots de l'hôte distant.
Le deuxième exemple lit les données de lot via l'entrée standard de sorte que le fichier de commandes n'a pas besoin d'être copié sur la machine distante d'abord. Cet exemple évite le script FOO.SH car il ait besoin d'utiliser une option modifiée - Lad-Batch, mais vous pouvez modifier le fichier de script si vous souhaitez en utiliser (assurez-vous simplement qu'aucune autre option n'essaie d'utiliser la norme. Entrée, telle que l'option "-ExEclude-go = -").
CAVEZIERS:
L'option Read-Batch attend l'arborescence de destination qu'elle met à jour être identique à l'arborescence de destination utilisé pour créer le fichier de fichiers de mise à jour de lot. Lorsqu'une différence entre les arbres de destination est rencontrée, la mise à jour peut être rejetée avec un avertissement (si le fichier semble déjà à jour) ou que la mise à jour du fichier peut être tentée, puis, si le fichier ne parvient pas à vérifier , la mise à jour rejetée d'une erreur. Cela signifie qu'il devrait être sûr de réexécuter une opération de lecture en lecture-lot si la commande a été interrompue. Si vous souhaitez forcer la mise à jour par lots à toujours être tentée, quelle que soit la taille et la date du fichier, utilisez l'option -i (lors de la lecture du lot). Si une erreur se produit, l'arborescence de destination sera probablement dans un état partiellement mis à jour. Dans ce cas, RSYNC peut être utilisé dans son mode de fonctionnement régulier (non lot) pour fixer l'arborescence de destination.
La version RSYNC utilisée sur toutes les destinations doit être au moins aussi nouvelle que celle utilisée pour générer le fichier de commandes. RSYNC mourra avec une erreur si la version du protocole dans le fichier de commandes est trop neuve pour la lecture par lots RSYNC à gérer. Voir aussi l'option --Protocol pour que la création de RSYNC génère un fichier de lots qu'un plus ancien RSYNC peut comprendre. (Notez que les fichiers de lots ont modifié la version 2.6.3, alors mélanger des versions plus anciennes que cela avec des versions plus récentes ne fonctionnera pas.)
Lors de la lecture d'un fichier de commandes, RSYNC forcera la valeur de certaines options pour correspondre aux données du fichier de commandes si vous ne les avez pas définies à la même manière que la commande de rédaction de lots. D'autres options peuvent (et devrait) être modifiée. Par exemple, -Write-Batch Changements à --Read-Lot, --Files à partir d'est déposé et les options -Filter/- incluent/- exclude ne sont pas nécessaires à moins que l'une des options --Delete est spécifiée .
Le code qui crée le fichier Batch.sh transforme tout filtre/include/excluez les options en une seule liste annexée en tant que document "ICI" dans le fichier de script shell. Un utilisateur avancé peut l'utiliser pour modifier la liste d'exclusion si une modification de ce qui est supprimé par --Delete est souhaitée. Un utilisateur normal peut ignorer ce détail et simplement utiliser le script Shell comme moyen simple d'exécuter la commande --Read-Lot appropriée pour les données par lots.
Le mode de lot d'origine dans RSYNC était basé sur "RSYNC +", mais la dernière version utilise une nouvelle implémentation.
J'imagine que tu pouvais essayer
rsync --write-batch=foo -Pav /junk user@Host1:/backup
foo.sh user@Host2:/backup
foo.sh user@Host3:/backup
Le rsync
--batch-mode
prend en charge la multidiffusion. Si cela est possible sur votre réseau, cela pourrait valoir la question.
Vous pouvez essayer d'utiliser nison . Cela devrait être beaucoup plus rapide pour créer la liste des fichiers car elle conserve un cache des fichiers.
que diriez-vous de changer de système de fichiers?
Il y a quelque temps, j'ai changé de multit-téraabyte FS de EXT3 à XFS. Il est temps de numériser les répertoires (avec environ 600 000 fichiers la dernière fois que j'ai vérifié) est passé de 15-17 minutes à moins de 30 secondes!
En recherchant cette réponse moi-même, je pense que vous auriez besoin de faire un lot à l'aide de RSYNC d'abord, puis de les envoyer tous, ce qui le ferait afin que la liste des fichiers nécessiterait de croquer la seule fois, puis vous pourriez juste Contexte Les trois rsyncs pour les exécuter en parallèle.
Une meilleure solution créerait un référentiel avec GIT et simplement pousser aux 3 hôtes. Plus rapide, vous n'auriez pas besoin de la partie de la liste de fichiers et que cela consomme moins de ressources.
Bonne chance,
[.____] João Miguel Neves
Pas une réponse directe, mais si vous utilisez RSYNC version 3+, il commencera à transférer avant de générer l'ensemble de la filiste.
Une autre option, toujours pas très efficace, serait de les exécuter comme des emplois, donc quelques-uns courir en même temps.
En outre, je viens de penser à cette étrangeté si cela ne vous dérange pas d'utiliser Tar:
tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null
Où chaque localhost serait des serveurs différents bien sûr (assume la connexion à la clé). Jamais utilisé ce qui précède avant.
Une autre solution possible ne fait que fonctionner autant de processus RSYNC parallèles que vous avez des hôtes, c'est-à-dire une fourchette.
Que diriez-vous d'exécuter les emplois RSYNC de Host1, Host2 et Host3? Ou exécutez un travail pour copier à Host1, puis exécutez-le sur Host2 et Host3 pour l'obtenir de Host1.