Zweiwege-Rsync führt zu schwankendem Inhalt

Zweiwege-Rsync führt zu schwankendem Inhalt

Ich versuche, Inhalte zwischen zwei Servern zu synchronisieren. Die Server sind identische Builds (Ubuntu 12.04LTS) und führen diesen Cron-Job aus, um die Inhalte zu synchronisieren:

rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* [email protected]:/htdocs/testing/www/cms_uploads/

aber ich erhalte einige merkwürdige Ergebnisse, wenn ich den Vorgang wie unten beschrieben teste.

Erster Test

  • aaaa.jpg auf Node2 hochgeladen
  • synchronisiert mit Node1
  • Aus Knoten1 löschen
  • Erscheint erneut auf Knoten1
  • Aus Knoten2 löschen
  • Aus Knoten1 entfernt

Zweiter Test

  • bbbb.png auf Node1 hochgeladen
  • Synchronisiert mit Node2
  • Aus Knoten2 löschen
  • Erscheint erneut auf Node2
  • Löschen aus Knoten 1
  • Erscheint erneut auf Knoten1

Ich versuche lediglich sicherzustellen, dass auf beiden Servern immer derselbe Inhalt vorhanden ist. Was mache ich falsch?

Antwort1

rsyncist nicht für bidirektionale Synchronisierungen eingerichtet. Ohne spezielle Hilfe (z. B. Synchronisierung von der geänderten Maschine) und viel Glück ist dies nicht möglich.

Das Glück ist erforderlich, damit Änderungen selten und weit auseinander erfolgen. Wenn sowohl Node1 als auch Node2 geändert werden, bevor die nächste Synchronisierung gestartet wird (von einer der beiden Maschinen), gehen einige Änderungen bei der Synchronisierung verloren.

Siehe auchDas

Antwort2

An Ihrer Problembeschreibung ist etwas grundsätzlich kaputt. Angenommen, Ihre Server sind synchronisiert und Sie erstellen dann eine Datei aaaa.jpgauf Knoten 2. Soll die nächste Synchronisierung diese fehlerhafte Datei von Knoten 2 löschen (da sie auf Knoten 1 nicht vorhanden ist, muss sie gelöscht worden sein) oder soll sie die Datei auf Knoten 1 kopieren (da sie auf Knoten 1 nicht vorhanden ist, muss sie neu erstellt werden)?

Die Reihenfolge, in der Sie die Synchronisierungen ausführen, bestimmt, was in jedem Fall passiert. Dies führt in vielen Fällen praktisch garantiert nicht zum gewünschten Ergebnis. Schlimmer noch: Wenn die Synchronisierungen parallel ausgeführt werden (so dass einer der Hosts von seinem eigenen Synchronisierungsjob aktualisiert und gleichzeitig vom Synchronisierungsjob durchlaufen wird, der auf dem anderen Host ausgeführt wird), sieht das Ergebnis eher zufällig aus.

Rsync ist grundsätzlich für die unidirektionale Synchronisation ausgelegt. Sie können nicht einfach zwei Rsync-Jobs ausführen und hoffen, dass eine bidirektionale Synchronisation möglich ist.

Einklangist ein Dateisynchronisierer, der für die bidirektionale Synchronisierung entwickelt wurde. Es ist das Tool, das Ihrer Aufgabe am nächsten kommt. Richten Sie es ein und führen Sie es unison -auto remote.example.com://path/to/directory /path/to/directoryauf einem der Hosts aus.

Unabhängig davon, welches Tool Sie verwenden, besteht die Möglichkeit von Konflikten, beispielsweise wenn dieselbe Datei auf zwei verschiedenen Computern durch zwei verschiedene Versionen ersetzt wird. Es gibt keine gute automatisierte Möglichkeit, solche Konflikte zu lösen, sodass ein manueller Eingriff erforderlich ist.

In den meisten Setups ist es richtig, einen einzelnen Server als Ort zum Hochladen festzulegen und alle anderen Server von diesem Masterserver aus zu synchronisieren. Wenn jemand eine Datei auf einen Slave hochlädt, lassen Sie diesen den Upload an den Master weiterleiten; ändern Sie lokal nichts. Wenn sich eine Datei auf dem Master ändert, übertragen Sie sie an die Slaves.

Antwort3

rsync hat eine Option -u, die Folgendes bewirkt:
„Dadurch wird rsync gezwungen, alle Dateien zu überspringen, die auf dem Ziel vorhanden sind und deren Änderungszeit neuer ist als die der Quelldatei. (Wenn eine vorhandene Zieldatei dieselbe Änderungszeit hat wie die Quelldatei, wird sie aktualisiert, wenn die Größen unterschiedlich sind.)“
Ein Shell-Skript, das
1) den von Ihnen eingegebenen Befehl plus die Option -u und minus die Option -c und
2) denselben Befehl, aber in umgekehrter Richtung enthält,
kann also eine Art bidirektionale Synchronisierung durchführen, allerdings mit zwei Problemen:
1) Auf dem Remote-Server gelöschte (oder umbenannte) Dateien werden vom lokalen Server kopiert, weil rsync denkt, es hätte eine neue Datei auf dem lokalen Server gefunden, und
2) wenn zwischen den Synchronisierungen an beiden Standorten eine einzelne Datei geändert wird, bleiben nur die neueren Änderungen erhalten.

verwandte Informationen