2011-01-17 12 views
8

Eseguo un sito di condivisione di immagini con oltre 1 milione di immagini (~ 150 GB). Attualmente sto memorizzandoli su un disco rigido nel mio server dedicato, ma sto rapidamente esaurendo lo spazio, quindi mi piacerebbe trasferirli su Amazon S3.Spostamento di 1 milione di file di immagine su Amazon S3

Ho provato a fare un RSYNC e ci sono voluti RSYNC in un giorno solo per scansionare e creare l'elenco dei file di immagine. Dopo un altro giorno di trasferimento, è stato completato solo al 7% e ho rallentato il mio server fino alla scansione, quindi ho dovuto annullare.

C'è un modo migliore per fare questo, come GZIP su un altro disco rigido locale e quindi trasferire/decomprimere quel singolo file?

Mi chiedo anche se abbia senso archiviare questi file in più sottodirectory o è bello avere tutti i milioni + file nella stessa directory?

+3

questo non è programmazione relativa. – Alan

+0

Si potrebbe semplicemente eseguirlo di notte quando il server non è così occupato. Inoltre c'è lo strumento "bello" che potrebbe ridurre il tuo problema di lentezza. Poiché rsync può essere configurato per saltare i duplicati, la velocità migliorerà alla fine. Sicuramente dividerei le immagini in sottodirectory dato che molti comandi di Linux iniziano a fallire una volta che ottieni> 100.000 file. Un altro problema, puoi esaurire gli inode se hai troppi file. –

risposta

5
  1. Dato che non esistono i file (ancora) su S3, inviarli come file di archivio dovrebbe essere più veloce rispetto all'utilizzo di un protocollo di sincronizzazione.

  2. Tuttavia, la compressione dell'archivio non è di grande aiuto (se non del tutto) per i file di immagine, presupponendo che i file di immagine siano già memorizzati in un formato compresso come JPEG.

  3. trasmissione ~ 150 Gbyte di dati sta per consumare un sacco di larghezza di banda di rete per un lungo periodo di tempo. Questo sarà lo stesso se si tenta di utilizzare HTTP o FTP invece di RSYNC per eseguire il trasferimento. Un trasferimento offline sarebbe meglio se possibile; per esempio. invio di un disco rigido o di un set di nastri o DVD.

  4. Mettere un milione di file in una directory appartamento è una cattiva idea dal punto di vista delle prestazioni. mentre alcuni file system sarebbe far fronte a questo abbastanza bene con tempi di ricerca O(logN) nome del file, gli altri fanno non con il nome del file O(N) ricerca. Moltiplicare che per N accedere a tutti i file in una directory. Un ulteriore problema è che le utility che devono accedere ai file in ordine di nomi di file possono rallentare in modo significativo se devono ordinare un milione di nomi di file. (Questo potrebbe in parte spiegare perché rsync ha impiegato 1 giorno per fare l'indicizzazione.)

  5. Mettere tutti i file di immagine in una directory è una cattiva idea dal punto di vista gestionale; per esempio. per fare i backup, l'archiviazione di roba, spostando i dati, l'espansione a più dischi o file system, ecc

+0

Sarebbe ragionevole suddividere i file da 1 m in 1.000 sottodirectory? Non c'è motivo di avere più di 1 livello di file? – makeee

+0

Sì, lo farebbe. Ci sono vari modi per farlo, a seconda di come vengono denominati e organizzati, di come li vuoi gestire, ecc. –

+1

Se ho intenzione di dividere i file, gzip non sembra avere senso .. I può semplicemente passare in rassegna ogni elemento nel database, afferrare il nome del file, copiare il file in S3, cambiare il suo nome file nel suo ID autoincrement mysql. Quindi posso semplicemente dividere i file in base al loro ID (in più non dovrò più avere una colonna nome file nel db). Anche se ci vuole un mese, posso almeno fare qualche porzione ogni giorno e iniziare a leggere da S3 per i file che sono su S3, e cancellare i vecchi file sul server per risparmiare spazio. Sembra ragionevole? – makeee

4

Un'opzione che è possibile utilizzare invece di trasferire i file sulla rete è di metterli su un hard disk e spedirli al servizio di Amazon import/export. Non dovete preoccuparvi di saturare la connessione del server di rete ecc

+0

Purtroppo questa non è un'opzione, in quanto non ho un facile accesso al data center per fare qualcosa di simile. – makeee

25

Una possibilità potrebbe essere quella di eseguire la migrazione in modo pigro.

  • Tutte le nuove immagini vanno su Amazon S3.
  • Eventuali richieste di immagini non ancora su Amazon attivano la migrazione di quella immagine in Amazon S3. (mettilo in coda)

Questo dovrebbe abbastanza rapidamente ottenere tutte le immagini recenti o comunemente recuperate spostate su Amazon e quindi ridurre il carico sul server. È quindi possibile aggiungere un'altra attività che migra lentamente gli altri quando il server è meno occupato.

+1

bel suggerimento! – sdolgy

+2

Ho seguito esattamente questo approccio di recente, quando avevo bisogno di migrare 40 milioni di immagini su S3. Ho messo il codice che ho usato su Github, spero che qualcun altro lo trovi utile: https://github.com/mikery/s3cacher –

+0

Anche io preferisco questa idea. Elegante. –

Problemi correlati