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.
rsync
im Daemon-Modus zu arbeiten? Dies beschleunigt die anfängliche Generierung der Dateiliste beim Ausführen desrsync
Befehls, ist jedoch abhängig von der Anzahl der Dateien RAM-intensiv.btrfs
oderzfs
möglicherweise eine Option, kombiniert mit einem Cron-Job, um Snapsnots und /zfs send
oderbtrfs send
diese 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.rsync -a
Verwendung des Daemons (an der Quelle) dauert 200 Minuten, was mehr als akzeptabel ist. @cas:btrfs send
Vielleicht 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.Antworten:
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.
quelle
stat()
auf allen Steinen, die Repliken des spezifischen Blocks haben, den Sie betrachten. Wenn Sie beispielsweise eine 2x2-Streifenreplik haben, wirdstat
diese 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.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.
quelle