Cluster en Glassfishv3 usando mod_jk para el balanceo de peticiones

Cluster Glassfishv3 y mod_jk

0. Índice de contenidos.

1. Entorno

Este tutorial está desarrollado usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 2Ghz Intel Core i7 (4 núcleos) 8Gb de RAM
  • Sistema Operativo: Mac OS X 10.7.2 (Lion)
  • Eclipse Indigo (Revisar tutorial de Alex para su instalación)
  • Oracle Glashfishv3
  • Versión de java SDK 6 instalada en el sistema
  • Maven3 instalado y configurado en el sistema
  • Apache con mod_jk preconfigurado (se extenderá/modificará) (Consultar un ejemplo)

2. Introducción

A continuación veremos como realizar una configuración de un cluster local con Glassfish utilizando un Apache con mod_jk para el balanceo de peticiones.

3. Arquitectura y configuración de mod_jk

El objetivo de este tutorial será comprobar la escalabilidad y la réplica de sesión para una aplicación montada en JSF. La arquitectura de servidores será la siguiente:

arquitectura

La configuración de mod_jk será la siguiente:

workers.properties

uriworkermap.properties

4. Instalación de glassfish y configuración de cluster

Lo primero que haremos será descargar una copia de glassfish desde la web: http://glassfish.java.net/es/downloads/3.0.1-final.html

Una vez descargado el archivo glassfish-3.0.1-unix-ml.sh (la versión para Mac), lo ejecutamos y seguiremos los siguientes pasos:

instalacion1

instalacion2

instalacion3

instalacion4

instalacion5

instalacion6

instalacion7

instalacion8

instalacion9

Ahora procederemos a iniciar la instancia creada de glashfish que utilizaremos como administradora del cluster. Si no hemos realizado un update de glassfish, podemos realizarlo ejecutando <GLASHFISH_HOME>/bin/updatetool (donde <GLASHFISH_HOME> es la ruta configurada en el proceso de instalación), es bastante recomendable realizarlo para solucionar posibles problemas. Abrimos un terminal, vamos a la ruta “<GLASHFISH_HOME>/glassfishv3/glassfish/bin” y ejecutamos “startserv” (si hemos updateado tendremos que ejecutar antes asadmin start-domain –upgrade en la misma ruta).

Abrimos otra consola en la misma ruta y ejecutamos el comando “asadmin”.

El primer paso será crear el cluster, al que llamaremos “cluster”:

Después creamos los dos nodos que compondrán el cluster, “node1” y “node2”:

Ahora asociaremos dos propiedades genericas para cada nodo del cluster para su comunicación con el mod_jk (el nombre del nodo y el puerto):

Ahora establecemos las dos propiedades para cada nodo del cluster:

Iniciamos el cluster:

Una vez realizados estos pasos, ya tenemos el cluster configurado para atender peticiones. Si cargamos la instancia de administración: http://localhost:4848/common/index.jsf logandonos con las credenciales introducidas en la instalación, podemos ver toda la configuración del cluster introducida. Los pasos anteriormente mencionados tambien los podriamos haber hecho mediante la herramienta de administración web, pero he optado por utilizar el comando asadmin ya que es mas potente.

cluster1

cluster2

cluster3

Propiedades nodo1

Propiedades nodo2

5. Aplicación

Crearemos un nuevo proyecto maven3 con la siguiente estructura (es la misma aplicación que utilizamos en el tutorial de clustering con Tomcat http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=tomcat7clusterjsf):

Estructura de proyecto maven

Ahora crearemos el pom.xml, en el cual nuestro objetivo será crear un paquete WAR para desplegarlo en Glassfish, y definir las dependencias con las librerías necesarias para trabajar con JSF:

El siguiente paso es la configuración de jsf en el web.xml, para que atienda todas las peticiones .jsf:

Ahora definiremos un ManagedBean con el scope session:

Y un listener para ver el ciclo de vida de la aplicación desde el que mostraremos el contenido de la sesión en cada petición:

Creamos la vista home.jsp

Por último la configuración de ambos en el faces-config.xml:

Cuando tengamos el proyecto con todas sus partes tan solo tenemos que ejecutar un mvn clean package que nos generará el archivo jsfcluster.war en la carpeta target.

6. Despliegue

Una vez generado el war lo desplegamos desde la herramienta de administración web, seleccionando el cluster, la pestaña Applications, botón Implementar:

Implementar

Seleccionamos nuestro archivo local:

Selección de archivo
Marcamos la casilla “Disponibilidad” para que tenga replicación de sesión (este parámetro en conjunto con <distributable/> del “web.xml” lo hacen posible), tambien asociaremos nuestro cluster como destino seleccionado (lo suele poner por defecto):
Disponibilidad y selección de despliegue

Selección de archivo
Y ya tenemos nuestra aplicación desplegada:
Aplicación

Cuando esté desplegado en ambos servidores modificamos la vista en la ruta “<GLASHFISH_HOME>/glassfishv3/glassfish/nodes/localhost-domain1/nodeX/applications/jsfcluster/home.jsp para cambiar las líneas que identificarán el nodo que atiende la petición (modificar la X por 1 ó 2 en cada caso):

7. Prueba de balanceo

Si todo ha ido bien, debemos estar en condiciones de realizar una peticion al apache con la siguiente url http://localhost/jsfcluster/home.jsf

Primera petición

Ahora rellenamos el campo de texto y realizamos peticiones consecutivas sobre el boton, verificando que se va variando de nodo en cada petición:

Segunda petición

Tercera petición

Si revisamos los logs de ambos servidores (“<GLASHFISH_HOME>/glassfishv3/glassfish/nodes/localhost-domain1/nodeX/logs/server.log), veremos que la sesion es la misma en cada caso:

Donde se identifican los managed beans (en nuestro caso texto) y su valor, y el arbol de componentes jsf (que debe ser exactamente el mismo en los dos nodos).

8. Problemas encontrados

Esta prueba es totalmente funcional con JSF, la versión 1.2_15 concretamente. La misma prueba la hemos realizado sobre JSF2 2.1.4 (implementación Sun Mojarra) realizando la replica de sesión correctamente (con algunos ajustes finos necesarios), contrariamente a lo que sucedía con Tomcat. Según aporta Oracle en las notas de la release http://javaserverfaces.java.net/nonav/rlnotes/2.1.4/issues.html no está probada con Tomcat ni Jetty, con lo que esperamos que en un futuro las posteriores versiones estén validadas en estos servidores.

9. Conclusiones

Como comentaba en el anterior punto, este ejemplo es extrapolable a otro tipo de aplicaciones, ya que es la configuración básica de un glassfish en cluster con replicación de sesión. Por lo menos hemos podido comprobar que jsf2 funciona en clustering, aunque sea sobre las plataformas Oracle.

Cualquier duda o sugerencia podeis comentarlo.

Saludos.