Apache Tomcat: Balanceo de carga y alta disponibilidad

¿Que es un balanceandor? (Wikipedia)

Un balanceador de carga fundamentalmente es un dispositivo de hardware o software que se pone al frente de un conjunto de servidores que atienden una aplicación y, tal como su nombre lo indica, asigna o balancea las solicitudes que llegan de los clientes a los servidores usando algún algoritmo (desde un simple Round Robin hasta algoritmos más sofisticados).1

Funcionamiento:

Mediante estos servlets o programas podemos realizar configuraciones de alta disponibilidad y balanceo de carga. Tomcat se suele instalar en equipos externos al servidor web apache (balanceador de carga), y se pueden configurar para recibir peticiones las dos al mismo tiempo o como servidor secundario por si falla el primer tomcat.

Esquema de arquitectura

balanceador

 

Instalación balanceador:

apt-get install apache2 openjdk-7-jre libapache2-mod-jk

Configuramos el fichero workers.properties

vi /etc/libapache2-mod-jk/workers.properties

Añadimos la siguiente configuración:

# Propiedades del entorno necesarias de configurar
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/lib/jvm/java-7-openjdk-amd64

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

#Configuramos tomcat 1

worker.worker1.port=8009
worker.worker1.host=192.168.1.80
worker.worker1.type=ajp13
worker.worker1.lbfactor=1

#Configuramos tomcat2

worker.worker2.port=8009
worker.worker2.host=192.168.1.81
worker.worker2.type=ajp13
worker.worker2.lbfactor=1

#Configuracion 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

A continuación configuramos JkMount para que todas las peticiones se dirijan a los distintos servidores tomcat, para ello debemos configurar el fichero  /etc/apache2/sites-enabled/000-default entre las etiquetas VirtualHost *:80 y VirtualHost

 

VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory «/usr/lib/cgi-bin»>
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
JkMount /node/* balancer

JkMount /* balancer
ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

 

Habilitamos la configuración de los modulos jk y procedemos a iniciar el apache

cp /etc/apache2/mods-available/jk.* /etc/apache2/mods-enabled/
/etc/init.d/apache2 restart

 

Una vez ya hayamos configurado el balanceador pasamos a instalar nuestros dos servidores apache tomcat. Dejo un tutorial detallado de su instalación:

 

Instalar tomcat:

 

 

Por ultimo en el archivo server.xml de cada servidor tomcat (<TOMCAT_HOME>/conf/servers.xml), modificamos el parámetro jvmRoute del elemento Engine.

 

 clustomcat01

 

<Engine name=»Catalina» defaultHost=»localhost» jvmRoute=»worker1″>

 

clustomcat02

 

<Engine name=»Catalina» defaultHost=»localhost» jvmRoute=»worker2″>

 

Pruebas:

 

Añadimos dos paginas diferentes en cada nodo de los servidores tomcat
Iniciamos los tomcat y mediante nuestro navegador accedemos a la IP del balanceador y comprobamos por cual nodo resuelve. (En mi caso resuelve por el nodo01) como podemos ver en la siguiente imagen:

 

Captura de pantalla de 2015-04-12 10:19:09

 

Paramos en nodo01, volvemos a refrescar la URL y debería resolver por el nodo02

 

Captura de pantalla de 2015-04-12 10:21:54

 

Un saludo, rokitoh
:wq!

6 comentarios en “Apache Tomcat: Balanceo de carga y alta disponibilidad”

  1. cuando se configura el workers.properties y se configura el workers.tomcat_home=/usr/local/tomcat esto quiere decir que tambien debe tener el tomcat instalado???
    En esta parte me pedí

    Saludos.

    1. Buenas,

      Solo se instala el servicio tomcat en los servidores clustomcat01 y clustomcat02
      En el servidor que se utiliza como balanceador se instalan apache y mod-jk (apt-get install apache2 openjdk-7-jre libapache2-mod-jk)

      un saludo.

  2. disculpe, soy totalmente nuevo en esto y tengo muchas dudas, una de ella es la siguiente:

    Ya tengo configurado el balanceador de carga y tomcat, y cree una carpeta den webaps/tomcat-demo/helloword/index.jsp

    coloco en el navegador: http://localhost:8080/tomcat-demo/helloword/index.jsp

    y funciona muy bien. me muestra el mensaje indicado. mi duda es la siguiente. donde coloco mi proyecto.war para que se ejecute normalmente, en esa misma carpeta?? o lo subo a traves del manager de tomcat, y el apache atraves de la url que se especifico en el virtualhost lo reconocera automaticamente, que en el ejemplo pusiste.

    JkMount /node/* balancer

    JkMount /* balancer

    1. Buenos días,

      Para realizar un despliegue en tomcat y sí actualizar la web sería de la siguiente forma:

      – Realiza un backup del .war a modificar
      – Para el tomcat
      – Mueve el nuevo .war a la carpeta de webapp path-tomcat/webapp/
      – Borra la carpeta creada en webapp/ con el mismo nombre
      – Borra los temporales creados en:
      path-tomcat/work/catalina/localhost/
      – Inicia el tomcat

      Ejemplo:

      mv /usr/local/apache-tomcat-7.0.35/webapp/proyecto.war /backup
      /etc/init.d/tomcat stop
      cp proyecto.war /usr/local/apache-tomcat-7.0.35/webapp/
      rm /usr/local/apache-tomcat-7.0.35/webapp/proyecto
      rm /usr/local/apache-tomcat-7.0.35/work/Catalina/localhost/proyecto
      /etc/init.d/tomcat start

      Su proyecto iniciara en este ejemplo como: http://localhost:8080/proyecto

      Tengo pendiente realizar un manual respecto a esto. Me lo apunto.

      Un saludo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *