Apache + Tomcat: Balanceo de carga y alta disponibilidad

5
60087

Apache + Tomcat: Balanceo de carga y alta disponibilidad

Introducción.

En la actualidad, la gran mayoría de las organizaciones exponen su lógica de negocio a través de servicios web o aplicaciones web. Por lo que es de vital importancia para el correcto funcionamiento del negocio que la gente pueda trabajar sin errores «informáticos» o «tecnológicos».

La realidad es que los sistemas fallan y hay que evitar en la medida de lo posible que estos fallos supongan una negación de acceso a los servicios.

En este tutorial no trata sobre como crear un cluster de servidores Tomcat (no hay replicación de sesión entre la aplicaciones desplegadas en los distintos servidores que prestan servicio), sino
de como configurar un conjunto de servidores para que las peticiones de los usuarios a los servicios se distribuyan (a través de alguna política) entre los servidores para conseguir:

  1. Alta disponibilidad: En caso de que un servidor se caiga otro servidor activo preste servicio.
  2. Balanceo de carga: Cada servidor atenderá un porcentaje de las peticiones de manera que el sistema en conjunto soporte más usuarios.

Si lo que busca es como ofrecer alta disponibilidad sobre JBoss quizás le interesen los siguientes tutoriales:

Esquema de arquitectura

A continuación veremos que elementos intervienen en la arquitectura para conseguir la alta disponibilidad y el balanceo de carga.

En la imagen anterior podemos observar lo siguiente:

  1. Las aplicaciones de los usuarios apuntan a la dirección de un balanceador (el resto es transparente para ellos).
  2. El balanceador (tráfico HTTP) está construido a través del servidor web apache y el módulo mod_jk habilitado.
  3. El balanceador distribuirá en base a alguna política especificada en la configuración el tráfico entre los usuarios (clientes) y los servidores Tomcat.

Pasos a realizar

