2010-05-23 14 views
30

Possiedo un'applicazione Web che memorizza molti file generati dall'utente. Attualmente questi sono tutti memorizzati sul filesystem del server, che ha diversi aspetti negativi per me.Archiviazione file per applicazioni Web: motori Filesystem vs DB vs NoSQL

  • quando ci muoviamo "cartelle" (come definito dalla nostra applicazione) abbiamo anche per spostare i file su disco (anche se questo è più a causa di decisioni di progettazione strane da parte degli sviluppatori originali di un requisito di memorizzare cose sul filesystem).
  • È difficile scrivere test per le azioni del file system; Ho una classe di filesystem finta che registra azioni come move, delete etc, senza eseguirle, che più o meno fa il lavoro, ma non ho il 100% di confidenza nei test.
  • Aggiungerò altri lavori che richiedono l'accesso ai file da altri servizi per eseguire attività aggiuntive (ad esempio l'indicizzazione in Solr, la generazione di anteprime, la conversione del formato film), quindi ho bisogno di ottenere i file da remoto. Fare questo su condivisioni di rete sembra insicuro ...
  • Occuparsi di autorizzazioni sul filesystem come a volte ci ha dato problemi in passato, anche se ora che ci siamo trasferiti in un ambiente Linux puro questo dovrebbe essere meno di un problema.

Quindi, le mie domande principali sono

  • Quali sono gli aspetti negativi di memorizzazione di file come BLOB in MySQL?
  • Gli stessi problemi esistono con i sistemi NoSQL come Cassandra?
  • Qualcuno ha altri suggerimenti che potrebbero essere appropriati, ad es. MogileFS, ecc.?

risposta

7

Non una risposta diretta ma alcuni indicatori di domande molto interessanti e in qualche modo simili (sì, si tratta di BLOB e immagini ma questo è IMO comparabile).

Quali sono i lati negativi della memorizzazione di file come BLOB in MySQL?

Esistono gli stessi problemi con i sistemi di NoSQL come Cassandra?

PS: io non voglio essere il guastafeste, ma non credo che qualsiasi soluzione NoSQL sta per risolvere il tuo problema (NoSQL è solo irrilevante per la maggior parte delle aziende).

+0

Grazie, sembra una serie di collegamenti molto utile. La memorizzazione di immagini/blob di qualsiasi tipo è ciò che cerco (stiamo memorizzando tutti i tipi di materiale). –

+0

Grazie, i tuoi link suggeriti sono fantastici. Chiaramente ho bisogno di cercare più duro prima di fare domande :) In conclusione, evitando il DB sembra la strada da percorrere. Ho solo bisogno di disaccoppiare l'applicazione dal filesystem un po 'in modo che sia meno doloroso ... –

+0

Felice di averli trovati utili. E condivido questa conclusione. –

3

forse una soluzione ibrida.

Utilizzare un database per memorizzare i metadati relativi a ciascun file e utilizzare il file system per archiviare effettivamente il file.

qualsiasi ristrutturazione di "cartelle" potrebbe essere modellata nel DB e trasferita dal percorso effettivo del sistema operativo.

+0

Questo è ciò che facciamo attualmente; idealmente, la ristrutturazione delle cartelle dovrebbe essere completamente dereferenziata dall'attuale posizione del filesystem, ma i vecchi sviluppatori hanno fatto di tutto per collegarlo invece ... Quindi mi trovo di fronte ad una riscrittura comunque estesa, e io Mi chiedo se esiste un approccio adatto che eviterà completamente il filesystem. –

+0

come si effettua un trasferimento dalla posizione del sistema operativo? – Erik

+0

in questo caso significherebbe che il percorso del file system potrebbe essere corretto in qualche directory, ma il database ha un altro modo di etichettare la posizione che potrebbe assomigliare a una gerarchia di cartelle ma non è la stessa della posizione fisica - quindi sono collegate come alcune normale relazione FK – Randy

0

Se il sistema operativo o l'applicazione non richiedono l'accesso ai file, non è necessario archiviare i file sul file system. Se si desidera eseguire il backup dei file contemporaneamente al backup del database, è meno utile archiviarli all'esterno del database. Pertanto, potrebbe essere una soluzione valida per archiviare i file nel database.

Un ulteriore svantaggio è che l'elaborazione dei file nel db ha un sovraccarico maggiore rispetto all'elaborazione dei file a livello di file system. Tuttavia, a patto che i vantaggi superino gli svantaggi, e sembra che nel tuo caso potresti provare.

La mia preoccupazione principale sarebbe la gestione dell'archiviazione su disco. Man mano che i file di database diventano grandi, la gestione dell'intero database diventa più complicata. Non vuoi uscire dalla padella e andare nel fuoco.

+0

Non sono così preoccupato per lo spazio su disco; è pazzo a buon mercato in questi giorni, posso solo aggiungere più unità e RAID se necessario. La mia preoccupazione per mysql è principalmente legata al caching; se eseguo una query che restituisce BLOB, sembra che occuperebbe una grande quantità di cache, cancellando altri dati più utili. Sospetto che debbano esserci anche altri problemi, altrimenti più persone lo farebbero in quel modo, ma non sono sicuro di cosa siano. –

+0

Ho letto molto su questo argomento e nessuno ha dichiarato problemi di cache delle query come motivo per non archiviare i file nel database. Con MySQL, puoi impostare il valore query_cache_limit, che indica la dimensione massima del set di risultati da memorizzare nella cache. Il valore predefinito è 1 MB. Come soluzione alternativa che potrebbe risolvere i problemi che si verificano con il file system, si potrebbe anche guardare a un NFS (un file server). È possibile memorizzare i riferimenti ai file nel db. –

+0

Vero, limitare le dimensioni delle cose da memorizzare nella cache delle query probabilmente ridurrebbe la mia preoccupazione qui. La memorizzazione dei riferimenti al file system è ancora un problema, ma sembra che sia il modo migliore. –

2

È possibile archiviare facilmente file in Cassandra fino a 2 GB dividendoli in colonne da 1 MB circa. Questo è abbastanza comune.

È possibile archiviarlo anche come un'unica grande colonna, ma in questo caso è necessario leggere l'intero elemento in memoria quando si accede ad esso.

Problemi correlati