In einer Firma, für die ich arbeite, gibt es so etwas wie "Wiedergabelisten", bei denen es sich um kleine Dateien mit jeweils 100 bis 300 Bytes handelt. Es gibt ungefähr eine Million von ihnen. Ungefähr 100.000 von ihnen werden jede Stunde gewechselt. Diese Wiedergabelisten müssen stündlich auf 10 andere Remote-Server auf verschiedenen Kontinenten hochgeladen werden, und im Idealfall dauert es weniger als 2 Minuten. Es ist sehr wichtig, dass Dateien, die auf dem Master gelöscht werden, auch auf allen Replikaten gelöscht werden. Derzeit verwenden wir Linux für unsere Infrastruktur.
Ich dachte darüber nach, rsync mit der Option -W zu versuchen, um ganze Dateien zu kopieren, ohne den Inhalt zu vergleichen. Ich habe es noch nicht ausprobiert, aber vielleicht können mir Leute, die mehr Erfahrung mit rsync haben, sagen, ob es eine praktikable Option ist?
Welche anderen Optionen sind eine Überlegung wert?
Update: Ich habe die Option lsyncd als Antwort gewählt, aber nur, weil sie am beliebtesten war. Andere vorgeschlagene Alternativen haben ebenfalls ihre eigene Gültigkeit.
quelle
Antworten:
Da auch sofortige Aktualisierungen zulässig sind, können Sie lsyncd verwenden .
Es überwacht Verzeichnisse (inotify) und
rsync
verwandelt sich in Slaves.Beim Start wird ein vollständiger
rsync
Vorgang ausgeführt, der einige Zeit in Anspruch nimmt. Danach werden jedoch nur die Änderungen übertragen.Das rekursive Überwachen von Verzeichnissen ist möglich. Wenn ein Slave-Server ausfällt, wird die Synchronisierung wiederholt, bis sie wieder hergestellt wird.
Wenn sich dies alles in einem einzelnen Verzeichnis (oder einer statischen Liste von Verzeichnissen) befindet, können Sie auch incron verwenden .
Der Nachteil dabei ist, dass das rekursive Überwachen von Ordnern nicht möglich ist und Sie die Synchronisierungsfunktion selbst implementieren müssen.
quelle
lsyncd
implementiert, dass ...lsyncd
undinotify
zutiefst auf Ihr spezifisches Server-Betriebssystem zutreffen. Die Anzahl der verfügbaren inotify-Uhren ist begrenzt. Ich glaube, die Standardeinstellung liegt bei 1500 oder 8000, abhängig von Ihrer speziellen Linux-Version. Bei den meisten Kerneln können Sie das Limit erhöhen, aber die Überwachung von 1 Million Dateien kann mehr sein, als praktisch ist. 2008 hat es bei mir nicht funktioniert. Außerdem kann die Warteschlange für inotifizierte Ereignisse überlaufen, sodass Sie Ereignisse verlieren. Sie müssen einen Weg finden, sich davon zu erholen. Eine sorgfältig abgestimmtelsyncd
Implementierung und eine tägliche Implementierungrsync
könnten jetzt 2012 funktionieren, um Ihre Grundlagen abzudecken.iontify
auf dem Verzeichnis nicht die einzelnen Dateien. Wie viele Verzeichnisse können Sie sehen? Überprüfen Sie/proc/sys/fs/inotify/max_user_watches
(normalerweise 8192).Erwägen Sie die Verwendung eines verteilten Dateisystems wie GlusterFS . GlusterFS wurde unter Berücksichtigung von Replikation und Parallelität entwickelt und kann bis zu 10 Server problemloser skalieren als Ad-hoc-Lösungen mit inotify und
rsync
.Für diesen speziellen Anwendungsfall kann ein GlusterFS-Volume mit 10 Servern mit 10 Replikaten (dh 1 Replikat / Brick pro Server) erstellt werden, sodass jedes Replikat ein exakter Spiegel jedes anderen Replikats im Volume ist. GlusterFS würde Dateisystemaktualisierungen automatisch auf alle Replikate übertragen.
Clients an jedem Standort würden sich an ihren lokalen Server wenden, sodass der Lesezugriff auf Dateien schnell erfolgen würde. Die entscheidende Frage ist, ob die Schreiblatenz akzeptabel niedrig gehalten werden kann. Die einzige Möglichkeit, dies zu beantworten, besteht darin, es zu versuchen.
quelle
Ich bezweifle
rsync
, dass dies auf normale Weise funktionieren würde, da das zehnmalige Scannen einer Million Dateien und das Vergleichen mit dem Remote-System zu lange dauern würde. Ich würde versuchen, ein System mit so etwas zu implementiereninotify
, das eine Liste der geänderten Dateien enthält und diese auf die Remote-Server überträgt (falls diese Änderungen nicht auf andere Weise protokolliert werden). Mithilfe dieser Liste können Sie dann schnell die zu übertragenden Dateien identifizieren - möglicherweise sogar mit rsync (oder besser 10 parallelen Instanzen davon).Bearbeiten: Mit ein wenig Arbeit können Sie sogar diesen Inotify / Log-Watch-Ansatz verwenden, um die Dateien zu kopieren, sobald die Änderung erfolgt.
quelle
Einige weitere Alternativen:
quelle
Dies scheint ein idealer Storybook-Anwendungsfall für MongoDB und möglicherweise GridFS zu sein . Da die Dateien relativ klein sind, sollte MongoDB alleine ausreichen, obwohl es möglicherweise praktisch ist, die GridFS-API zu verwenden.
MongoDB ist eine NOSQL-Datenbank und GridFS ist ein Dateispeicher, der darauf aufbaut. MongoDB verfügt über eine Vielzahl integrierter Optionen für Replikation und Sharding. Daher sollte es in Ihrem Anwendungsfall sehr gut skalierbar sein .
In Ihrem Fall werden Sie wahrscheinlich mit einem Replikatsatz beginnen, der aus dem Master in Ihrem primären Datencenter (möglicherweise einem zweiten, falls Sie ein Failover am selben Ort durchführen möchten) und Ihren zehn weltweit verteilten "Slaves" besteht. Führen Sie dann Ladetests durch, um zu überprüfen, ob die Schreibleistung ausreicht, und überprüfen Sie die Replikationszeiten auf Ihren Knoten. Wenn Sie mehr Leistung benötigen, können Sie das Setup in ein Sharded-Setup umwandeln (hauptsächlich, um die Schreiblast auf mehrere Server zu verteilen). MongoDB wurde mit dem Ziel entwickelt, riesige Setups mit "billiger" Hardware zu skalieren, sodass Sie eine Reihe kostengünstiger Server einsetzen können, um die Leistung zu verbessern.
quelle
Ich würde ein S3-Backend verwenden und dieses dann einfach auf allen Servern einbinden, die ich benötige. Auf diese Weise sind sowieso alle sofort synchron
quelle
Eine Option, die anscheinend noch nicht erwähnt wurde, besteht darin, alle Dateien in einer komprimierten Datei zu archivieren. Dies sollte die Gesamtgröße erheblich reduzieren und den gesamten Overhead aus dem Umgang mit Millionen einzelner Dateien entfernen. Durch Ersetzen der gesamten Dateigruppe in einem großen Update können Sie auch sicher sein, dass entfernte Dateien auf den Replikaten entfernt werden.
Der Nachteil ist natürlich, dass Sie viele Dateien unnötig übertragen. Dies kann durch die verringerte Größe dank Komprimierung ausgeglichen werden oder nicht. Ich habe auch keine Ahnung, wie lange es dauern würde, so viele Dateien zu komprimieren.
quelle