Attualmente sto installando un sistema simile (a livello professionale) e questo è il design che ho scelto:
- Due bilanciatori del carico Nginx (entrambi attivi, entrambi di failover per l'altro, bilanciati con il round robin DNS)
- Due database MySQL in modalità master master replica
- Due istanze Tomcat come cluster Tomcat
- Due istanze Memcached per la memorizzazione nella cache e la condivisione dello stato della sessione per il cluster Tomcat
Ciò consentirà una soluzione ridondante, ad alta disponibilità e scalabile.
I loadbalancer (su hardware decente) bilanciano facilmente una linea satura da 1 gbit ciascuno. Questo è anche un ottimo posto per l'offloading SSL.
È possibile 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 anche questo con sessioni appiccicose. (Per limitare il traffico di rete)
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 sagge, l'uso di 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: è possibile aumentare facilmente le dimensioni del cluster Tomcat o aggiungere più cluster
- Mysql: aggiungi alcuni slave di sola lettura o aumenta le dimensioni del cluster (a seconda della tua applicazione, ma poiché hai scritto un'applicazione basata su REST, questo non dovrebbe essere un problema)
- Memcached: aggiungi più nodi, credo che le scale Memcached siano abbastanza buone.
Non so come sia la tua applicazione e quali siano i grandi maiali delle risorse, ma se vedi un carico elevato del database (durante i tuoi test di carico!), L'aggiunta di una cache tra l'applicazione e il database potrebbe sicuramente migliorare molto le prestazioni. Ma non dimenticare che non tutto è ricambiabile, se le tue domande sono sempre diverse, la memorizzazione nella cache non aiuterà (molto)
Il mio consiglio sarebbe di scaricare VMware Workbench (o software di virtualizzazione simile) e provare a creare una configurazione semplice. Nessun bilanciamento del carico o clustering, solo le basi e il lavoro da lì. Uno ad uno aggiungi altre funzionalità (bilanciamento, memorizzazione nella cache, clustering, ecc.) E assicurati di fare qualche ricerca su ogni 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 l'uso di X è migliore dell'uso di Y nella configurazione o quale impatto avrà la cache, ecc.
Alla fine, una configurazione come questa dipende davvero dai requisiti della tua applicazione e dei suoi client, tutto può essere fatto in vari modi, ognuno con i suoi punti di forza e di debolezza.
Altre domande?
In bocca al lupo!
Wesley