El balanceo de carga es el proceso que permite dividir la cantidad de trabajo que debe realizar un ordenador, entre dos o más ordenadores, de manera que se obtiene más resultados de trabajo en la misma cantidad de tiempo.

 

Modelo servidor aplicaciones varios

De esta manera podemos tener un servidor web como el Apache HTTP Server que se encargará recibir las peticiones y enviar los resultados al cliente, y podemos tener varios servidores de aplicaciones (por ejemplo con GlassFish), en la misma o distintas máquinas, que acceden a una misma base de datos.

Así se puede obtiener el beneficio de repartir el trabajo de proceso realizado por el servidor de aplicaciones entre varios servidores, aumentando la productividad. Además si uno de los servidores de aplicaciones deja de funcionar, puede seguir funcionando el otro sin dejar de dar el servicio.

Para realizar una prueba de este tipo de estructura, vamos a necesitar dos servidores con Ubuntu Server y GlassFish instalado en cada uno de ellos. En una de estas máquinas se dispondrá también del servidor web de Apache para atender las peticiones, redireccionar la carga de trabajo y enviar las respuestas.

Instalar el redireccionador mod_jk

En el servidor web Apache es necesario instalar el módulo mod_jk que hará las funciones de redireccionador. Para ello, ejecuta:

{code class="brush:plain;gutter:false"}

sudo apt-get install libapache2-mod-jk

{/code}

Al finalizar la instalación comprueba que en la carpeta de módulos activados se encuentran los archivos correspondientes es este módulo.

balanceo01

Configurar el redireccionador

Este módulo redireccionador dispone de unos archivos de configuración que se encuentran en la carpeta /etc/libapache2-mod-jk

balanceo02

Edita el archivo llamado workers.properties, y realiza los siguientes cambios:

En la línea workers.tomcat_home=/usr/share/tomcat6, indica la ruta en la que se encuentre instalado GlassFish. Por ejemplo:

{code class="brush:plain;gutter:false"}

workers.tomcat_home=/home/administrador/glassfish3

{/code}

Busca la línea worker.list=ajp13_worker, y cambia la parte derecha por el nombre que se le asigne al balanceador. El nombre que le asigna por defecto es loadbalancer, como puedes encontrar mas abajo en ese mismo fichero.

{code class="brush:plain;gutter:false"}

worker.list=loadbalancer

{/code}

La configuración viene preparada para trabajar con un solo servidor de aplicaciones, al que denomina ajp13_worker. Necesitamos indicar que vamos a trabajar con un segundo servidor de aplicaciones, por lo que buscamos la configuración del primer worker y le añadimos la del segundo, que vamos a denominar worker2. En este caso, el segundo servidor se encuentra en la IP 192.168.55.3, y el primero en la misma máquina que el servidor web (localhost):

{code class="brush:plain;gutter:false"}

worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
worker.worker2.port=8009
worker.worker2.host=192.168.55.3
worker.worker2.type=ajp13

{/code}

Ahora debes indicar el modo en el que deseas repartir la carga entre los servidores de aplicaciones. Esto se indica en la línea worker.ajp13_worker.lbfactor=1, donde se debe asignar un valor numérico a cada servidor. Si se asigna el mismo valor a ambos, la carga estará repartida por igual, pero al que se le asigne un valor más bajo, tendrá menos carga. En este ejemplo se va a repartir por igual:

{code class="brush:plain;gutter:false"}

worker.ajp13_worker.lbfactor=1
worker.worker2.lbfactor=1

{/code}

Por último, debe indicar al balanceador (loadbalancer) qué máquinas va a utilizar para utilizar para realizar el trabajo. En este caso añadimos el worker2.

{code class="brush:plain;gutter:false"}

worker.loadbalancer.balance_workers=ajp13_worker,worker2

{/code}

Configurar el VirtualHost para usar el balanceador con la aplicación web

En la configuración del VirtualHost que vaya a almacenar la aplicación web que se desea balancear, se debe establecer que se quiere hacer ese reparto de carga. Por ejemplo, si la aplicación se encuentra dentro del 000-default, edita el archivo de su configuración /etc/apache2/sites-enabled/000-default y añade, antes del cierre de la etiqueta </VirtualHost>, las siguientes líneas, donde debes cambiar nombreAplicacion por el nombre correspondiente a la aplicación web.

{code class="brush:plain;gutter:false"}

    JkMount /nombreAplicacion/ loadbalancer
JkMount /nombreAplicacion/* loadbalancer
</VirtualHost>

{/code}

Recuerda reiniciar el servidor web Apache para que todos los cambios que hayas realizado tengan efecto.

Configurar el servidor de aplicaciones GlassFish para que atienda las peticiones del balanceador

Accede a la carpeta bin en la que se encuentre instalado GlassFish y ejecuta las siguientes instrucciones para que atienda las peticiones que le envía el repartidor de carga por el puerto 8009, que es el que se ha indicado en la configuración anterior:

{code class="brush:plain;gutter:false"}

./asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server gf_listener 
./asadmin set server-config.network-config.network-listeners.network-listener.gf_listener.jk-enabled=true

{/code}

Recuerda reiniciar GlassFish para asegurar que los cambios tengan efecto. 

Comprobación del funcionamiento

Para comprobar que funciona correctamente el funcionamiento crea una aplicación web dinámica de Java EE desde Eclipse, con un archivo index.jsp dentro de la carpeta WebContent. En el contenido de la página muestra un mensaje similar al siguiente: "Prueba de balanceo en servidor 1". Exporta la aplicación al formato WAR y despliega la aplicación en el primer servidor. Ahora cambia el texto a "Prueba de balanceo en servidor 2", exporta de nuevo la aplicación con el mismo nombre que hayas usado antes, y despliégala en el segundo servidor.

Accede desde un navegador web a la dirección http://ip.del.servidor.apache/nombreAplicacion/ y observa que la primera vez mostrará el primer mensaje, y si recargas la página aparecerá el segundo mensaje, y así repetidamente.