Synchronisieren von Millionen von Dateien zwischen zwei Linux-Servern


9

Ich habe einen Server, der ein Verzeichnis mit ~ 7 Millionen Dateien (hauptsächlich Images) von seiner lokalen Festplatte über NFS an Netzwerkclients exportiert .

Ich muss eine zweite hinzufügen, um HA zu ermöglichen, und sie mit der ersten synchronisieren, wobei zwischen den beiden so wenig Delta wie möglich liegt.

Untersuchungen haben ergeben, dass hierfür lsyncd oder andere auf Inotify basierende Lösungen verwendet werden sollen. Angesichts der Anzahl der Dateien, die die Inotify- Uhren erstellen, dauert es jedoch eine Ewigkeit. Gleiches gilt für rsync .

Andere mögliche Lösungen scheinen drdb oder Cluster- Dateisysteme wie ceph oder glusterfs zu sein , aber ich habe keine Erfahrung mit diesen und weiß nicht, welche geeigneter wäre und mit so vielen Dateien gut zurechtkommt und dennoch eine anständige Leistung bietet.

Beachten Sie, dass die Aktivität meistens mit wenig Schreibvorgang gelesen wird.


2
DRDB funktioniert einwandfrei und ist in einem Cluster-Setup mit zwei Computern einfach einzurichten und zu verstehen. es wird jedoch in naher Zukunft nicht skalieren. Es könnte auch andere Ansätze zu diesem Thema geben. highscalability.com/blog/2012/6/20/…
Rui F Ribeiro

Haben Sie versucht, rsyncim Daemon-Modus zu arbeiten? Dies beschleunigt die anfängliche Generierung der Dateiliste beim Ausführen des rsyncBefehls, ist jedoch abhängig von der Anzahl der Dateien RAM-intensiv.
Thomas

Wie viel Verzögerung können Sie tolerieren? Wenn Sie einige Minuten (oder mehr) tolerieren können, verwenden Sie btrfsoder zfsmöglicherweise eine Option, kombiniert mit einem Cron-Job, um Snapsnots und / zfs sendoder btrfs senddiese auf dem Sicherungsserver zu erstellen . viel schneller und mit einer viel geringeren Arbeitslast (sowohl für den Sender als auch für den Empfänger) als rsync, da für Snapshot + Send keine Zeitstempel oder Prüfsummen für Dateien verglichen werden müssen.
Cas

Übrigens , mit ceph haben Sie auch die Möglichkeit, es als Objektspeicher (z. B. Amazon s3 oder Openstacks Swift) anstelle eines Dateisystems zu verwenden. Tatsächlich liegt Cephs fs tatsächlich über seinem Objektspeicher.
Cas

@Thomas: Die rsync -aVerwendung des Daemons (an der Quelle) dauert 200 Minuten, was mehr als akzeptabel ist. @cas: btrfs sendVielleicht ist es einen Versuch wert. Ich werde es mir ansehen. Ich kann nicht in einen Objektspeicher wechseln, da ich nicht der Entwickler der App bin, die die Dateien verwendet.
Benutzer60039

Antworten:


1

Ich bin geneigt, eine datenunabhängige Replikation wie drbd vorzuschlagen. Die große Anzahl von Dateien führt dazu, dass alles, was auf einer höheren Ebene als "Blockspeicher" ausgeführt wird, übermäßig viel Zeit damit verbringt, über den Baum zu gehen - wie Sie bei der Verwendung von rsync oder beim Erstellen von inotify-Uhren festgestellt haben.

