Mostrando entradas con la etiqueta Alta disponibilidad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Alta disponibilidad. Mostrar todas las entradas

jueves, 26 de marzo de 2009

Squid alta disponibilidad, LVS + Heartbeat

En un post anterior hable de como tener un servicio de Proxy en alta disponibilidad en un cluster de tres elementos con Heartbeat, esta configuración nos permite tener estrictamente un servicio en alta disponibilidad, pero tiene un par de pegas importantes; es un esquema activo-pasivo-pasivo, por lo que dos máquinas están en el banquillo a la espera de que el Heartbeat les llame a jugar, y por lo que tampoco estamos usando la capacidad de respuesta de las tres tarjetas de red des esos servidores, tenemos tolerancia a fallos pero no optimizamos el uso de recursos. Esto es lo que voy a mejorar con esta configuración de cluster activo-activo-activo mediante LVS y Heartbeat.

Este cluster lo instalaremos en el segmento DMZi detrás de la seguridad perimetral, la única regla que daremos de alta será la conexión al puerto 3128 en la ip virtual de nuestro cluster 172.95.69.100

El sistema operativo que usaremos será Debian 5.0 partiendo de la instalación por red, instalamos el sistema base sin seleccionar nada en tasksel, una vez finalizada sera necesario que se vean los servidores entre si, por lo que haremos las oportunas entradas en el fichero /etc/network/interfaces con una particularidad, la de añadir una dirección de loopback virtual;


M30:~# cat /etc/network/interfaces

auto lo

iface lo inet loopback


auto lo:0

iface lo:0 inet static

address 172.95.69.100

netmask 255.255.255.255

network 172.95.69.0

broadcast 172.95.69.255


# The primary network interface

auto eth0

iface eth0 inet static

address 172.95.69.30

netmask 255.255.255.0

network 172.95.69.0

broadcast 172.95.69.255

gateway 172.95.69.1

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 80.58.0.33


M30:~# cat /etc/hosts

127.0.0.1 localhost

127.0.1.1 M30

172.95.69.40 M40

172.95.69.50 M50

M40:~# cat /etc/network/interfaces

auto lo

iface lo inet loopback


auto lo:0

iface lo:0 inet static

address 172.95.69.100

netmask 255.255.255.255

network 172.95.69.0

broadcast 172.95.69.255


# The primary network interface

auto eth0

iface eth0 inet static

address 172.95.69.40

netmask 255.255.255.0

network 172.95.69.0

broadcast 172.95.69.255

gateway 172.95.69.1

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 80.58.0.33


M40:~# cat /etc/hosts

127.0.0.1 localhost

127.0.1.1 M40

172.95.69.30 M30

172.95.69.50 M50



M50:~# cat /etc/network/interfaces

auto lo

iface lo inet loopback

auto lo:0

iface lo:0 inet static

address 172.95.69.100

netmask 255.255.255.255

network 172.95.69.0

broadcast 172.95.69.255


# The primary network interface

auto eth0

iface eth0 inet static

address 172.95.69.50

netmask 255.255.255.0

network 172.95.69.0

broadcast 172.95.69.255

gateway 172.95.69.1

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 80.58.0.33


M50:~# cat /etc/hosts

127.0.0.1 localhost

127.0.1.1 M50

172.95.69.30 M30

172.95.69.40 M40


Instalamos los paquetes de heartbeat, ipvsadm y sus dependencias en las tres máquinas;

#aptitude install heartbeat ipvsadm ldirectord


Con ipvsadm, si no nos lo pide el debconf durante la instalación tendremos que reconfigurarlo usando el siguiente comando, configurando que arranque las reglas en el arranque y seleccionando both en la siguiente pregunta para que el equipo pueda actuar tanto como master y como backup.

# dpkg-reconfigure ipvsadm


Instalamos squid y realizamos las configuraciones necesarias para que el

servicio este disponible a los clientes;

#aptitude install squid


Lo que vamos a configurar es un cluster de tres miembros, en los que cada uno ofrezca servicio de proxy (squid), y a demás vamos a crear dos servicios en alta disponibilidad;

  • Ipvsadm va controlar un IP virtual 172.95.69.100.

  • ldirectord va a controlar la existencia de un servicio de proxy en los servidores reales consultando la disponibilidad del puerto 3128, y a redirigir desde esta IP virtual el tráfico en el puerto 3128 a los servidores reales mediante una distribución de carga uniforme con el algoritmo Round Robin.

Configuramos el kernel de los servidores para que soporte la retrasmision de paquetes, editando el fichero

M30:~# vim /etc/sysctl.conf


Y descomentamos la linea siguiente;

# Uncomment the next line to enable packet forwarding for IPv4

net.ipv4.ip_forward = 1


Aplicamos los cambios en las tres máquinas con el comando;

M30:~# sysctl -p

net.ipv4.ip_forward = 1

¿Que es todo esto? Pues es tener un cluster en el que los tres miembros están activos, por que comparten una IP virtual y un servicio de director que reparte la carga de peticiones de clientes al puerto 3128 homogéneamente entre todos los miembros, en cristiano es tener tres proxys que se ven como uno solo, y que a demás ofrecen el servicio en alta disponibilidad por que si uno de ellos cae el servicio sigue funcionando.

