Atualmente, estou configurando um sistema semelhante (em nível profissional) e esse é o design que escolhi:
- Dois balanceadores de carga Nginx (ambos ativos, ambos com failover para o outro, equilibrados com rodízio de DNS)
- Dois bancos de dados MySQL no modo de replicação mestre principal
- Duas instâncias do Tomcat como um cluster do tomcat
- Duas instâncias Memcached para armazenamento em cache e compartilhamento de estado da sessão para o cluster Tomcat
Isso alcançará uma solução redundante, de alta disponibilidade e escalável.
Os balanceadores de carga (em hardware decente) facilmente balancearão uma linha saturada de 1gbit cada. Este também é um ótimo local para descarregamento de SSL.
Você pode salvar suas informações da sessão no memcached. Caso uma instância do tomcat falhe, outra instância do tomcat poderá recuperar informações relevantes da sessão e os clientes não perceberão nada. Não se esqueça de combinar isso com sessões complicadas também. (Para manter o tráfego de rede baixo)
O cluster do Tomcat também tem uma opção para compartilhar informações da sessão entre o cluster em tempo real, sem usar o memcached. Embora eu pense em desempenho, usar o Memcached será melhor.
Se você precisar de mais energia em qualquer um desses aplicativos:
- Nginx: Adicione mais balanceadores de carga, embora eu não ache que esse seja o gargalo muito em breve.
- Tomcat: você pode aumentar facilmente o tamanho do cluster do Tomcat ou adicionar mais clusters
- Mysql: adicione alguns escravos somente leitura ou aumente o tamanho do cluster (dependendo do seu aplicativo, mas desde que você escreveu um aplicativo baseado em REST, isso não deve ser um problema)
- Memcached: adicione mais nós, o Memcached dimensiona muito bem, acredito.
Não sei como seu aplicativo é construído e quais são os grandes recursos, mas se você vir uma alta carga de banco de dados (durante seus testes de carga!), Adicionar um cache entre o aplicativo e o banco de dados certamente pode melhorar muito o desempenho. Mas não se esqueça que nem tudo é fácil de alterar, se suas consultas sempre forem diferentes, o cache não ajudará (muito)
Meu conselho seria baixar o VMware Workbench (ou software de virtualização similair) e tentar criar uma configuração simples. Sem balanceamento de carga ou cluster, apenas o básico e o trabalho a partir daí. Adicione um por um mais recursos (balanceamento, armazenamento em cache, clustering etc.) e faça uma pesquisa sobre cada tópico, para que você saiba que fez a escolha certa.
Se você continuar executando os mesmos testes de desempenho durante esse processo, poderá ver por si mesmo se usar X é melhor que usar Y na sua instalação ou qual o impacto do cache, etc.
No final, uma configuração como essa realmente depende dos requisitos do seu aplicativo e de seus clientes, tudo pode ser feito de várias maneiras, cada uma com suas próprias forças e fraquezas.
Mais alguma pergunta?
Boa sorte!
Wesley