5

Supponiamo di avere istanza1, istanza2 e istanza3 in esecuzione in AWS.Qual è il modo migliore per consentire alle persone di caricare file in un ambiente con carico bilanciato AWS?

Tutti eseguono Apache e l'applicazione Web da eseguire deve consentire agli utenti di caricare immagini, come in molti progetti.

Anche quando si sta visualizzando l'immagine è necessario ritagliarla alla giusta dimensione, quindi è fondamentalmente necessario assicurarsi che tutte le istanze abbiano accesso agli stessi file in ogni momento.

Quindi diciamo che un utente carica un'immagine su instance1 e un altro utente sta visitando una pagina in cui la stessa immagine è mostrata in 100x100, e colpisce istanza2. Un altro utente sta cercando di vedere la stessa immagine nella dimensione 300x300 su instance3. E molte altre dimensioni che non sono facilmente prevedibili.

Quindi, in pratica, hai bisogno di un file system distribuito, sto usando Gluster FS. Quindi tutte le istanze hanno accesso agli stessi file, quando viene fatta una richiesta per vedere un'immagine, ho uno script PHP che controlla che l'immagine sia già stata ridimensionata alle dimensioni specificate se sì mostrerà loro se non verrà ridimensionata e poi mostrare di nuovo.

Gluster FS sta funzionando molto bene e sono molto soddisfatto, tranne che penso che sto reinventando la ruota e AWS dovrebbe avere una sorta di soluzione per questo. Con il comando top posso vedere che glusterfs usa sempre parte della mia CPU.

Uso anche CloutFront per memorizzare in cache l'output del mio script di ridimensionamento, che riduce il carico del server in buona misura, ma Gluster FS è ancora costoso da eseguire.

È possibile utilizzare rsync e una sorta di cron job per fare lo stesso senza Gluster FS ma è un sacco di lavoro e non molto affidabile, perché è necessario sapere quando attivare il processo di rsync e non lo si vuole ottieni i grandi benefici offerti da Gluster FS. Ho anche provato s3fs e mi piacerebbe solo dire che è stato un vero incubo.

Le unità NFS sembrano anche molto primitive rispetto a Gluster FS, penso che utilizzino UDP, quindi trattano i dati come se non importasse.

Quindi qual è il modo migliore di fare qualcosa del genere? Ho cercato di trovare un file system distribuito offerto da AWS poiché penso che molti sviluppatori avrebbero problemi uguali o simili ma non ce n'è.

Si può dire basta caricare su s3, ma s3 non mi aiuta, ho bisogno di sapere se l'immagine è già ridimensionata o meno, quindi ridimensionare e servire o semplicemente servire, quindi ho bisogno di qualcosa che posso scrivere un script per.

Si può anche dire bene perché non ridimensionare tutte le immagini e poi li carica a s3, il motivo per cui non posso farlo è che

  1. ci sono circa 1 milione di immagini e 100 formati, in modo da non vediamo l'annuncio di una gigantesca quantità di file da convertire
  2. ci possono essere nuovi formati aggiunti ogni giorno, in modo da ridimensionare prima strategia non funziona
+2

Ottima domanda. Non ho capito bene perché sei limitato a scrivere uno script quando verifichi se esiste o meno un'immagine. Perché non vai avanti, ospita tutto in S3 e utilizza gli SDK disponibili per verificare se il file esiste o meno e per caricare nuove immagini ridimensionate su S3? – Viccari

risposta

0

avrei aproach con 2 S3 secchi:

  • Secchio immagine principale: carica le immagini con la risoluzione non elaborata/la migliore risoluzione utilizzata sul sito, senza scadenza.
  • Secchio cache: crea immagini on-demand, è possibile utilizzare timthumb per crearle con le dimensioni richieste e impostare il tempo di scadenza.

Quando l'utente richiede l'immagine che si verifica se esiste nel bucket della cache, altrimenti la si crea, la memorizza nel bucket della cache e la invia da lì.

Considerazioni:

  • orologio con timthumb, le vecchie versioni hanno problemi di sicurezza, è possibile verificare la presenza di alternative.
  • Squid-cache può aiutare anche, è possibile sostituire il secchio di cache con un'altra istanza EC2 con esso

Questa è solo la mia aproach ma sentitevi liberi di rispondere e afferrarla più profondo