A continuación exponemos los pasos para instalar esta arquitectura bajo un entorno Windows.

  1. Desde la siguiente dirección http://apache.rediris.es/httpd/binaries/win32, descargamos la última versión estable (actualmente la 2.4) del instalador del servidor web Apache.
  2. Instalamos Apache usando la configuración por defecto que viene bajo la opción «Custom».

    Recomendamos elegir un directorio de instalación sin espacios en su nombre, por ejemplo: «c:/servers/apache»
  3. Descargamos la última versión estable de Apache Tomcat (actualmente la última versión es la 6.0.20).
    Por facilidad de configuración, recomiendo la versión que viene con un instalador.
  4. Instalación de Java Runtime Environment en las máquinas en donde se instalarán los Tomcat. Asegurate de configurar la variable de entorno JAVA_HOME.
  5. Instalamos el Apache Tomcat. Para ello, simplemente debemos descomprimir el archivo descargado.

    Recomendamos elegir un directorio sin espacios, por ejemplo: «c:/servers/tomcat».
  6. Descargar el módulo (son archivos con extensión .so) que nos permitirá realizar el balanceo de carga entre distintos tomcat, para ello nos descargamos el módulo desde la sección Binary Releases del siguiente enlace: http://tomcat.apache.org/download-connectors.cgi.
  7. Instalamos el módulo en Apache.

    Para ello, deberemos detenerlo y copiar el archivo descargado (actualmente mod_jk-1.2.28-httpd-2.2.3.so) al directorio modules de Apache y lo renombramos como mod_jk.so.
  8. Modificamos la configuración de Apache para cargar el módulo cuando sea nuevamente iniciado.

    Para ello deberemos agregar la siguiente linea a continuación de los otros LoadModule que aparecen en el archivo de configuración de Apache APACHE_HOME/conf/httpd.conf:

    LoadModule jk_module modules/mod_jk.so

  9. Creamos en el directorio APACHE_HOME/conf un archivo de nombre workers.properties en donde especificaremos las direcciones y puertos en donde escuchan todos los servidores (Tomcat).

    # Propiedades del entorno necesarias de configurar
    workers.tomcat_home=C:/servers/apache-tomcat-6.0.20
    workers.java_home=C:/Archivos de programa/Java/jdk1.6.0_13

    # Los servidores a balancear estarán definidos más abajo en «balancer»
    worker.list=balancer

    # Configuración del Tomcat 1
    worker.worker1.port=8009
    worker.worker1.host=<direccion_tomcat_1>
    worker.worker1.type=ajp13
    worker.worker1.lbfactor=1

    # Configuración del Tomcat 2
    worker.worker2.port=8009
    worker.worker2.host=<direccion_tomcat_2>
    worker.worker2.type=ajp13
    worker.worker2.lbfactor=1

    # Configuración del balanceador
    worker.balancer.type=lb
    worker.balancer.balance_workers=worker1,worker2
    worker.balancer.method=B

    # El siguiente parámetro indica al balanceador que todas las peticiones de una misma
    # sesión (usuario) vayan al mismo servidor
    worker.balancer.sticky_session=true

    En algunas ocasiones quizás sólo se desee alta disponibilidad sin balanceo de carga, pues bien con la siguiente configuración
    todas las peticiones irán a un tomcat y que sólo se utilizará el otro Tomcat en caso de fallo.

    # En caso de que falle worker1 que se use worker2
    worker.worker1.redirect=worker2

    # Por defecto, worker2 estará deshabilitado y el balanceador sólo lo usará en caso de fallo.
    worker.worker2.activation=disabled

  10. Agregamos las siguientes lineas al final del archivo APACHE_HOME/conf/httpd.conf

    # Le indicamos donde está ubicado el archivo de configuración workers.properties
    JkWorkersFile <APACHE_HOME>/conf/workers.properties

    # Le indicamos que redirija todas las peticiones de todos los contextos de aplicación al balanceador.
    JkMount /* balancer

  11. En la configuración de cada Tomcat (<TOMCAT_HOME>/conf/servers.xml), modificamos el parámetro jvmRoute del elemento Engine.

    <!– Un Tomcat tendrá el valor worker1 y el otro worker2 –>
    <Engine name=»Catalina» defaultHost=»localhost» jvmRoute=»worker1″>

Pruebas

Para probar que todo está correcto reinicie todos los servidores y dentro de cada Tomcat cree un archivo con distinto contenido en la misma ubicación (por ejemplo http://direccion_balanceador/a.html).

Desde un navegador navegamos consecutivamente a la página y tenemos que ver que muestran ambos contenidos de forma alternativa.

Detenga un Tomcat y el otro debería de prestar servicio. Inicie de nuevo el tomcat detenido y automáticamente debería de prestar servicio.

Referencias

Conclusiones

En este tutorial hemos visto de forma sencilla los pasos para conseguir una infraestructura (sencilla) con mejoras en cuanto a rendimiento y disponibilidad.

Si le preocupa la disponibilidad, seguridad, rendimiento, calidad del código fuente de su negocio, etc. puede contactarnos y seguro que le seremos de gran ayuda.

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

5 Comentarios

  1. excelente manual !

    una duda que me surgio es, ¿que pasaría en el caso que haya un script de upload de archivos en dicha web, el archivo se enviaría a un solo tomcat o a ambos?

  2. Excelente post!
    Me surgen unas dudas, el war de la aplicación deberías subirlo a los dos o más tomcats verdad?
    Y al momento de entrar al link de la aplicación pondría todo igual a como se hace habitualmente cuando contas con un unico tomcat pero sustituyendo por la ip del apache?
    Al momento de subir una aplicación en el apache no hay que hacer nada?
    Aun una vez implementado esta solución podrías acceder directamente al tomcat si vas contra su url?
    Muchas gracias!
    Un saludo!

Dejar respuesta

Please enter your comment!
Please enter your name here