Le rsync bidirectionnel se traduit par un contenu oscillant

J'essaye de synchroniser le contenu entre deux servers. Les servers sont des builds identiques (Ubuntu 12.04LTS) et exécutent ce travail cron pour synchroniser le contenu:

rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* root@123.123.123.123:/htdocs/testing/www/cms_uploads/

mais j'obtiens des résultats étranges lorsque je teste le process comme détaillé ci-dessous.

Premier test

  • Téléchargé aaaa.jpg à Node2
  • synchronise avec Node1
  • Supprimer de Node1
  • Réapparaît sur le noeud 1
  • Supprimer de Node2
  • Supprimé de Node1

Deuxième test

  • Envoyé bbbb.png vers Node1
  • Synchronise avec Node2
  • Supprimer de Node2
  • Réapparaît sur Node2
  • Supprimer du noeud 1
  • Réapparaît sur le noeud 1

Tout ce que j'essaie de faire est de s'assurer que le même contenu est exactement le même sur les deux servers tout le time. Qu'est-ce que je fais mal?

rsync n'est pas configuré pour effectuer des synchronisations bidirectionnelles. Sans aide spécifique (par exemple synchronisation de la machine qui a été changée) et beaucoup de chance, il ne peut pas le faire.

La chance est nécessaire pour que les changements soient rares et éloignés. Si Node1 et Node2 sont modifiés avant le démarrage de la prochaine synchronisation (à partir de l'une ou l'autre machine), certains changements sont perdus lors de la synchronisation.

Voir aussi ceci

Il y a quelque chose de fondamentalement rompu avec votre énoncé de problème. Supposons que vos servers soient synchronisés, puis créez un file aaaa.jpg sur le nœud 2. Si la prochaine synchronisation supprime ce file parasite du nœud 2 (puisqu'elle n'existe pas sur le nœud 1, elle doit avoir été supprimée). ou doit-il copyr le file sur le Nœud 1 (puisqu'il n'existe pas sur le Nœud 1, il doit être nouvellement créé)?

L'ordre dans lequel vous exécutez les synchronisations déterminera ce qui se passera dans chaque cas. Cela est pratiquement garanti de ne pas donner le résultat souhaité dans de nombreux cas. Pire, si les synchronisations s'exécutent en parallèle (de sorte que l'un des hôtes est mis à jour par son propre travail de synchronisation et est en même time traversé par le travail de synchronisation exécuté sur l'autre hôte), le résultat sera plutôt random.

Rsync est fondamentalement conçu pour la synchronisation unidirectionnelle. Vous ne pouvez pas simplement exécuter deux tâches rsync et espérer effectuer une synchronisation bidirectionnelle.

Unison est un synchroniseur de files conçu pour la synchronisation bidirectionnelle. C'est la chose la plus proche du bon outil pour votre tâche. Configurez-le et exécutez unison -auto remote.example.com://path/to/directory /path/to/directory sur l'un des hôtes.

Quel que soit l'outil utilisé, il existe un risque de conflit, par exemple si le même file est remplacé par deux versions différentes sur les deux machines différentes. Il n'y a pas de bonne façon automatisée de résoudre de tels conflits, donc une intervention manuelle sera nécessaire.

Dans la plupart des configurations, la bonne chose est de désigner un seul server comme location de téléchargement et de synchroniser tous les autres servers de ce server maître. Si quelqu'un télécharge un file sur un esclave, faites-le relayer le téléchargement vers le maître; ne change rien localement. Chaque fois qu'un file change sur le maître, poussez-le vers l'esclave (s).

rsync a une option -u qui fait:
"Cela force rsync à ignorer tous les files qui existent sur la destination et dont l'heure de modification est plus récente que le file source (si un file de destination existant a un time de modification égal au file source, il sera mis à jour si les tailles sont différent.)"
Donc, un script shell qui contient
1) la command que vous avez donnée plus l'option -u et less l'option -c et
2) la même command mais avec la direction inversée
peut sortinger-accomplir une synchronisation bi-directionnelle mais avec deux problèmes:
1) les files supprimés (ou renommés) sur le server distant seront copiés à partir du b / c local rsync pensera qu'il a trouvé un nouveau file sur le local, et
2) si un seul file est modifié sur les deux locations entre les synchronisations, seuls les changements les plus récents seront conservés.