GridFS è abbastanza veloce e affidabile per la produzione?


86

Sviluppo un nuovo sito Web e voglio utilizzare GridFS come archivio per tutti i caricamenti degli utenti, perché offre molti vantaggi rispetto a un normale archivio di file system.

I benchmark con GridFS servito da nginx indicano che non è veloce come un normale filesystem servito da nginx.

Benchmark con nginx

C'è qualcuno là fuori che utilizza GridFS già in un ambiente di produzione o lo userebbe per un nuovo progetto?


1
Un post sul blog sulla memorizzazione di immagini in mongodb per futuri ricercatori che avevano un intento simile a me: menge.io/2015/03/24/storing-small-images-in-mongodb (confronta GridFS con il semplice lancio nel documento come binario data)

Ci sono molti compromessi da considerare quando si decide se si desidera memorizzare dati binari in MongoDB - vedere: alexmarquardt.com/2017/03/02/…
Alexander Marquardt

Risposte:


118

Uso gridfs al lavoro su uno dei nostri server che fa parte di un sito Web di confronto dei prezzi con statistiche di traffico onorevoli (circa 25k visitatori al giorno). Il server non ha molta RAM, 2gigs e persino la CPU non è molto veloce (Core 2 duo 1.8Ghz) ma il server ha molto spazio di archiviazione: 10Tb (sata) nella configurazione raid 0. Il lavoro che sta facendo il server è molto semplice:

Ogni prodotto sul nostro comparatore di prezzi ha un'immagine (ci sono circa 10 milioni di prodotti in base al db del nostro prodotto) e il compito dei server è scaricare l'immagine, ridimensionarla, memorizzarla su gridfs e consegnarla al browser dei visitatori. .. se non è presente nella griglia ... oppure ... consegnalo al browser dei visitatori se è già memorizzato nella griglia. Quindi, questo potrebbe essere definito come uno "schema cdn tradizionale".

Abbiamo archiviato ed elaborato 4 milioni di immagini su questo server da quando è attivo e funzionante. Il ridimensionamento e l'archiviazione delle cose vengono eseguiti da un semplice script php ... ma di sicuro, uno script python o qualcosa come java potrebbe essere più veloce.

Dimensione dati corrente: 11,23 g

Dimensioni di archiviazione attuali: 12,5 g

Indici: 5

Dimensione dell'indice: 849,65 m

Circa l'affidabilità: questo è molto affidabile. Il server non si carica, la dimensione dell'indice è ok, le query sono veloci

Circa la velocità: Di sicuro, non è veloce come l'archiviazione di file locali, forse il 10% più lento, ma abbastanza veloce da essere utilizzato in tempo reale anche quando l'immagine deve essere elaborata, che nel nostro caso dipende molto da php. Anche i tempi di manutenzione e sviluppo sono stati ridotti: è diventato così semplice cancellare una o più immagini: basta interrogare il db con un semplice comando di cancellazione. Un'altra cosa interessante: quando abbiamo riavviato il nostro vecchio server, con l'archiviazione di file locale (quindi milioni di file in migliaia di cartelle), a volte si blocca per ore perché il sistema stava eseguendo un controllo dell'integrità dei file (questo ha davvero richiesto ore ...). Non abbiamo più questo problema con gridfs, le nostre immagini sono ora memorizzate in grandi blocchi mongodb (file da 2 GB)

Quindi ... nella mia mente ... Sì, gridfs è abbastanza veloce e affidabile da essere utilizzato per la produzione.


9
Sono scioccato dal fatto che chiunque utilizzi raid 0 come spazio di archiviazione principale su un sito Web di produzione. Anche con buoni backup, aumentare la probabilità di un errore di archiviazione è un prezzo piuttosto alto da pagare per migliorare le prestazioni.
mikerobi

67
Usiamo raid 0 perché nel nostro caso particolare, i dati dell'immagine possono essere volatili. Non importa se l'immagine viene persa poiché la scaricheremo di nuovo dal sito Web del commerciante. Pragmaticamente, possiamo considerare che il nostro server è un semplice server di cache di immagini.
Manu Eidenberger

