Actualmente estoy configurando un sistema similar (a nivel profesional) y este es el diseño que he elegido:
- Dos balanceadores de carga Nginx (ambos activos, ambos failover para el otro, balanceados con DNS round robin)
- Dos bases de datos MySQL en modo maestro maestro de replicación
- Dos instancias de Tomcat como un clúster de tomcat
- Dos instancias de Memcached para el almacenamiento en caché y el estado de sesión compartido para el clúster Tomcat
Esto logrará una solución redundante, de alta disponibilidad y escalable.
Los equilibradores de carga (en hardware decente) equilibrarán fácilmente una línea saturada de 1 gbit cada uno. Este también es un gran lugar para la descarga de SSL.
Puede guardar la información de su sesión en memcached. En caso de que una instancia de tomcat falle, otra instancia de tomcat puede recuperar información relevante de la sesión y los clientes no notarán nada. No olvides combinar esto con sesiones adhesivas también. (Para mantener el tráfico de red bajo)
El clúster de Tomcat también tiene una opción para compartir información de sesión entre el clúster en tiempo real, sin usar memcached. Aunque creo que el rendimiento es inteligente, usar Memcached será mejor.
Si necesita más potencia en cualquiera de estas aplicaciones:
- Nginx: agregue más balanceadores de carga, aunque no creo que este sea el cuello de botella muy pronto.
- Tomcat: puede aumentar fácilmente el tamaño del clúster Tomcat o agregar más clústeres
- Mysql: agregue algunos esclavos de solo lectura o aumente el tamaño del clúster (dependiendo de su aplicación, pero dado que escribió una aplicación basada en REST, esto no debería ser un problema)
- Memcached: Agregue más nodos, Memcached escala bastante bien, creo.
No sé cómo se compila su aplicación y cuáles son los grandes recursos de recursos, pero si ve una gran carga de base de datos (¡durante sus pruebas de carga!), Agregar un caché entre la aplicación y la base de datos ciertamente podría mejorar mucho el rendimiento. Pero no olvide que no todo es almacenable en caché, si sus consultas son siempre diferentes, el almacenamiento en caché no ayudará (mucho)
Mi consejo sería descargar VMware Workbench (o un software de virtualización similar) e intentar crear una configuración simple. Sin equilibrio de carga ni agrupamiento, solo lo básico y el trabajo a partir de ahí. Una por una, agregue más funciones (equilibrio, almacenamiento en caché, agrupamiento, etc.) y asegúrese de investigar un poco sobre cada tema, para que sepa que ha elegido correctamente.
Si sigue ejecutando las mismas pruebas de rendimiento durante este proceso, puede ver por sí mismo si usar X es mejor que usar Y en su configuración, o qué impacto tendrá el almacenamiento en caché, etc.
Al final, una configuración como esta realmente depende de los requisitos de su aplicación y sus clientes, todo se puede hacer de varias maneras, cada una con sus propias fortalezas y debilidades.
¿Alguna pregunta más?
¡Buena suerte!
Wesley