Cluster de alta disponibilidad y espejo con Ubuntu 7.04


Cluster de alta disponibilidad y espejo con Ubuntu 7.04


Este proyecto fue realizado como un proyecto de comunicaciones I de la Universidad de El Salvador

La versión en que se basó en ese momento fue Ubuntu 7.04 pero puede funcionar sin problemas en otras versiones.


Contenido


  • Instalaciones previas
  • Configuración de Nodos Balanceadores
- Habilitar IP Virtual Server
- Instalación de Ultramonkey
- Permitir la expedición de paquetes
- Configuración de Hearbeat y LDirector
  • Configuración de Nodos Apache
- Instalación de LAMP
- Configuración de la IP virtual
- Configuración de página de prueba
  • Pruebas de funcionamiento
  • Pruebas de alta disponibilidad del cluster


  • Instalaciones previas


- Software.

Todos los nodos del cluster deberán tener instalado la versión 7.04 de Ubuntu debido a que todas las configuraciones que se realizaran serán en base a esa distribución y esa versión específica, no significa que solo se pueda hacer en esa versión ya que el software es para cualquier distribución de Linux.

- Hardware

- Cada computador debe tener una NIC instalada.
- Los nodos balanceadores también deberán contar con un puerto serial macho de nueve pines.

- Armar topología tipo estrella

Todos los nodos del cluster estarán concentrados en un mismo Switch.


  • Configuración de Nodos Balanceadores


- Habilitar IP Virtual Server

IPVS (IP Virtual Server) implementa una capa de transporte dentro del kernel Linux de los balanceadores de carga. Esta capa es conocida como capa de conmutación.
Para llevar a cabo el proceso ejecutamos lo siguiente en consola como usuario root:
  echo ip_vs_dh >> /etc/modules
  echo ip_vs_ftp >> /etc/modules
  echo ip_vs >> /etc/modules
  echo ip_vs_lblc >> /etc/modules
  echo ip_vs_lblcr >> /etc/modules
  echo ip_vs_lc >> /etc/modules
  echo ip_vs_nq >> /etc/modules
  echo ip_vs_rr >> /etc/modules
  echo ip_vs_sed >> /etc/modules
  echo ip_vs_sh >> /etc/modules
  echo ip_vs_wlc >> /etc/modules
  echo ip_vs_wrr >> /etc/modules
  modprobe ip_vs_dh
  modprobe ip_vs_ftp
  modprobe ip_vs
  modprobe ip_vs_lblc
  modprobe ip_vs_lblcr
  modprobe ip_vs_lc
  modprobe ip_vs_nq
  modprobe ip_vs_rr
  modprobe ip_vs_sed
  modprobe ip_vs_sh
  modprobe ip_vs_wlc
  modprobe ip_vs_wrr


- Instalación de Ultramonkey

Ultramonkey es un paquete para implementar balanceadores de carga y servicios de alta disponibilidad en una red de área local, usando componentes de fuente abierta en el sistema operativo Linux.
Este paquete provee Heartbeat, el software de alta disponibilidad a utilizar (usado por los balanceadores de carga para monitorizarse entre ellos y verificar cual de ellos está activo) y ldirectord el actual balanceador de carga.
Para instalar Ultramonkey se necesita editar el siguiente archivo: sources.list.

Para acceder a dicho archivo digitamos en consola como usuario root lo siguiente:


 gedit /etc/apt/sources.list
 

Ahora agregamos las siguientes líneas al final del archivo.

 deb http://www.ultramonkey.org/download/3/ sarge main
 deb-src http://www.ultramonkey.org/download/3 sarge main

Por ultimo en consola digitar lo siguiente para importar las llaves GPG:


 gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 03C0023E05410E97
 
 gpg --armor --export 03C0023E05410E97 | apt-key add –


Después de haber hecho esto, siempre en consola digitamos lo siguiente:


 apt-get update
 

Instalamos el UltraMonkey (En consola como usuario root):


apt-get install ultramonkey


- Permitir la expedición de paquetes


Los balanceadores de carga necesitan ser capaces de dirigir o enrutar el tráfico para los nodos apache, por lo tanto debemos permitir la expedición de paquetes en los balanceadores de carga. Para ello debemos modificar el archivo sysctl.conf

Para acceder a dicho archivo digitamos en consola lo siguiente:


gedit /etc/sysctl.conf


Agregamos lo siguiente al archivo:

 # Enables packet forwarding
 net.ipv4.ip_forward = 1

Para probar la configuración digitamos lo siguiente en consola:


 sysctl -p
 


Nos dará como respuesta:

 kernel.printk = 4 4 1 7
 kernel.maps_protect = 1
 fs.inotify.max_user_watches = 524288
 vm.mmap_min_addr = 65536
 net.ipv4.conf.default.rp_filter = 1
 net.ipv4.conf.all.rp_filter = 1
 net.ipv4.ip_forward = 1


- Configuración de Hearbeat

Ahora tenemos que crear tres archivos de configuración para heartbeat. Estos deben ser idénticos en ambos balanceadores de carga.