Die Kurzversion meiner persönlichen Geschichte bestätigt dies: Ich habe Ceph nicht verwendet, aber ich bin mir ziemlich sicher, dass dies aufgrund der Ähnlichkeit mit Gluster nicht zu ihrem Hauptmarktziel gehört. Ich habe jedoch in den letzten Jahren versucht, diese Art von Lösung mit Gluster zu implementieren. Es war die meiste Zeit in Betrieb, obwohl es mehrere wichtige Versionsupdates gab, aber ich hatte kein Ende der Probleme. Wenn Ihr Ziel mehr Redundanz als Leistung ist, ist Gluster möglicherweise keine gute Lösung. Insbesondere wenn Ihr Verwendungsmuster viele stat () -Aufrufe enthält, kann Gluster mit der Replikation nicht wirklich gut umgehen. Dies liegt daran, dass stat-Aufrufe an replizierte Volumes an alle replizierten Knoten gesendet werden (eigentlich "Bausteine", aber Sie werden wahrscheinlich nur einen Baustein pro Host haben). Wenn Sie beispielsweise eine 2-Wege-Replik haben, Jeder stat () eines Clients wartet auf eine Antwort von beiden Bausteinen, um sicherzustellen, dass die aktuellen Daten verwendet werden. Dann haben Sie auch den FUSE-Overhead und das Fehlen von Caching, wenn Sie das native Gluster-Dateisystem für Redundanz verwenden (anstatt Gluster als Backend mit NFS als Protokoll und Automounter für Redundanz zu verwenden, was aus dem stat () - Grund immer noch schlecht ist). . Gluster eignet sich sehr gut für große Dateien, in denen Sie Daten auf mehrere Server verteilen können. Das Daten-Striping und die Datenverteilung funktionieren gut, da es genau das ist, wofür es ist. Die neuere Replikation vom Typ RAID10 bietet eine bessere Leistung als die älteren, direkt replizierten Volumes. Aber basierend auf dem, was ich vermute, ist Ihr Nutzungsmodell, ich würde davon abraten. Dann haben Sie auch den FUSE-Overhead und das Fehlen von Caching, wenn Sie das native Gluster-Dateisystem für Redundanz verwenden (anstatt Gluster als Backend mit NFS als Protokoll und Automounter für Redundanz zu verwenden, was aus dem stat () - Grund immer noch schlecht ist). . Gluster eignet sich sehr gut für große Dateien, in denen Sie Daten auf mehrere Server verteilen können. Das Daten-Striping und die Datenverteilung funktionieren gut, da es genau das ist, wofür es ist. Die neuere Replikation vom Typ RAID10 bietet eine bessere Leistung als die älteren, direkt replizierten Volumes. Aber basierend auf dem, was ich vermute, ist Ihr Nutzungsmodell, ich würde davon abraten. Dann haben Sie auch den FUSE-Overhead und das Fehlen von Caching, wenn Sie das native Gluster-Dateisystem für Redundanz verwenden (anstatt Gluster als Backend mit NFS als Protokoll und Automounter für Redundanz zu verwenden, was aus dem stat () - Grund immer noch schlecht ist). . Gluster eignet sich sehr gut für große Dateien, in denen Sie Daten auf mehrere Server verteilen können. Das Daten-Striping und die Datenverteilung funktionieren gut, da es genau das ist, wofür es ist. Die neuere Replikation vom Typ RAID10 bietet eine bessere Leistung als die älteren, direkt replizierten Volumes. Aber basierend auf dem, was ich vermute, ist Ihr Nutzungsmodell, ich würde davon abraten. was aus dem stat () Grund immer noch scheiße ist). Gluster eignet sich sehr gut für große Dateien, in denen Sie Daten auf mehrere Server verteilen können. Das Daten-Striping und die Datenverteilung funktionieren gut, da es genau das ist, wofür es ist. Die neuere Replikation vom Typ RAID10 bietet eine bessere Leistung als die älteren, direkt replizierten Volumes. Aber basierend auf dem, was ich vermute, ist Ihr Nutzungsmodell, ich würde davon abraten. was aus dem stat () Grund immer noch scheiße ist). Gluster eignet sich sehr gut für große Dateien, in denen Sie Daten auf mehrere Server verteilen können. Das Daten-Striping und die Datenverteilung funktionieren gut, da es genau das ist, wofür es ist. Die neuere Replikation vom Typ RAID10 bietet eine bessere Leistung als die älteren, direkt replizierten Volumes. Aber basierend auf dem, was ich vermute, ist Ihr Nutzungsmodell, ich würde davon abraten.

Denken Sie daran, dass Sie wahrscheinlich einen Weg finden müssen, um Hauptwahlen zwischen den Maschinen abzuhalten oder verteilte Sperren zu implementieren. Die gemeinsam genutzten Blockgerätelösungen erfordern ein Dateisystem, das Multi-Master-fähig ist (wie GFS), oder erfordern, dass nur ein Knoten das Lese- und Schreibvorgang des Dateisystems bereitstellt. Dateisysteme mögen es im Allgemeinen nicht, wenn Daten auf der Ebene der Blockgeräte darunter geändert werden. Das bedeutet, dass Ihre Kunden in der Lage sein müssen, den Master zu erkennen und dort direkte Schreibanforderungen zu stellen. Das kann sich als großes Ärgernis herausstellen. Wenn GFS und die gesamte unterstützende Infrastruktur eine Option sind, könnte drbd im Multi-Master-Modus (sie nennen es "Dual Primary") gut funktionieren. Weitere Informationen hierzu finden Sie unter https://www.drbd.org/de/doc/users-guide-83/s-dual-primary-mode .

Unabhängig von der Richtung, in die Sie gehen, werden Sie feststellen, dass dies immer noch ein ziemlich großer Schmerz ist, wenn Sie in Echtzeit arbeiten, ohne nur einem SAN-Unternehmen eine Lastwagenladung Geld zu geben.


Ich bin in der Anfangsphase der Migration von rsync-Befehlen in cron zur Verwendung eines verteilten Dateisystems. Wenn Gluster stat () auf allen Steinen ausführt, muss ich es möglicherweise als Lösung überdenken.
Jesusaur

1
Dies ist nur in einem replizierten Dateisystem der Fall. Es läuft stat()auf allen Steinen, die Repliken des spezifischen Blocks haben, den Sie betrachten. Wenn Sie beispielsweise eine 2x2-Streifenreplik haben, wird statdiese auf den beiden Bausteinen mit dem replizierten Block ausgeführt, nicht jedoch auf den beiden anderen. In meiner Anwendung mit vielen kleinen Dateien (in der Größenordnung von einer Million Dateien mit jeweils weniger als 4 KB Daten) lieferten weder NFS noch FUSE eine gute Leistung auf replizierten Volumes. Die Georeplikation auf ~ 20 Maschinen war in mehreren Konfigurationen sehr unzuverlässig.
Dannysauer

1
Ihr Kilometerstand kann variieren, aber ich bin von Gluster überall (den ich ausschließlich für die Replikation verwendet habe, nicht für all die anderen wirklich coolen Dinge, die Gluster tatsächlich gut macht) zu rsync auf nativen Dateisystemen übergegangen. :) Ich möchte jetzt zu lsyncd ( github.com/axkibe/lsyncd ) anstatt zu cron wechseln , damit ich ohne den Gluster-Overhead nahezu in Echtzeit arbeiten kann.
Dannysauer

0

Ich bin mit Hilfe des Proxmox VE-Setups von rsync zu ceph gewechselt.

Jetzt verwalte ich 14 TB in einem Cluster mit Live-Replikation. Seit fast 4 Jahren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.