ADMINISTRACIÓN • Cluster
Cómo configurar Tomcat en cluster
REPLICACIÓN
DE SESIONES
En los entornos empresariales suele ser un requisito tener en funcionamiento aplicaciones críticas
ejecutándose en alta disponibilidad y balanceo de carga entre varios servidores. Veamos cómo se
configura Apache Tomcat para estos menesteres. POR CAYETANO DELGADO ROLDÁN
A
pache Tomcat es un contenedor implicado), pero también hay que tener todos los servidores del cluster. Para el
de servlets desarrollado en Java en cuenta que los servidores pueden ser replicado de sesiones y despliegue en
por la Apache Software Founda- compartidos entre varias aplicaciones que granja se utilizan peticiones (pings) mul-
tion que implementa las especificaciones funcionen en entornos similares. Puede ticast, que no es más que enviar la
de JSP (Java Server Pages) y Servlets de verse un listado de direcciones IP de información en una red a múltiples desti-
Sun Microsystems. A partir de la versión ejemplo en la Tabla 1. nos simultáneamente, enviándose una
5.0, Tomcat incluye la posibilidad de con- La definición de clustering en Tomcat sola vez y copiándose a nivel de enlace a
figurar varias instancias en cluster. ¿Por tiene mucho que ver con el replicado de todos los rincones de la red. Evidente-
qué íbamos a querer configurar Tomcat sesiones, que no es más que distribuir mente, esto genera demasiado tráfico,
en cluster? Pues porque los beneficios que una sesión HTTP entre los distintos nodos por lo que hay que tener cuidado con él
se obtienen son múltiples: vamos a tener de los que se compone el cluster, sesión y filtrar los pings multicasts en switchs
alta disponibilidad y alto rendimiento, ya cuyo estado se mantiene en una cookie gestionados.
que el tráfico y ejecución se distribuirán dentro del navegador. Existen tres formas
entre varias máquinas, y por otro lado, se de habilitar el replicado de sesiones:
obtiene tolerancia a fallos, ya que la caída • Usando persistencia de sesiones y
de una de las máquinas no va a afectar al guardándolas en un sistema de fiche-
funcionamiento de las aplicaciones, que- ros compartido
dando un resultado transparente para el • Usando persistencia de sesiones y
usuario. guardándolas en una base de datos
Existen varios modelos distintos a la compartida
hora de configurar un sistema que ofrezca • Usando replicación en memoria
posibilidades de alta disponibilidad, tole- mediante SimpleTcpCluster incluido
rancia a fallos y escalabilidad. Por en las últimas versiones de Tomcat 5
ejemplo, la arquitectura mostrada en la Junto a la réplica de sesiones, un con-
Figura 1, donde cada servicio (Apache, cepto bastante popular en la
Tomcat y BD) estará ubicado separada- implementación de clusters es el desplie-
mente en máquinas distintas. Esta gue en granja, que permite desplegar
solución está claro que es la que mayor una aplicación en un nodo del cluster y Figura 1: Arquitectura modelo de los distin-
coste supone (por la cantidad de “hierro” que dicho despliegue se replique en tos sistemas en cluster.
60 Número 19 WWW.LINUX-MAGAZINE.ES
Cluster • ADMINISTRACIÓN
Instalación en nodos 1.5.0, que se puede descargar desde la bastaría con ejecutar el script $CATA-
Al estar desarrollado en Java, Tomcat va a página de Sun [1] y que instalaremos, por LINA_HOME/bin/startup.sh, o bien el
funcionar en cualquier sistema operativo y ejemplo, en /opt/jdk1.5.0_07, directorio script
plataforma para la que exista una máquina que será el contenido de la variable de $CATALINA_HOME/bin/shutdown.sh para
virtual, así que la instalación y entorno $JAVA_HOME, que puede defi- detener la ejecución. Respecto a la
configuración definida a continuación nirse en el fichero /etc/profile.d/java.sh (en configuración, se realiza en el fichero
debería ser similar en cualquier entorno. CentOS) o /etc/profile (en Debian). La ins- $CATALINA_HOME/conf/server.xml, que
Nosotros vamos a usar Linux, como no iba talación de Tomcat es bastante sencilla, no es más que un fichero XML con una
a ser de otro modo, concretamente la dis- basta con descargar de la web de Tomcat serie de directivas:
tribución CentOS, aunque también habrá [2] el paquete “Core” correspondiente a la • es el elemento raíz de toda
algunas referencias a Debian. La instala- versión 5.5.17, y descomprimir, por ejem- la configuración.
ción y configuración inicial de Tomcat se plo, en /opt/tomcat55-nodo1. Este • representa un grupo de
detallará para uno de los nodos del cluster directorio se puede almacenar en la varia- conectores.
(nodo1) y luego se especificarán los cam- ble de entorno $CATALINA_HOME. Por • representa las interfa-
bios necesarios para replicar la instalación defecto, Tomcat viene configurado con su ces de clientes externos que envían
en el segundo nodo (nodo2). propio servidor web autónomo configu- peticiones a (y reciben respuestas de)
Antes de instalar Tomcat, hay que tener rado en el puerto 8080. El puerto 8005, un Service particular, pueden ser de
instalada y configurada una máquina vir- además, se utiliza para enviar los coman- tipo HTTP y AJP.
tual de Java (JVM), de Sun o IBM, versión dos de gestión al servidor Catalina. Es • Contenedores, que son los componen-
importante tener esto en cuenta ya que es tes que procesan las peticiones
Listado 1: Ejemplo de uno de los errores típicos que nos pode- recibidas y generan las correspondien-
jk.conf mos encontrar si esos puertos ya tes respuestas. Un contenedor de tipo
01 LoadModule jk_module estuviesen en uso por cualquier otro pro-
ceso. Tabla 1: Direcciones IP de
modules/mod_jk.so
02 Como el propósito de este artículo no es servidores
03 JKWorkersFile una introducción a Tomcat, para aquellos
que quieran conocer en profundidad cómo Servidor IP
“conf/workers.properties”
Servidor web 192.168.10.1
04 JkLogFile “logs/mod_jk.log” funciona y se configura, tendrán que
Tomcat nodo1 192.168.10.2
05 JkLogLevel error pasarse por la documentación oficial dis-
Tomcat nodo2 192.168.10.3
06 JkMount /* front ponible en [3]. De todas formas, a modo
Servidor BD 192.168.10.4
de resumen rápido, para iniciar Tomcat
WWW.LINUX-MAGAZINE.ES Número 19 61
ADMINISTRACIÓN • Cluster
Listado 2: Ejemplo de configuración CATALINA_HOME/conf/server.xml
01 23 xmlValidation=”false” ter”
02 48
className=”org.apache.catalina. 24 path=”/servlets-examples” 49
03
className=”org.apache.catalina. docBase=”servlets-examples” 50
mbeans.ServerLifecycleListener” distributable=”true”/> 51 25 managerClassName=”org.apache.ca .*\.png;.*\.htm;.*\.html;.*\.cs
05
className=”org.apache.catalina. ager” 53 expireSessionsOnShutdown=”false cluster.session.JvmRouteBinderV
06 ” alve”
07 28 54
08
name=”UserDatabase” 29 55
atabase” clusterName=”TOMCAT cluster”> 56 mcastPort=”45564” 59
13 36 watchDir=”${catalina.base}/war-
14 mcastFrequency=”500” listen/”
15 37 60
16 watchEnabled=”true”/>
address=”192.168.10.2” 38 61
port=”8009” 39
protocol=”AJP/1.3” /> ” 63
18 41 64
19
defaultHost=”localhost” 42 66
jvmRoute=”nodo1”> tcpListenPort=”4001” 67
20
resourceName=”UserDatabase”/> 45
22 recibe todas las respuestas sepa el lugar al que redireccionar las
(ajp13)
de un , un ges- peticiones ante una caída y recupera-
07 worker.nodo1.type=ajp13
tiona todas las peticiones de un ción.
08 worker.nodo1.host=192.168.10.2
determinado host virtual y un gestiona las peticiones de una el conector HTTP/S del puerto 8080,
10 worker.nodo1.lbfactor=1
determinada aplicación web. que no se va a usar, ya que sólo vamos
11 worker.nodo1.cachesize=10
• Otros componentes, que pueden resi- a utilizar el conector AJP en el puerto
12 worker.nodo1.cache_timeout=600
dir dentro de un o de 8009, que servirá para sincronizar con
13
un . el servidor web Apache HTTPD. De
worker.nodo1.socket_keepalive=
Ahora vamos a por la configuración. La todas formas, es habitual dejar el
1
verdad es que pueden dejarse por defecto conector 8080 en los entornos de
14 worker.nodo1.socket_timeout=60
la inmensa mayoría de los parámetros, desarrollo. También puede indicarse la
15 # Set properties for nodo2
algunos de ellos se pueden quitar porque dirección IP donde escuchará el conec-
(ajp13)
están comentados, o simplemente porque tor, que aunque no es obligatorio, es
16 worker.nodo2.type=ajp13
están activados a modo de ejemplo, pero útil en el caso de que tengamos varias
17 worker.nodo2.host=192.168.10.3
no suelen ser necesarios. Respecto a los tarjetas de red con distintas IP.
18 worker.nodo2.port=8009
que se pueden quitar o. por el contrario • Como contexto se deja el de una de las
19 worker.nodo2.lbfactor=1
son imprescindibles, nos lo irá dando la aplicaciones web que vienen como
20 worker.nodo2.cachesize=10
experiencia de instalación de tipo de entor- ejemplo. En este caso se trata de los
21 worker.nodo2.cache_timeout=600
nos. La parte que hace referencia a la ejemplos de servlets, que además nos
22
configuración del cluster viene comentada servirá más adelante para probar el
worker.nodo2.socket_keepalive=
por defecto, por lo que habría que quitar replicado de sesiones. En dicho con-
1
los comentarios que engloban a texto es muy importante el parámetro
23 worker.nodo2.socket_timeout=60
. Las etiquetas de distributable=”true”, que indicará al
24 # Set properties for front
Cluster se pueden poner tanto a nivel de servidor Tomcat que dicha aplicación
(lb) which use nodo1 and nodo2
como a nivel de , con tiene que mantener la sesión en todos
25 worker.front.type=lb
lo que conseguiremos, respectivamente, los nodos del cluster.
26
clusterizar Tomcat a nivel de todo el servi- • La configuración del cluster establece
worker.front.balance_workers=n
dor, o bien por cada uno de los hosts ese nodo como máster en el desplie-
odo1,nodo2
virtuales configurados. Para configurar un gue (Sender) de las aplicaciones en la
27
cluster con los parámetros por defecto (por granja en modo “pooled”. Las otras
worker.front.sticky_session=tr
ejemplo para entornos de pruebas o opciones de replicación posibles son
ue
desarrollo), bastaría con añadir la opción synchronous, asynchronous o fastas-
yncqueue.
instalación en el nodo2 cambiando cómo se descubren entre sí ambos nodos y
simplemente la dirección IP en el se replican las sesiones que haya
en Engine o Host. parámetro address del conector y del disponibles. Un ejemplo de este
En el Listado 2 puede verse un fichero cluster, así como cambiar nodo1 por nodo2 funcionamiento se puede ver en la Figura 3.
de ejemplo de configuración completa para en el parámetro jvmRoute en la directiva
el nodo1. Veámoslo más en detalle: Engine. Y ahora manos a la obra. Iniciamos Balanceando la carga
• Se añade en Engine el parámetro el nodo1 y nos fijamos en el fichero de Como balanceo de carga se podrían utili-
jvmRoute=”nodo1”, que en realidad trazas CATALINA_HOME/logs/catalina.out zar distintas técnicas: vía DNS (con
se usa en arquitecturas con más de dos con nuestro paginador favorito (a mí me políticas de resolución de IP en bucle
nodos, para que la máquina virtual gusta less y pulsar F), esperamos a que RoundRobin), o bien con algún servicio
WWW.LINUX-MAGAZINE.ES Número 19 63
ADMINISTRACIÓN • Cluster
tipo Linux Virtual Server en cada uno de
Tabla 3: Tipos de workers
los nodos para que hagan el balanceo de
carga a nivel de red, o incluso se podría Tipo Descripción
usar la aplicación balancer que viene de ajp12 Worker que implementa el protocolo ajpv12. (a extinguir)
ejemplo con Tomcat. Nosotros vamos a ajp13 Worker que implementa el protocolo ajpv13.
usar mejor el servidor web Apache jni Worker que implementa peticiones JNI.
HTTPD, configurado con el módulo lb Worker para balanceo de carga.
status Worker de estado para gestión de balanceo de carga.
mod_jk disponible dentro de Tomcat Con-
nectors [4]. Para instalarlo se podría
utilizar el paquete que exista en la distribu- significado de los llamados workers, cuyo Listado 4: Script de inicio
ción en cuestión (mod_jk-ap20 en CentOS fichero de configuración se referencia /etc/init.d/tomcat
o libapache2-mod-jk en Debian), pero por mediante el JKWorkersFile, ubicado en el
01 #!/bin/bash
compatibilidad con las últimas versiones directorio conf/ de Apache. ¿Qué es un
02 #
de Tomcat que estamos usando, es preferi- worker? Pues es una instancia de Tomcat
03 # tomcat
ble compilarlo a partir de las fuentes. Para que ejecuta peticiones de servlets recibidas
04 #
ello bastaría con descargar la versión desde un servidor web, o lo que es lo
05 # chkconfig: 345 63 37
1.2.15 y tener instalado el paquete de mismo, el servidor Apache se encargará,
06 # description: Start up the
desarrollo de Apache (como siempre, mediante la directiva JkMount, de redirigir
Tomcat servlet engine.
httpd-devel en CentOS y apache2-dev en la url de la petición recibida hacia un
07
Debian) que proporciona apxs (APache worker concreto. En el fichero de ejemplo
08
eXtenSion tool). se establece que todas las peticiones
CATALINA_HOME=”/opt/tomcat55-n
recibidas (/*) se redirijan al worker
odo1/”
tar -xzvf jakarta-tomcat-U “front”.
09
connectors-1.2.15-src.tar.gz Vamos ahora a por el fichero del Listado
10 case “$1” in
cd jakarta-tomcat-connectorsU 3, workers.properties, donde se definen los
11 start)
-1.2.15-src/jk/native distintos tipos de workers desplegados,
12 if [ -f
./configure —with-axps=/usrU como los indicados en la Tabla 3. En nues-
$CATALINA_HOME/bin/startup.sh
/sbin/axps tro caso, se trata de un único worker, que
];
make va a trabajar como balanceador de carga.
13 then
Ojo porque en la directiva workers.list sólo
14 echo $”Starting
Para instalarlo, copiamos el módulo resul- se incluyen los workers, separados por
Tomcat”
tante en el directorio de módulos del comas, que vayan a ser usados en el
15 /bin/su tomcat
servidor web (/usr/lib/httpd/modules/ en fichero jk.conf, los nodos que se conecten
$CATALINA_HOME/bin/startup.sh
CentOS y /usr/lib/apache2/modules/ en a los nodos de un cluster sólo se usan en la
16 fi
Debian): definición del worker de tipo “lb”.
17 ;;
El fichero de configuración comienza
18 stop)
cp apache-2.0/mod_jk.so U con la definición de varias propiedades
19 if [ -f
/usr/lib/httpd/modules/ comunes, como es el directorio de logs de
$CATALINA_HOME/bin/shutdown.sh ];
Apache (utilizado para que el módulo
20 then
Ya sólo queda cargar y configurar el mod_jk, que también guarda trazas) y un
21 echo $”Stopping
módulo en el servidor. Para ello creamos parámetro “ps” que se utiliza para indicar
Tomcat”
un fichero jk.conf como el del Listado 1, el separador de rutas (/ en Linux/Unix y \
22 /bin/su tomcat
ubicado en el directorio de carga para Windows). Después de definir el
$CATALINA_HOME/bin/shutdown.sh
automática de Apache (/etc/httpd/conf.d número de workers existentes, se pasa a
23 fi
en CentOS y /etc/apache2/conf.d en detallar el funcionamiento de cada uno.
24 ;;
Debian). Es ahora cuando entra en juego el Como vemos, existe un worker por cada
25 restart)
26 /bin/su tomcat
$CATALINA_HOME/bin/shutdown.sh
27 sleep 5
28 /bin/su tomcat
$CATALINA_HOME/bin/startup.sh
29 ;;
30 *)
31 echo $”Usage: $0
{start|stop|restart}”
32 exit 1
33 ;;
Figura 2: Página inicial de Tomcat Figura 3: Muestra de los ficheros de logs de
34 esac
accediendo desde la IP del balanceador. las dos instancias de Tomcat en el arranque.
64 Número 19 WWW.LINUX-MAGAZINE.ES
ADMINISTRACIÓN • Cluster
uno de los nodos, cuyo tipo es ajp13, ción y activado en los niveles de ejecución incluir en nuestra instalación de la JVM.
donde se especifica también la dirección IP típicos mediante chkconfig tomcat on en Para ello, copiamos o enlazamos en:
y el puerto donde están escuchando los CentOS y en Debian update-rc.d tomcat
respectivos Connectors definidos en Tom- defaults. cd /opt/jdk1.5.0_07/jre/lib/i386/
cat. También se pueden indicar aquí otros Otra mejora posible sería optimizar Tom- ln -s /usr/local/apr/lib/U
parámetros interesantes como el peso cat mediante la compilación nativa, ya que libtcnative-1.a libtcnative-1.a
lbfactor del worker dentro del balanceo de las últimas versiones de Tomcat 5 están inte- ln -s /usr/local/apr/lib/U
carga, el tamaño de la caché y el tiempo de gradas con la Apache Portable Runtime[ 7], libtcnative-1.so libtcnative-1.so
refresco. Ya por último, se define el worker que es un subproyecto de Apache para la ln -s /usr/local/apr/lib/U
“front”, que se encargará de balancear las creación de un paquete de librerías que sir- libtcnative-1.so.2 libtcn
peticiones entre los workers, separados por van de abstracción consistente a tive-1.so.2
coma, en balance_workers. Un parámetro implementaciones específicas por plata- ln -s /usr/local/apr/lib/U
bastante importante a tener en cuenta es el forma. Esto rompería a priori la portabilidad pkgconfig/ pkgconfig
de sticky_session o sesión persistente, que de Tomcat pero por contra se obtienen múl-
hace que las peticiones se redirijan siem- tiples beneficios como… Ahora sólo habría que reiniciar Tomcat et
pre al mismo nodo en el que se haya • … funcionalidades avanzadas de voilà. Por cierto, hay un pequeño pro-
creado la sesión inicialmente, y sólo pasa- Entrada/Salida blema en lo que respecta al
ría a usarse el segundo nodo cuando el • … funcionalidades a nivel de sistema direccionamiento IP en esta versión de
primero dejase de existir. operativo y de gestión de procesos nati- Tomcat, y es que el parámetro address del
En la documentación de los conectores de vos, que redundará en la obtención de Connector AJP tiene que estar en IPv6 en
Tomcat [6] se puede ver el significado de mejores parámetros de estado y con- lugar de IPv4. Este problema estará solu-
todas las directivas disponibles tanto en lo sumo de proceso y memoria cionado en la próxima versión 5.5.18.
que respecta al módulo, como a la • … la obtención de una superior escala- Mientras tanto, habría que traducir el for-
configuración de los workers. bilidad y rendimiento. mato de las IP 192.168.10.2 y .3 a IPv6 en
Una vez creados los ficheros descritos, Para instalar APR se podrían utilizar los los conectores que tengan especificado el
bastaría con reiniciar Apache y empezar a paquetes precompilados de cada distribu- parámetro address, aunque ya vimos que
jugar un poco con las sesiones. En la Figura ción, pero mejor vamos a compilar la última no era obligatorio especificarlo.
2 podemos ver el funcionamiento de cómo versión disponible en su web [7], la 1.2.7, en
acceder directamente a la IP del servidor la que realizaremos los pasos típicos de Conclusiones
web: http://192.168.10.1/, donde se nos compilación (huelga decir que nos hará falta En definitiva, usando Apache Tomcat es
mostraría la página por defecto de Tomcat, y tener instalado el compilador gcc y make posible desplegar una aplicación crítica
si usamos los servlets de ejemplo que se previamente): funcionando con tolerancia a fallos y
incluyen en Tomcat (http://192.168.10.1/ existen muchas arquitecturas distintas con
servlets-examples/), podemos ir viendo tar xvjf apr-1.2.7.tar.bz2 balanceo de carga y alta disponibilidad.
cómo crear sesiones y alojar parámetros en cd apr-1.2.7 Ahora sólo queda que la aplicación esté
cookies, iniciar varios navegadores y com- ./configure && make preparada para funcionar en un entorno en
probar cómo se balancea la carga asignando make install cluster, aunque eso ya daría para otro
cada petición a un nodo distinto. También artículo. I
podríamos simular la caída de un nodo for- Mediante estos pasos se nos instalarán en
zando la salida de uno de ellos y seguir /usr/local/apr los componentes necesarios RECURSOS
haciendo peticiones al servidor y comprobar que implementan el acceso nativo. Ahora
[1] Página de descarga de JDK de Sun:
cómo se redirigen las peticiones sólo al nodo tocaría instalar los wrappers JNI de Tomcat
http://java.sun.com/javase/
que está en funcionamiento. Mola ¿no? para que usen APR, además nos hará falta
downloads/index.jsp
tener instalado el paquete de desarrollo de
Mejorando la instalación OpenSSL (openssl-devel en CentOS, libssl-
[2] Página de descarga de Tomcat 5.5.x:
http://tomcat.apache.org/
Como mejoras principales a realizar a la dev en Debian): download-55.cgi
configuración anteriormente detallada,
[3] Documentación de Tomcat 5.5: http://
podrían realizarse algunas consideraciones cd $CATALINA_HOME/bin
tomcat.apache.org/tomcat-5.5-doc/
de seguridad, como ejecutar Tomcat con su tar xvzf tomcat-native.tar.gz
[4] Página de descarga de Tomcat Con-
propio usuario no privilegiado tomcat, y cd tomcat-native-1.1.3U
nectors: http://tomcat.apache.org/
luego asignar permisos reducidos a los direc- /jni/native download-connectors.cgi
torios propios de la instalación de Tomcat. ./configure —with-apr=/usrU
[5] Documentación de Tomcat Connec-
Por ejemplo, los directorios imprescindibles /local/apr/bin/apr-1-config U
tors: http://tomcat.apache.org/
serían conf, logs, work y webapps. Ya sólo —with-java-home=/optU connectors-doc/
faltaría crear el típico fichero script de inicio /jdk1.5.0_07
[6] Documentación de Apache HTTPD:
de Tomcat para que se ejecute en cada reini- make && make install http://httpd.apache.org/docs/2.0/
cio del servidor. Un ejemplo sencillo podría
[7] Apache Portable Runtime: http://apr.
ser el detallado en el Listado 4, ubicado en Que generará una serie de librerías JNI en apache.org/
/etc/init.d/tomcat, con permisos de ejecu- /usr/local/apr/lib/ que tendremos que
66 Número 19 WWW.LINUX-MAGAZINE.ES