Ma stai aumentando attivamente la possibilità di guasto (fattore di guasto iniziale dell'unità moltiplicato per il numero di mandrini). Raid 10 sarebbe l'ideale se hai bisogno di più scritture che letture o Raid 5/6 se hai bisogno di più letture che scritture.
NeuroScr

9
@ManuEidenberger Perché stai usando GridFS per archiviare immagini che preferirebbero essere archiviate in un documento MongoDB? Immagino che tu non abbia raggiunto il limite di dimensione del documento di 16 MB. E archiviare l'immagine come BLOB all'interno di un documento MongoDB sarebbe più efficiente, poiché non è necessario il livello GridFS sopra i documenti MongoDB.
Arnaud Bouchez

1
Sono anche curioso della domanda di @ ArnaudBouchez. C'è stato qualche vantaggio che ti ha fatto scegliere GridFS piuttosto che archiviarlo semplicemente come dati binari in un documento, Manu? Grazie!

12

Come accennato, potrebbe non essere veloce come un normale filesystem ma poi ti dà vantaggi rispetto ai normali filesystem per i quali penso valga la pena rinunciare un po 'alla velocità.

In definitiva, con lo sharding, potresti raggiungere un punto in cui lo storage GridFS diventa effettivamente l'opzione più veloce rispetto a un normale filesystem e un singolo nodo.


6

Attenzione però alle riparazioni per DB più grandi: un nuovo sistema che stiamo sviluppando, mongo non è uscito in modo pulito e la riparazione del GridFS da 7 TB sembra che ci vorranno 130 ore.

Per questo motivo, penso che cercherò di passare a OpenStack Swift o Ceph. Tuttavia, fino ad allora è stato un bene. E il modulo nginx-gridfs è carino.


Allora come sei andata?
Mukus

5

Il modulo nginx-gridfs di mdirolf è ottimo e abbastanza facile da configurare. Lo stiamo usando nella produzione di paint.ly per servire tutti i dipinti e finora non ci sono stati problemi.


3
paint.ly non è più disponibile, a quanto pare. :(
Marian

2

Non consiglio di usare gridfs a meno che tu non sappia cosa stai facendo. GridFS è solo un livello di astrazione che divide i file per blocchi e memorizza i file in due raccolte. Più file, più overhead. Se ti aspetti che i file abbiano le stesse dimensioni, non superiori a 32M circa, sei nel modo giusto. Non provare a memorizzare file di grandi dimensioni su gridfs. Perché?

  1. I driver in lingue diverse possono leggere l'intero file (ad esempio blocchi) durante la lettura di una piccola parte del file.
  2. La modifica del file può influenzare tutti i blocchi e aumentare il carico del database Se il tuo file system sta crescendo, dovrai decidere di suddividere il gridfs. Stai attento! La coerenza non è garantita durante l'inizializzazione dello sharding!

Se pensi di leggere il progetto caricato, considera di caricare i file direttamente nei documenti (se di dimensioni pari o inferiori a 16 M) o scegli un altro clusterfs e collega il nome del file / inode alla tua logica.

Spero che sia di aiuto.


4
Sono abbastanza nuovo su GridFS anche se da quello che ho capito GridFS è più di un semplice livello di astrazione che raddoppia il numero di file. GridFS fornisce un modo semplice per sfruttare le funzionalità di replica e sharding di MongoDB. Credo che altri abbiano anche menzionato che i file sono archiviati in blocchi da 2 GB che immagino ridurrebbe il numero totale di file, soprattutto se qualcuno ha una quantità molto grande di piccole immagini.

+1 Hai ragione. Anche file più piccoli non trarrebbero vantaggio dall'archiviazione con GridFS. Se il tuo file può essere memorizzato in un documento MongoDB (cioè <del suo limite di dimensione di 16 MB), preferiresti archiviare il file come BLOB all'interno di un documento MongoDB. Aggirerà il sovraccarico dell'utilizzo di GridFS in aggiunta allo storage MongoDB. Vedi compose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.