Wir haben eine Ordnerstruktur in unserem Intranet, die ungefähr 800.000 Dateien enthält, die in ungefähr 4.000 Ordner aufgeteilt sind. Wir müssen dies mit einer kleinen Gruppe von Maschinen in unseren DMZs synchronisieren. Die Tiefe der Struktur ist sehr flach (sie übersteigt niemals zwei Ebenen).
Die meisten Dateien ändern sich nie, jeden Tag gibt es ein paar tausend aktualisierte Dateien und 1-2 tausend neue Dateien. Bei den Daten handelt es sich um historische Berichtsdaten, die dort aufbewahrt werden, wo die Quelldaten gelöscht wurden (dh es handelt sich um abgeschlossene Berichte, für die die Quelldaten so alt sind, dass wir sie archivieren und löschen). Eine einmalige Synchronisierung pro Tag ist ausreichend, da dies in einem angemessenen Zeitraum erfolgen kann. Berichte werden über Nacht generiert und wir synchronisieren als Erstes morgens als geplante Aufgabe.
Da sich so wenige Dateien regelmäßig ändern, können wir natürlich von inkrementellen Kopien erheblich profitieren. Wir haben Rsync ausprobiert, aber es kann bis zu acht bis zwölf Stunden dauern, bis der Vorgang "Dateiliste erstellen" abgeschlossen ist. Es ist klar, dass wir schnell wachsen, wozu rsync fähig ist (der 12-Stunden-Zeitrahmen ist viel zu lang).
Wir haben ein anderes Tool namens RepliWeb verwendet, um die Strukturen zu synchronisieren, und es kann eine inkrementelle Übertragung in etwa 45 Minuten durchführen. Es scheint jedoch, dass wir das Limit überschritten haben. Dateien werden als Löschvorgänge angezeigt, wenn dies nicht der Fall ist (möglicherweise ist eine interne Speicherstruktur erschöpft, wir sind uns nicht sicher).
Hat jemand anderes ein großes Synchronisationsprojekt dieser Art erlebt? Gibt es etwas, das entwickelt wurde, um massive Dateistrukturen wie diese für die Synchronisation zu handhaben?
quelle
Antworten:
Wenn Sie den vom Dateisystem zuletzt geänderten Zeitstempeln vertrauen können, können Sie die Dinge beschleunigen, indem Sie Rsync mit dem UNIX / Linux-Dienstprogramm 'find' kombinieren. 'find' kann eine Liste aller Dateien zusammenstellen, die die letzten Änderungen des letzten Tages aufweisen, und dann NUR diese verkürzte Liste von Dateien / Verzeichnissen an Rsync leiten. Dies ist viel schneller, als wenn Rsync die Metadaten jeder einzelnen Datei auf dem Absender mit dem Remote-Server vergleicht.
Kurz gesagt, der folgende Befehl führt Rsync NUR für die Liste der Dateien und Verzeichnisse aus, die sich in den letzten 24 Stunden geändert haben: (Rsync prüft KEINE anderen Dateien / Verzeichnisse.)
Falls Sie mit dem Befehl 'find' nicht vertraut sind, durchsucht er einen bestimmten Verzeichnis-Teilbaum nach Dateien und / oder Verzeichnissen, die den von Ihnen angegebenen Kriterien entsprechen. Zum Beispiel dieser Befehl:
startet im aktuellen Verzeichnis (".") und durchsucht alle Unterverzeichnisse nach:
Es wird der vollständige Pfadname ("-print") aller Elemente ausgegeben, die diesen Kriterien in der Standardausgabe entsprechen. Die Optionen '-name', '-type' und '-ctime' heißen "tests" und die Option '-print' heißt "action". Die Manpage für 'find' enthält eine vollständige Liste der Tests und Aktionen.
Wenn Sie wirklich clever sein möchten, können Sie den 'find'-Befehl' -cnewer'-Test anstelle von '-ctime' verwenden, um diesen Prozess fehlertoleranter und flexibler zu gestalten. '-cnewer' testet, ob für jede Datei / jedes Verzeichnis in der Struktur die Metadaten vor kurzem geändert wurden, als für eine Referenzdatei. Verwenden Sie 'touch', um die Referenzdatei des nächsten Laufs zu Beginn jedes Laufs zu erstellen, direkt vor dem Befehl 'find ... | Befehl rsync ... 'wird ausgeführt. Hier ist die grundlegende Implementierung:
Dieses Skript erkennt automatisch, wann es zuletzt ausgeführt wurde, und überträgt nur Dateien, die seit dem letzten Ausführen geändert wurden. Dies ist zwar komplizierter, schützt Sie jedoch vor Situationen, in denen Sie den Job aufgrund von Ausfallzeiten oder anderen Fehlern möglicherweise länger als 24 Stunden nicht ausgeführt haben.
quelle
touch $next_ref_file
am Ende? Wir sind jedoch nicht in der Lage, mit gelöschten Pfaden umzugehen (selbst diese statischen Archivberichte werden mit der Zeit so alt, dass sie archiviert und gelöscht werden). Das könnte aber kein Show Stopper sein.find . -ctime 0
in dieser Verzeichnisstruktur ziemlich langsam ist ( ich warte immer noch darauf, bis der Vorgang abgeschlossen ist, um seine Zeit zu melden). Das entmutigt mich ein bisschen, weil es so aussieht, als wäre dies eine ziemlich einfache Operation, die wahrscheinlich die Messlatte für die schnellste setzt, die wir für diesen Job erwarten können. Es kann vorkommen, dass die Festplatten-E / A hier der begrenzende Faktor ist.Versuchen Sie unisono , es wurde speziell entwickelt, um dieses Problem zu lösen, indem die Änderungslisten (Building File List) lokal auf jedem Server gespeichert werden, wodurch die Zeit für die Berechnung des Deltas und die Reduzierung des Betrags, der anschließend über die Leitung gesendet wird, verkürzt wird.
quelle
http://oss.linbit.com/csync2/ wurde für diese Art von Dingen entwickelt, ich würde es versuchen.
quelle
Wenn Sie den Schalter -z bei rsync verwenden, versuchen Sie, ihn ohne auszuführen. Aus irgendeinem Grund habe ich gesehen, dass dies sogar die anfängliche Aufzählung von Dateien beschleunigt.
quelle
Wenn Sie -z aus dem Befehl rsync entfernen, bei dem es sich nicht um eine Komprimierung handelt, wurde die Liste der empfangenen Dateien um ein Vielfaches schneller, und wir mussten etwa 500 GB übertragen. Davor dauerte es einen Tag mit dem Schalter -z.
quelle