Attualmente sto configurando un sistema simile (a livello professionale) e questo è il design che ho scelto:
- Due loadbalancer Nginx (entrambi attivi, entrambi con failover per l'altro, bilanciati con DNS round robin)
- Due database MySQL in modalità di replica master master
- Due istanze di Tomcat come cluster tomcat
- Due istanze Memcached per la memorizzazione nella cache e nella condivisione dello stato della sessione per il cluster Tomcat
Ciò consentirà una soluzione ridondante, ad alta disponibilità e scalabile.
I loadbalancers (su hardware decente) bilanciano facilmente una linea saturata di 1 gbit ciascuno. Questo è anche un ottimo posto per lo scaricamento di SSL.
Puoi salvare le informazioni sulla sessione in memcached. Nel caso in cui un'istanza di tomcat fallisca, un'altra istanza di tomcat può recuperare informazioni rilevanti sulla sessione e i client non noteranno nulla. Non dimenticare di combinare questo con sessioni appiccicose troppo. (Per mantenere il traffico di rete verso il basso)
Il clustering Tomcat ha anche un'opzione per condividere le informazioni sulla sessione tra il cluster in tempo reale, senza usare memcached. Anche se penso che le prestazioni siano sane, usare Memcached sarà migliore.
Se hai bisogno di più potenza in una di queste applicazioni:
- Nginx: aggiungi più loadbalancer, anche se non credo che questo sarà il collo di bottiglia molto presto.
- Tomcat: puoi facilmente aumentare le dimensioni del cluster Tomcat o aggiungere altri cluster
- Mysql: aggiungi alcuni slave di sola lettura o aumenta la dimensione del cluster (a seconda dell'applicazione, ma dal momento che hai scritto un'applicazione basata su REST, questo non dovrebbe essere un problema)
- Memcached: aggiungi altri nodi, Memcached scala piuttosto bene, credo.
Non so come sia costruita la tua applicazione e quali siano i grandi hog delle risorse, ma se vedi un carico elevato del database (durante i tuoi loadtest!), aggiungere una cache tra l'applicazione e il database potrebbe sicuramente migliorare notevolmente le prestazioni . Ma non dimenticare che non tutto è intercambiabile, se le tue domande sono sempre diverse, il caching non aiuta (molto)
Il mio consiglio è di scaricare VMware Workbench (o un similare software di virtualizzazione) e provare a creare una configurazione semplice. Nessun bilanciamento del carico o clustering, solo le basi e il lavoro da lì. Uno ad uno aggiunge più funzionalità (bilanciamento, memorizzazione nella cache, clustering, ecc.) E assicurati di fare qualche ricerca su ciascun argomento, così saprai che hai fatto la scelta giusta.
Se continui a eseguire gli stessi test delle prestazioni durante questo processo, puoi vedere da solo se usare X è meglio che usare Y nel tuo setup, o che impatto ha il caching avrà, ecc.
Alla fine, una configurazione come questa dipende molto dalle esigenze della tua applicazione e dei suoi clienti, tutto può essere fatto in vari modi, ognuno con i suoi punti di forza e di debolezza.
Altre domande?
Buona fortuna!
Wesley