Empezamos por la configuración del ldirectord, editamos el fichero en las tres máquinas para definir el funcionamiento;

M30:~# vim /etc/ha.d/ldirectord.cf


# /etc/ha.d/ldirectord.cf

checktimeout=3

checkinterval=5

autoreload=yes

logfile="/var/log/ldirectord.log"

emailalert = "email@gmail.com"

virtual=172.95.69.100:3128

fallback=127.0.0.1:3128

real=172.95.69.30:3128 gate 1

real=172.95.69.40:3128 gate 1

real=172.95.69.50:3128 gate 1

protocol = tcp

checktype = connect

scheduler = rr

persistent = 20


En este fichero se definen los parámetros de funcionamiento del demonio que va a dirigir el servicio de proxy entre los servidores reales, se puede configurar también un mail para el envío de alertas, se define la IP y el puerto de nuestro servicio virtual y las IP y puertos de los servidores reales. Los siguientes parámetros definen el tipo de chequeo que va a realizar el demonio para comprobar que los servidores reales están vivos, que es en este caso una prueba de conexión TCP, el scheduler es el tipo de reparto de carga que se va a usar, en este caso Round Robin.

Inicializamos los demonios en las tres máquinas;

M30:~# /etc/init.d/ldirectord start


Podemos comprobar que esta funcionando con el siguiente comando, en el que podemos ver los miembros que comprarten la IP virtual y el weight es igual 1,lo que quiere decir que ldorector ha comprobado que esas máquinas tienen conectividad en el puerto 3128.

M30:~# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 172.95.69.100:3128 rr persistent 20

-> 172.95.69.50:3128 Route 1 0 1

-> 172.95.69.40:3128 Route 1 0 0

-> 172.95.69.30:3128 Local 1 0 0


Para configurar los servicios en alta disponibilidad con heartbeat, lo más sencillo es instalar la utilidad gráfica;


asier@asier-desktop:~$ aptitude install hb_gui


Lo primero que tenemos que hacer para conectarnos es ponerle una password al usuario hacluster;

M30:~# passwd hacluster


Y conectarnos a través de la aplicación, donde deberíamos ver ya los tres miembros de nuestro cluster vivos y en verde, hay que crear un grupo para nuestros servicios, lo he llamado load_balancer y hay que crearlo con los atributos target_role started, ordered true y collocated true.

Una vez creado el grupo hay que crear los dos servicios la ip virtual y el director, añadimos un recurso nativo “ipaddr2” dentro de nuestro grupo load_balancer con las siguientes parámetros; ip 172.95.69.100, lvs_support true.

Creamos otro recurso nativo dentro también del grupo load_balancer ldirector con los siguientes parámetros; config_file /etc/ha.d/ldirectord.cf

Si reiniciamos los servicios en las tres máquinas el resultado debería de ser el siguiente; tres nodos activos (running), uno de ellos como dc (domain controller), en uno de los nodos heartbeat arrancara los servicios de ldirector y ipaddr2, con esto estarían terminadas las configuraciones, ahora vamos a ver que pasa...


  • Desde un cliente se debería de poder hacer ping a nuestra ip virtual.

  • Si hacemos un nmap a la IP virtual deberíamos de ver el puerto 3128 abierto.

  • Si hacemos ssh a la ip virtual para conectarnos deberíamos conectarnos a cualquiera de las tres máquinas.

  • Si configuramos el proxy en un cliente, por supuesto, deberíamos navegar por que sino menudo manual de mierda, pero lo interesante es que nos debería de servir internet el squid de uno de los equipos del cluster, podemos comprobar cual haciendo; M30:~# tail -f /var/log/squid/access.log y viendo en cual de las tres máquinas nuestra actividad.


Pero lo más interesante viene ahora, si conectamos un segundo cliente podremos observar como el servicio de ldirectord le asigna esta conexión a otra de las máquinas, y si conectamos otro cliente, asignará la conexión a otra y así sucesivamente, por lo que comprobamos que ldirectod mediante el algoritmo de Round Robin reparte uniformemente la carga entre todos los miembros.


!Y aún hay algo aún mejor! ¿Que pasa si tiramos del cable de una de las máquinas?


  • Si tiramos de una de las que no es ni dc ni tiene los servicios corriendo, el ldirector detectará en 20 segundos que el servicio de proxy en ese miembro no esta disponible y dejara de repartirle trabajo.

  • Si tiramos la maquina que es dc, pasará lo de arriba y a demás heartbeat acordará a alguno de los otros miembros como nuevo dc.

  • Y lo mejor, que pasa si tiramos la máquina que tiene corriendo los servicios? Que el servicio de proxy se caerá hasta que heartbeat detecte que el cluster se ha degradado y una de los dos nodos restantes se anime a volver a ejecutar los servicios y restablecer asi todo.


Genial, no es verdad?

domingo, 6 de abril de 2008

Squid + heartbeat = Alta disponibilidad en Linux

