2010-05-23 3 views
30

Ich habe eine Webanwendung, die viele von Benutzern generierte Dateien speichert. Derzeit sind diese alle auf dem Server-Dateisystem gespeichert, was einige Nachteile für mich hat.Dateispeicher für Webanwendungen: Dateisystem vs DB vs NoSQL-Engines

  • Wenn wir „Ordner“ verschieben (wie durch unsere Anwendung definiert) müssen wir auch die Dateien auf der Festplatte bewegen (obwohl dies aufgrund seltsamer Design Entscheidungen seitens des ursprünglichen Entwicklers als ein Erfordernis der Speicherung ist Dinge auf dem Dateisystem).
  • Es ist schwierig, Tests für Dateisystemaktionen zu schreiben; Ich habe eine Schein-Dateisystem-Klasse, die Aktionen wie Verschieben, Löschen usw. protokolliert, ohne sie auszuführen, was mehr oder weniger den Job erledigt, aber ich habe kein hundertprozentiges Vertrauen in die Tests.
  • Ich werde einige andere Jobs hinzufügen, die auf die Dateien von einem anderen Dienst zugreifen müssen, um zusätzliche Aufgaben auszuführen (z. B. Indizierung in Solr, Erstellung von Thumbnails, Filmformatkonvertierung), also muss ich die Dateien aus der Ferne holen. Dies über Netzwerkfreigaben zu tun scheint zwielichtig ...
  • Der Umgang mit Berechtigungen auf dem Dateisystem als manchmal uns Probleme in der Vergangenheit gegeben, obwohl jetzt, dass wir in eine reine Linux-Umgebung bewegt haben, sollte dies weniger ein Problem sein.

Also, meine Hauptfragen sind

  • Was sind die Nachteile der Speicherung von Dateien als BLOBs in MySQL sind?
  • Gibt es die gleichen Probleme mit NoSQL-Systemen wie Cassandra?
  • Hat jemand andere Vorschläge, die angemessen sein könnten, z.B. MogileFS usw.?

Antwort

7

Keine direkte Antwort, aber einige Hinweise auf sehr interessante und irgendwie ähnliche Fragen (ja, es geht um Blobs und Bilder, aber das ist IMO vergleichbar).

Was sind die Nachteile beim Speichern von Dateien als BLOBs in MySQL?

Existieren die gleichen Probleme mit NoSQL-Systeme wie Cassandra?

PS: Ich mag nicht der killjoy sein, aber ich glaube nicht, dass jede NoSQL-Lösung Ihr Problem wird gelöst (NoSQL ist nur irrelevant für die meisten Unternehmen).

+0

Danke, sieht aus wie eine sehr nützliche Reihe von Links. Das Speichern von Bildern/Blobs jeglicher Art ist das, wonach ich suche (wir speichern alle möglichen Sachen). –

+0

Danke, Ihre vorgeschlagenen Links sind großartig. Klar muss ich härter suchen, bevor ich Fragen stelle :) Fazit, die DB zu vermeiden sieht aus wie der Weg zu gehen. Ich muss nur die Anwendung vom Dateisystem etwas entkoppeln, so dass es weniger schmerzhaft ist ... –

+0

Froh, dass Sie sie nützlich fanden. Und ich teile diese Schlussfolgerung. –

3

vielleicht eine Hybridlösung.

Verwenden Sie eine Datenbank, um Metadaten zu jeder Datei zu speichern - und verwenden Sie das Dateisystem, um die Datei tatsächlich zu speichern.

Jede Umstrukturierung von 'Ordnern' könnte in der Datenbank modelliert und vom tatsächlichen Betriebssystemstandort dereferenziert werden.

+0

Das ist derzeit was wir tun; Die Neustrukturierung von Ordnern sollte im Idealfall vollständig von der tatsächlichen Dateisystemposition dereferenziert werden, aber die alten Entwickler haben sich sehr bemüht, sie stattdessen zu verlinken ... Also bin ich irgendwie mit einer Neuschreibung konfrontiert, und ich ' Ich frage mich, ob es einen geeigneten Ansatz gibt, der das Dateisystem vollständig vermeidet. –

+0

Wie wird eine Dereferenzierung von der OS-Position ausgeführt? – Erik

+0

Die Dereferenzierung würde bedeuten, dass der Speicherort des Dateisystems in einem bestimmten Verzeichnis fixiert ist, aber die Datenbank den Pfad anders kennzeichnet, der wie eine Ordnerhierarchie aussieht, aber nicht der physische Speicherort ist - dann sind diese wie einige verlinkt normale FK-Beziehung – Randy

0

Wenn das Betriebssystem oder die Anwendung keinen Zugriff auf die Dateien benötigt, ist es nicht unbedingt erforderlich, die Dateien im Dateisystem zu speichern. Wenn Sie die Dateien gleichzeitig mit dem Sichern der Datenbank sichern möchten, haben Sie weniger Vorteile, wenn Sie sie außerhalb der Datenbank speichern. Daher könnte es eine gültige Lösung sein, die Dateien in der Datenbank zu speichern.

Ein weiterer Nachteil ist, dass die Verarbeitung von Dateien in der Datenbank mehr Aufwand erfordert als die Verarbeitung von Dateien auf der Dateisystemebene. Solange jedoch die Vorteile die Nachteile überwiegen, und es scheint, dass es in Ihrem Fall, könnten Sie es versuchen.

Mein Hauptanliegen wäre die Verwaltung von Festplattenspeicher. Wenn Ihre Datenbankdateien groß werden, wird die Verwaltung Ihrer gesamten Datenbank komplizierter. Sie möchten nicht aus der Bratpfanne in das Feuer gehen.

+0

Ich bin nicht so besorgt um Speicherplatz; Heutzutage ist es verrückt billig, ich kann einfach weitere Laufwerke hinzufügen und sie bei Bedarf RAID-fähig machen. Meine Bedenken mit MySQL bezieht sich hauptsächlich auf Caching; Wenn ich eine Abfrage ausführe, die BLOBS zurückgibt, scheint dies einen großen Teil des Caches zu belegen und andere nützlichere Daten zu löschen. Ich vermute, dass es auch andere Probleme geben muss, sonst würden es mehr Leute tun, aber ich bin mir nicht sicher, was sie sind. –

+0

Ich habe viel zu diesem Thema gelesen, und niemand hat Abfrage-Cache-Probleme als Grund angegeben, keine Dateien in der Datenbank zu speichern. Mit MySQL können Sie den Wert query_cache_limit festlegen, der angibt, wie groß die maximal zu resultierende Ergebnismenge ist. Der Standardwert ist 1 MB. Als eine alternative Lösung, die die Probleme lösen könnte, die Sie mit dem Dateisystem haben, können Sie sich auch einen NFS (einen Dateiserver) ansehen. Sie könnten Verweise auf die Dateien in der Datenbank speichern. –

+0

Richtig, die Begrenzung der Größe der Dinge, die im Abfrage-Cache gespeichert werden, würde hier meine Bedenken verringern. Speichern von Dateisystemreferenzen ist immer noch ein Schmerz, aber es sieht so aus, als wäre es der beste Weg. –

2

Sie können Dateien in Cassandra problemlos bis zu 2 GB speichern, indem Sie sie in 1 MB-Spalten aufteilen. Das ist ziemlich üblich.

Sie könnten es auch als eine große Spalte speichern, aber dann müssten Sie das Ganze in den Speicher lesen, wenn Sie darauf zugreifen.