Saltar la navegación

2.5.- Configurar Tomcat en cluster.

Caso práctico

Una vez que se han puesto las aplicaciones que BK programación ha terminado de desarrollar en el servidor de Tomcat, se ha observado un incremento exponencial en el número de clientes que acceden a los servicios de dichas aplicaciones, motivo por el cual se ha pensado en establecer algún tipo de cluster sobre el servidor para poder atender eficientemente a las peticiones de los usuarios.

Ilustración de un clúster de servidores en rack.
Br1dotcom (CC BY)

Debido al incremento de las aplicaciones web, la escalabilidad y la disponibilidad se transforma en un recurso transcendental para garantizar el servicio eficiente a los clientes web; la implementación de clustering para los servidores de aplicaciones web es una solución eficaz y relativamente sencilla.

La implementación de clustering con Tomcat provee:

  • Escalibilidad: si para ofrecer un servicio solicitado por un cliente web, un servidor web invierte un tiempo "T", para satisfacer un número elevado de servicios, cabe preguntarse cuánto es el tiempo invertido. La respuesta ideal a la cuestión anterior sería que el tiempo invertido fuese lo más próximo posible al tiempo invertido en una única petición, es decir lo más cercano posible a "T".

    Para ello existen dos posibles soluciones: escalado horizontal (implica el incremento del número de servidores), escalado vertical (implica el incremento de los recursos del propio servidor).

  • Alta disponibilidad: Tomcat provee failover; en el motor del servidor existen dos tipos de failover provistos por clustering:
    • Request-level failover: Si un servidor cae, los siguientes requerimientos se redireccionarán a otros servidores activos.
    • Session-level failover: En el caso de que un servidor deje de dar servicio, otro servidor del cluster debería proporcionar la sesión a los clientes consiguiendo reducir al mínimo la pérdida de conexión, ello implica replicar la sesión en el cluster en la nueva máquina en el mínimo tiempo posible.
  • Balanceo de carga: establecer un método de reparto de la carga de peticiones entre los servidores del cluster, de modo que se minimice el tiempo de respuesta a las solicitudes de los clientes; se consigue empleando algoritmos de distribución de carga.

Las soluciones de clustering típicas ofrecen un paradigma de servidor que consiste en ofrecer un sistema basado en ejecución distribuida, a pesar de que existe limitación respecto a la escalabilidad, podemos observar el esquema de Jakarta Tomcat server engine works.

Clustering/Session Replication How-To (en inglés)

El conector del servidor de cluster recibe la petición desde los clientes, y el procesador del servidor de cluster encapsula las peticiones en los objetos "RequestEntry" y los escribe en JavaSpace. El conector del Worker del cluster toma dichas peticiones y el procesador del worker del cluster resuelve las peticiones.

Para establecer una configuración de cluster en Tomcat podremos seguir los siguientes pasos:

  • Todos los atributos de sesion deben implementar java.io.Serializable.
  • Descomentar el elemento Cluster en server.xml.
  • Descomentar Valve (ReplicationValve) en server.xml
  • Si las múltiples instancias de Tomcat están en la misma máquina el parámetro tcpListenPort tiene que ser único para cada una de las instancias.
  • Establecer en el archivo web.xml el elemento <distributable/> o bien definirlo de forma <Context distributable="true"/>.
  • El atributo jvmRoutes tiene que estar definido en el "Engine" <Engine name="Catalina" jvmRoute="nodeX"> estableciendo su valor al nombre de la instancia en el cluster.
  • Sincronizar la hora de todos los nodos con un servicio NTP.
  • Configurar el parámetro loadbalancer en modo "sticky session".