viernes, 1 de abril de 2011

Cluster de Alta disponibilidad con LVS (Linux Virtual Server)

Alta disponibilidad de servicios con LVS (Linux Virtual Server)

Hola amiguitos virtuales(?).Hoy les voy a mostrar como hice para configurar un cluster de alta disponibilidad de Apache. Tambien se puede hacer de otros servicios (FTP, Telnet, etc).

La estructura de funcionamiento es la siguiente; hay uno o mas balanceadores o directores que comparten una ip virtual que es la que presta servicio, es decir que los clientes se conectan a una ip, supongamos 192.168.10.27. Esta seria la ip virtual, los equipos directores tienen 2 direcciones ip, la real (que no se comparte, supongamos 192.168.10.23) y la virtual que se comparte con los demas directores del servicio.
Se completa la configuracion con dos servidores Apache (en este caso son dos, pueden ser mas).
Hay distintos tipos de ruteo en lvs, en este caso use Direct Routing porque tengo todo en la misma red, de otro modo habria que usar NAT.

En mi caso son dos directores y dos apache. Los cuatro equipos tienen CentOS, asi que esta guia es valida para CentOS / Red Hat / Fedora, aunque conceptualmente es lo mismo en cualquier linux, salvo la herramienta para configurar el cluster lvs que es propietaria de Red Hat, tal vez en otras distros haya algo similar

En los directores lvs:

Instalar piranha (consola de configuracion de HA) e ipvsadm (paquete de servicios lvs)
yum install -y ipvsadm piranha


Habilitar los servicios al inicio.

chkconfig pulse on
chkconfig piranha-gui on
chkconfig httpd on

Establecer una clave para el servicio piranha

piranha-passwd

Habilitar forwarding de paquetes en el kernel y modificar parametros ARP

en /etc/sysctl.conf agregar o editar las siguientes lineas

net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2


Se reinicia el equipo para que queden aplicados los cambios y luego para acceder a piranha http://ip.del.director:3636


Luego en "Global Settings" se configura la ip del director primario, en mi caso 192.168.10.23 y el tipo de red (Direct Routing). En el campo "Private server IP" no poner nada, ya que en este caso no hay dos adaptadores de red en el director.



En Redundancy ingresar la ip del director lvs secundario, en mi caso 192.168.10.24, lo demas dejarlo como esta.



Ahora, en virtual server se configura la ip que prestara servicio, es decir la ip visible de servicio. En mi caso seria para acceder al servicio, por ejemplo http://192.168.10.27.
Dejar todo como esta y en el tipo de scheduling seleccionar "Weightead-least Connections". Esta opcion es para que distribuya la carga en funcion al peso que tenga cada equipo y es proporcional. Suponiendo que Servidor A tiene peso 1 y Servidor B tiene peso 2, por cada DOS conexiones que tenga B, el servidor A va a tener una.

Una vez finalizado esto en la opcion de REAL SERVERS, se ingresan las ips y el peso de los equipos que van a prestar servicio, en el ejemplo es 192.168.10.205 con peso 1 (y 192.168.10.102 con peso 1 que ya lo configure desde antes).


Ya esta casi finalizada la configuracion, solo hay que definir el monitoreo de los servicios (en MONITORING SCRIPTS). Yo no utilice la opcion por defecto de piranha sino que use un script que me robe por ahi (!)
en /etc/sysconfig/ha crear un archivo llamado check_apache

#!/bin/bash
if links -dump -eval 'set connection.receive_timeout = 1' -eval 'set connection.retries = 1' -eval 'set connection.unrestartable_receive_timeout = 1' http://$1/ > /dev/null 2>&1; then

echo "OK"

else

echo "FAILURE"

fi

exit 0

Se guarda el archivo y se pasa a configurar en piranha el script de monitoreo. (No olvidar de darle permisos 755 al archivo).



Aceptar para aplicar los cambios, y NO OLVIDAR DE ACTIVAR LOS SERVIDORES!!!. Si no se activan no inicia el servicio despues....

Para configurar el director secundario (192.168.10.24 en mi caso) copiar el archivo /etc/sysconfig/ha/lvs.cf del primario hacia el secundario y el script check_apache dentro del mismo directorio.
Una vez terminado esto, hacer un service pulse restart en los dos directores.
En /var/log/messages se muestra el estado del servicio, por ejemplo

Apr 1 13:00:18 xxxx pulse[7834]: STARTING PULSE AS MASTER
Apr 1 13:00:21 xxxx pulse[7834]: backup inactive: activating lvs
Apr 1 13:00:21 xxxx lvs[7839]: starting virtual service web1 active: 80
Apr 1 13:00:21 xxxx nanny[7848]: starting LVS client monitor for 192.168.10.27:80 -> 192.168.10.205:80
Apr 1 13:00:21 xxxx lvs[7839]: create_monitor for web1/application1 running as pid 7848
Apr 1 13:00:21 xxxx nanny[7852]: starting LVS client monitor for 192.168.10.27:80 -> 192.168.10.120:80
Apr 1 13:00:21 xxxx lvs[7839]: create_monitor for web1/application2 running as pid 7852
Apr 1 13:00:21 xxxx nanny[7848]: [ active ] making 192.168.10.205:80 available
Apr 1 13:00:21 xxxx nanny[7852]: [ active ] making 192.168.10.120:80 available
Apr 1 13:00:26 xxxx pulse[7843]: gratuitous lvs arps finished

Listo con los directores. Si se prueba el servicio NO VA A FUNCIONAR, esto es por un problema de ARP en lvs, para mas info detallada http://www.linuxvirtualserver.org/docs/arp.html

Se proponen varias soluciones, yo utilice arptables. Para esto EN LOS SERVIDORES REALES, se debe instalar el paquete arptables

yum install -y arptables_jf
una vez instalado el paquete, se inicia el servicio y se corren los comandos arp correspondientes

service arptables_jf start
arptables -A IN -d 192.168.10.27 -j DROP # se dropean los pedidos arp a la ip virtual del lvs. En otros casos cambiar 192.168.10.27 por la correspondiente

arptables -A OUT -d 192.168.10.27 -j mangle --mangle-ip-s 192.168.10.205 # se sacan los paquetes de la ip flotante por la ip REAL del servidor, en otros casos cambiar 192.168.10.205 por la ip del servidor.
Guardar las tablas:

service arptables_jf save
Activar servicio arptables al inicio

chkconfig arptables_jf on

Ahora se debe crear un adaptador virtual con la ip virtual de lvs

ifconfig eth0:1 192.168.10.27 netmask 255.255.255.0 broadcast 192.168.10.255 up
NOTA: Agregar esta linea a /etc/rc.local ya que al reiniciarse el equipo se pierden esos cambios

agregar a /etc/sysctl.conf

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
Reiniciar el equipo y listo!

Al acceder a http://192.168.10.27 tendremos un cluster apache con failover y balanceo de carga (en mi caso con relacion 1 a 1).




2 comentarios:

  1. Muchas Gracias ingeniero! muy buen trabajo y mejor documentado aún. Congrats!

    ResponderEliminar
  2. Buen aporte, lo tendré en cuenta entre las varias opciones que tengo contempladas. Saludos.

    ResponderEliminar