Primero
... dijeron que Linux era un producto de las universidades y que no saldría de ellas, luego dijeron que no tenia cabida en los escritorios, que era cosa de gurus y freaks; el resultado es que cada vez mas servidores son Linux, incluso algunas empresas como Oracle están creando su propia distro en la que incluir su software, y que incluso con la ayuda inesperada del fracaso de Vista cada vez mas gente prueba y se queda en Ubuntu, y es que Linux esta experimentando un crecimiento increíble y cada vez incluye servicios mas y mas avanzados como la alta disponibilidad.

Crear un servicio de proxy en Linux es relativamente facil, poco mas que hacer un;
#apt-get install squid

y retocar el fichero de configuración;
#vim /etc/squid/squid.conf

Ya tenemos un proxy-cache funcionando para nuestra red, pero que pasa si esta maquina se cae? se rompe el disco duro o simplemente alguien tropieza con el cable de red? pues que dejamos a 'x' personas sin internet y esto en las empresas de hoy en día con webmail, miles de aplicaciones web, etc...puede llegar a ser un problema, si este es tu caso voy a intentar explicar como montar un claster simetrico de alta disponivilidad de un servicio proxy basado en mi experiencia...

En primer lugar explicar que la alta disponibilidad se basa en multiplicar los resursos, o sea que donde antes teníamos un servidor ahora vamos a necesitar mas. Podríamos crear un cluster con dos miembros, pero ante la caída de uno de ellos se produce una situación denominada "split-brain", por lo que para crear una cluster siempre es recomendable utilizar al menos tres miembros.

En Debian o Ubuntu server instalamos Heartbeat y las herramientas de administracion se instalaran como dependencias;

#apt-get install heartbeat heartbeat-gui

Una vez instalado esto en las tres mauinas ya tenemos los servidores listos para crear nuestro clusterHA, ahora hay que comprobar un par de cosas;
- en primer lugar tenemos que comprobar que las tres maquinas se ven entre si, yo recomiendo incluir el en fichero /etc/hosts los nombres y las ip's de cada maquina
- una vez comprobada la conectividad por nombre hay que tener en cuenta que medio vamos a usar para enviar la senal de heartbeat multicast, broadcast... que determinara el tipo de topologia de red que tenemos que usar, en este caso vamos a usar broadcast por lo que los tres servidores deben de estar en la misma red y compartir el dominio de broadcast, por ejemplo;

M30 192.168.0.3 255.255.255.0
M40 192.168.0.4 255.255.255.0
M50 192.168.0.5 255.255.255.0
Gateway de internet: 192.168.0.254
IP virtual para nuestro cluster 192.168.0.1

Ahora vamos a ver los dos ficheros que tenemos que modificar y la configuración mínima para hacer funcionar nuestro cluster;

root@M50:~# cat /etc/ha.d/ha.cf
node M30 M40 M50

bcast eth0

crm on


En este fichero ha.cf esta la configuración mínima para nuestro cluster, los miembros, el tipo de sealizacion para la senal de heartbeat y con "crm on" habilitamos el uso de las funciones de la versión 2 de heartbeat.

root@M50:~# cat /etc/ha.d/authkeys
auth 1
1 sha1 ClaveSuperSecreta

En el fichero authkeys establecemos la codificación de la senal de heatbeat y la clave a utilizar, estos dos ficheros deben de estar presentes en los tres servidores y despues de modificarlos hay que reiniciar el demonio de heartbeat

#/etc/init.d/heartbeat restart

podemos utilizar las herramientas de linea de comandos pero voy a explicar como darlo todo de alta con la herramienta grafica, que aunque se encuentra en una primera fase de desarrollo es muy util. Lo primero que tenemos que hacer es ponerle una password al usuario hacluster en la maquina o maquinas donde queramos conectarnos a la herramienta grafica, y como root ejecutar;

#hb_gui


Aqui vemos la pantalla de entrada, ponemos nuestra password y al acceder deberiamos de ver nuestro cluster simetrico con los tres nodos en verde y con el estado quorum.

Ahora vamos a dar de alta los recursos que va a ofrecer este cluster, en nuestro caso van a ser;
- una ip virtual para que conecten los clientes.
- un servicio de proxy Squid.
- un servicio de NTP, para que toda nuestra red se pueda sincronizar con una unica hora.

Cuando estas insertando el resource de Ipaddr tienes que poner un parametro que sea ip y otorgarle el valor de la ip virtual que queramos usar.

Es importante dar todos estos servicios sobre un grupo que permita que ante la caída de un nodo todos los servicios se muevan en grupo al siguiente nodo disponible.

Una vez que estan dados de alta los servicios pulsa con el boton derecho sobre el grupo y dale al triangulo verde de activar, veras que se activan y se arrancan en uno de los nodos. Ahora viene lo divertido, prueba que tienes internet poniendote de servidor proxy la Ip virtual que hemos configurado, tienes internet verdad? prueba a tirar del cable de red del servidor que tiene los servicios arrancados...

Seguro que se puede mejorar, para eso estan los comentarios....