
Wir haben 3 Ordner auf einer Ubuntu 14.04-Maschine, von denen jeder 250.000 Bilder mit einer Größe von 2–30 KB enthält. Wir gehen davon aus, dass die Zahl auf bis zu 1 Million Dateien pro Verzeichnis anwächst.
Während wir versuchen, die Anwendung auf mehrere Server zu skalieren, prüfen wir Glusterfs als gemeinsamen Speicher. Während 250-KB-Dateien auf ext4 kein Problem darstellen, scheint es für Glusterfs problematisch zu sein. Beim Versuch, die Dateien zu kopieren, stürzt die Maschine vollständig ab.
Ich möchte die Dateien in Verzeichnisse auf zwei Ebenen partitionieren:
mkdir -p {000..255}/{000..255}
/000/000/filename
/001/000/filename
/001/001/filename
...
Klingt das nach einer guten, praktikablen Lösung? Die gesamte Struktur wird später Millionen von Dateien enthalten. Könnte Glusterfs dadurch zuverlässig und mit guter Leistung in der Produktion laufen und Millionen von Dateien hosten?
Antwort1
Die Verwendung von GlusterFS zum Speichern und Zugreifen auf sehr viele kleine Dateien stellt bei vielen Implementierungen eine Schwierigkeit dar, und es scheint, dass Sie bereits auf einem guten Weg zur Lösung des Problems sind: durch die Aufteilung der Dateien in separate Verzeichnisse.
Sie könnten eine solche Lösung implementieren. Erstellen Sie einfach eine Reihe von Verzeichnissen, legen Sie ein Limit für die Anzahl der Dateien fest, die in jedes Verzeichnis passen, und hoffen Sie, dass Ihnen nicht die Speicherorte für Dateien ausgehen. In Ihrem Beispiel erstellen Sie über 65.000 Verzeichnisse, daher dürfte dies in naher Zukunft kein Problem darstellen.
Eine weitere Möglichkeit besteht darin, Verzeichnisse basierend auf dem Erstellungsdatum einer Datei zu erstellen. Wenn die Datei beispielsweise cust_logo_xad.png
heute erstellt wurde, wird sie hier gespeichert:
/gluster/files/2015/08/24/cust_logo_xad.png
Wenn Sie Daten für verschiedene Entitäten (Kunden, Abteilungen usw.) hosten, können Sie die Dateien nach Eigentümerschaft trennen und der Entität eine eindeutige ID zuweisen. Beispiel:
/gluster/files/ry/ry7eg4k/cust_logo_xad.png
Darüber hinaus wäre es eine gute Idee, einen Blick auf dieGlusterFS-Dokumentation zum Optimieren des Speicherclusters für das Hosten kleiner Dateien. Stellen Sie zumindest Folgendes sicher:
- Die Dateisysteme auf den GlusterFS-Speicherservern verfügen über genügend freie Inodes (
mkfs
Option) - Die Laufwerke auf den GlusterFS-Speicherservern können viele IOPs verarbeiten.
- Sie verwenden ein für die Aufgabe geeignetes Dateisystem (entweder ext4 oder xfs).
- Ihre Anwendung/Ihr Personal versucht nicht, Verzeichnisse mit vielen kleinen Dateien häufig zu scannen.
Wenn Sie können (und falls Sie dies nicht bereits getan haben), ist es eine gute Idee, eine Datenbank als Index für die Dateien zu erstellen, anstatt ständig nach Dateien scannen (z. B. ls
) oder suchen (z. B. ) zu müssen.find