Il modo migliore per progettare lo storage di file per il sistema di elaborazione delle immagini

0

Apprezzerebbe qualsiasi raccomandazione riguardante la progettazione di un servizio di elaborazione delle immagini ad alto carico.

Ci sono molte (decine di centinaia di immagini relativamente grandi (~ 10 ... 20 Mb ciascuna) che devono essere elaborate usando i comandi della riga di comando quando richiesto.

Generalmente: richiesta- > elaborazione immagine- > risultato. Ovviamente, il sistema deve essere in grado di scalare per sopportare un carico considerevole.

La mia preoccupazione e credo che il nucleo del sistema progetta un archivio di file:

  • L'utilizzo di una singola memoria di file di rete (condivisione di file, samba o qualcosa di simile) sembra inefficace, poiché questa unica e unica memoria di rete è un collo di bottiglia.

  • Avere più istanze delle stesse memorie di file su ciascun nodo (e in qualche modo replicare i file) è costoso.

  • Memorizzare le immagini in db? Per me sembra praticamente inutilizzabile per file di grandi dimensioni e elaborazione da riga di comando.

Ho considerato progetti più complessi come avere una grande memoria e memorizzare localmente file usati frequentemente; ma sembra un po 'troppo complicato e non affidabile.

Esistono buone pratiche o modelli per problemi come questo?

    
posta Dmitry Karpezo 14.11.2017 - 19:48
fonte

2 risposte

3

In pratica hai due "direzioni" in cui puoi scalare la memoria del file system: verticalmente e orizzontalmente.

Il ridimensionamento verticale è fondamentalmente solo facendo un disco più veloce. La mossa ovvia qui è da singolo disco rotante a SSD, possibilmente in un RAID. Ciò consente di creare un file system con larghezza di banda e throughput maggiori. Prima che gli SSD fossero comuni, potreste aver preso in considerazione l'utilizzo di un numero di dischi rigidi effettivi, ma in un RAID per ottenere una maggiore larghezza di banda da ciò che si presenta all'utente come una singola unità logica. Questo can vale la pena di essere preso in considerazione se hai bisogno di più spazio di archiviazione di quello che sei disposto a comprare SSD per.

Il ridimensionamento orizzontale in questo caso è una questione di avere un certo numero di "file system" separati che assomigliano a un singolo file system. Fortunatamente hai a che fare con file che sono abbastanza piccoli per pianificare solo la memorizzazione di ciascuno su un singolo file system (diversamente da un database che potrebbe richiedere un singolo file di un centinaio di terabyte o più). Ciò significa che puoi scalare in modo abbastanza semplice orizzontalmente (ad esempio) con un numero di server che ogni archivio contiene un sottoinsieme specifico dei file che ti interessa, e usa (per esempio) un hash del nome del file per determinare quale server memorizzerà ogni file.

Quindi, per utilizzarlo avresti fondamentalmente un numero di file server e un elenco di file da elaborare. Se hai intenzione di avere più client che elaborano i file, dividi l'elenco tra loro. Ogni client passa attraverso i nomi nella sua parte dell'elenco, esegue il hash del nome per trovare il server per quel file e recupera / elabora il file.

A seconda della rete e di quello che stai facendo con il risultato dell'elaborazione, c'è un'altra possibilità da considerare: iniziare con lo stesso set di server e la stessa lista di input. Inserisci i nomi e invia ciascun nome direttamente al server in cui è archiviato quel file. Invece di recuperare il file e inviarlo tramite la rete, il server recupera ed elabora il file stesso.

Quest'ultimo può avere un vantaggio significativo se il risultato dell'elaborazione deve essere memorizzato insieme al file originale e / o si può avere a che fare con una rete relativamente lenta (poiché richiede solo la trasmissione dei nomi di file sulla rete, che normalmente ci aspettiamo di essere un lotto più piccolo del contenuto del file).

    
risposta data 15.11.2017 - 01:25
fonte
2

È possibile utilizzare un file system distribuito come GFS o HDFS o utilizzare una rete di archiviazione che aumenterà la complessità dell'architettura ma consentirà di scalare orizzontalmente un po 'meglio.

Il tuo collo di bottiglia sarà l'IO della rete a questo punto.

    
risposta data 15.11.2017 - 00:02
fonte

Leggi altre domande sui tag