Para la creación de dichos archivos seguir los siguientes pasos: En consola digitar lo siguiente:


 gedit /etc/ha.d/ha.cf

Digitar el siguiente contenido al archivo:

 logfacility      local0
 bcast        eth0           # Linux
 mcast eth0 225.0.0.1 694 1 0
 auto_failback off
 node        loadb1
 node        loadb2
 respawn hacluster /usr/lib/heartbeat/ipfail
 apiauth ipfail gid=haclient uid=hacluster


En este caso el nombre de cada nodo es: loadb1 y loadb2 respectivamente para los balanceadores de carga 1 y 2

Para el siguiente archivo digitamos en consola:


gedit /etc/ha.d/haresources


E introducimos el siguiente contenido al archivo:

loadb1 \

     ldirectord::ldirectord.cf \
     LVSSyncDaemonSwap::master \
     IPaddr2::192.168.1.105/24/eth0/192.168.1.255

El ejemplo aquí presentado es para el nodo balanceador de carga 1 “loadb1”, para el balanceador de carga 2 solamente se sustituye la primera línea por loadb2. El siguiente archivo se crea digitando en consola:


gedit /etc/ha.d/authkeys


Agregamos el siguiente contenido:

auth 3 3 md5 somerandomstring

Este archivo debe ser legible solo por el administrador del sistema (root), por lo tanto digitamos el siguiente comando en consola para conceder los permisos apropiados.


chmod 600 /etc/ha.d/authkeys

Configuración de Ldirector Ldirectord es el actual balanceador de carga. Ahora configuraremos ambos balanceadores de carga para que funcionen en la modalidad activa/pasiva, que significa que tenemos un balanceador de carga activo y el otro en espera activa en caso de que el balanceador activo falle. Esto lo hacemos creando el archivo de configuración de ldirectord el cual debe ser idéntico en ambos balanceadores de carga. Para la creación de dicho archivo digitamos lo siguiente:


gedit /etc/ha.d/ldirectord.cf

Agregamos el siguiente contenido al archivo:

checktimeout=10 checkinterval=2 autoreload=no logfile="local0" quiescent=yes virtual=192.168.1.105:80

     real=192.168.1.101:80 gate
     real=192.168.1.102:80 gate
     fallback=127.0.0.1:80 gate
     service=http
     request="ldirector.html"
     receive="Test Page"
     scheduler=rr
     protocol=tcp
     checktype=negotiate

En la línea de “virtual” ponemos la dirección IP virtual en este caso la 192.168.1.105, y en “real” las direcciones IP correspondientes a cada uno de los balanceadores de carga, en “request” se pone el nombre del archivo que se encuentra en los nodos servidores web 1 y 2 al que se realizaran peticiones repetidamente para verificar si ambos servidores web están todavía activos. Luego creamos el sistema de enlaces de punto de partida para heartbeat y removemos estos de ldirectord porque ldirectord será iniciado por el demonio heartbeat. Para llevar a cabo esta acción digitamos lo siguiente en consola:

update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 . update-rc.d -f ldirectord remove

Finalmente iniciamos heartbeat: cd /etc/init.d/ ldirectord stop /etc/init.d/heartbeat start


  • Configuración de Nodos Apache


- Instalación de LAMP

Instalación del servicio web, utilizaremos LAMP server (Apache2, mysql, php) Para la instalación utilizaremos Synaptic.

   > Sistema >Administración > Gestor de paquetes Synaptic 

Luego dentro de synaptic > Editar > Marcar paquetes por tarea... Seleccionamos LAMP server Ahora buscamos phpmyadmin y lo seleccionamos. Después de esto solo le damos aplicar y ya tendremos instalado el servicio.

- Configuración de la IP virtual
Finalmente debemos configurar los nodos servidores con el servicio apache disponible de nuestro cluster que aceptaran las peticiones en que llegan a través de la dirección IP virtual.

Para llevar a cabo tal tarea seguimos los siguientes pasos en ambos nodos servidores, digitando en consola los comandos indicados a continuación:


  apt-get install iproute


Ahora agregamos lo siguiente al archivo sysctl.conf, digitando en consola lo siguiente:


  gedit /etc/sysctl.conf

y copiar el siguiente contenido al archivo:

 # Enable configuration of arp_ignore option
 net.ipv4.conf.all.arp_ignore = 1
 # When an arp request is received on eth0, only respond if that address is
 # configured on eth0. In particular, do not respond if the address is
 # configured on lo
 net.ipv4.conf.eth0.arp_ignore = 1
 # Ditto for eth1, add for all ARPing interfaces
 #net.ipv4.conf.eth1.arp_ignore = 1
 # Enable configuration of arp_announce option
 net.ipv4.conf.all.arp_announce = 2
 # When making an ARP request sent through eth0 Always use an address that
 # is configured on eth0 as the source address of the ARP request. If this
 # is not set, and packets are being sent out eth0 for an address that is on
 # lo, and an arp request is required, then the address on lo will be used.
 # As the source IP address of arp requests is entered into the ARP cache on
 # the destination, it has the effect of announcing this address. This is
 # not desirable in this case as adresses on lo on the real-servers should
 # be announced only by the linux-director.
 net.ipv4.conf.eth0.arp_announce = 2
 # Ditto for eth1, add for all ARPing interfaces
 #net.ipv4.conf.eth1.arp_announce = 2

Para comprobar configuración digitamos lo siguiente:

sysctl –p


Agregar la siguiente sección para la dirección IP virtual a /etc/network/interfaces en ambos servidores, digitando la siguiente línea en consola:


  gedit /etc/network/interfaces


Agregamos el siguiente texto:

  auto lo:0
  iface lo:0 inet static
    address 192.168.1.105
    netmask 255.255.255.255
    pre-up sysctl -p > /dev/null

Entonces ejecutamos lo siguiente en ambos servidores:

  ifup lo:0


Configuración de página de prueba Finalmente debemos crear el archivo ldirector.html. en ambos nodos servidores. Este archivo es invocado repetidamente por ambos nodos balanceadores de carga de esta manera pueden ver si ambos nodos Apache están corriendo. Para crear el archivo digitamos lo siguiente en consola de ambos servidores apache:

  gedit /var/www/ldirector.html

y escribimos un texto de prueba:

Test Page


  • Pruebas de funcionamiento
Después de las configuraciones probaremos que tanto los balanceadores de carga como los servidores web estén funcionando correctamente.
Pruebas de balanceadores de carga

Para las pruebas de funcionamiento de los balanceadores de carga lo aremos en base a valores esperados de comandos de comprobación del estado del servicio.

  ip addr sh eth0

El balanceador de carga activo debe mostrar la lista de dirección IP virtual (192.168.1.105 en este caso) por ejemplo:

2: eth0: <BROADCAST, MULTICAST, UP> mtu 1500 qdisc pfifo_fast qlen 1000

  link/ether 00:16:3e:40:18:e5 brd ff:ff:ff:ff:ff:ff
  inet 192.168.0.103/24 brd 192.168.0.255 scope global eth0
  inet 192.168.0.105/24 brd 192.168.0.255 scope global secondary eth0

Balanceador de carga en espera-activa debe mostrar lo siguiente:

2: eth0: <BROADCAST, MULTICAST, UP> mtu 1500 qdisc pfifo_fast qlen 1000

  link/ether 00:16:3e:50:e3:3a brd ff:ff:ff:ff:ff:ff
  inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0
  ldirectord ldirectord.cf status

La salida en el balanceador de carga activo debe ser: ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1455

La salida en el balanceador de carga en espera-activa: ldirectord is stopped for /etc/ha.d/ldirectord.cf

  ipvsadm -l -n

La salida en el balanceador de carga activo tendría que ser: IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port          Forward Weight ActiveConn InActConn

TCP 192.168.1.105:80 rr

 -> 192.168.1.101:80            Route    0     0            0
 -> 192.168.1.102:80            Route    0     0            0
 -> 127.0.0.1:80                     Local    1     0            0

La salida en el balanceador de carga en espera-activa es: IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port          Forward Weight ActiveConn InActConn
  /etc/ha.d/resource.d/LVSSyncDaemonSwap master status

La salida en el balanceador de carga es: master running (ipvs_syncmaster pid: 1591)

En el balanceador de carga en estado espera-activa seria: master stopped

Si después de las pruebas todas las salidas no han generado problemas los balanceadores de carga están trabajando correctamente


Pruebas de Servidores WEB

La prueba de los servidores web se vuelve un poco más sencilla dado que solo se debe que comprobar que esté escuchando la IP virtual por lo tanto al acceder a la IP virtual 192.168.1.105 desde el servidor debe mostrar su propia página predeterminada por apache.


Pruebas de alta disponibilidad del cluster
Para efectos de verificar en todo el tiempo cual de los servidores está dando el servicio en la página de prueba estará reflejado en que servidor se está ejecutando y desde el lado del el cliente se accederá al servicio siempre por la IP virtual 192.168.1.105.

1. Fallo de un servidor WEB

Cuando falla un servidor WEB simplemente se sacara de la lista de servidores disponibles y el servicio quedara funcionando en el otro servidor WEB

2. Fallo de un balanceador de carga

En el momento que falle el balanceador de carga activo el balanceador de carga pasivo tomara el rol de balanceador de carga activo siendo el que redirigirá el trafico de la IP virtual.

3. Fallo de un servidor WEB y un Balanceador de carga

Se combinan las situaciones 1 y 2 por lo que se sacara el servidor WEB de la lista y al balanceador pasivo pasa ha estado activo.

4. Fallo de los dos servidores WEB

Al no quedar servidor WEB activo pasa el balanceador activo a tomar el papel de servidor WEB de respaldo y de nodo balanceador.

5. Fallo de los dos servidores WEB y un balanceador de carga

Este es el punto crítico de la alta disponibilidad pues no existen más posibilidades de tolerancia a fallas pues solo queda el balanceador como servidor de respaldo