Esta pagina se ve mejor con JavaScript habilitado

Alta disponibilidad mediante Keepalive

 ·  🎃 kr0m

Keepalive es un magnífico sistema de alta disponibilidad, nos permitirá migrar de forma automática ips entre diferentes servers, esto nos permitirá tener un sistema altamente disponible con un downtime mínimo.

En este ejemplo vamos a utilizar keepalive para mantener varias vips(ips compartidas) por el proceso HaProxy.

Keepalive funciona en base a VRRP protocolo que opera a nivel 2, esto implica que los equipos deben de estar en el mismo segmento de red.

Los equipos que tengan el mismo PASS configurado se monitorizan entre ellos, si se caen las VIPs se configuran automáticamente en la interfaz indicada.

NOTA: En la misma lan se pueden tener varios keepalives pero cada uno con un router_id, virtual_router_id y vrrp_instance diferentes.

emerge -av keepalived

En ha10:

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     sys@alfaexploit.com
   }
   notification_email_from ha10@rack
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_MAIN_HA
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2 # check cada 2 segundos

    weight 2 # anyade 2 puntos de prioridad si OK

}

vrrp_instance VI_HA_1 {
    state MASTER
    interface eth1
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXXXXXXX
    }
    virtual_ipaddress {
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
    }

    track_script {
        chk_haproxy
    }
}

En ha11:

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     sys@alfaexploit.com
   }
   notification_email_from ha11@rack
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_MAIN_HA
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_HA_1 {
    state BACKUP
    interface eth1
    virtual_router_id 10
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXXXXXXX
    }

    virtual_ipaddress {

        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
        AAA.BBB.CCC.DDD/MASK dev INTERFAZ
    }

    track_script {
        chk_haproxy
    }
}

Hemos configurado las prioridades 100 y 99, los pesos 2(en el script de chequeo), mientras esté activo :

  • ha10: 100+2=102 – INACTIVO–> 100
  • ha11: 99+2=101 – INACTIVO–> 99

Con el kill -0 se comprueba que el servicio del ha esté activo, en el momento en el que este chequeo falle las ips se migrarán de forma automática.

ADVERTENCIA:
Tendremos que tener en cuenta varios aspectos para que todo esto funcione automágicamente hay que dejar el servicio configurado con las ips finales en el ha, para poder bindear en el backup unas ips que no tiene hay que hacer pirulas:

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.ip_nonlocal_bind=1
sysctl -p

Arrancamos keepalive y lo metemos en el arranque:

/etc/init.d/keepalived start
rc-update add keepalived default

NOTA: VRRP tiene un límite de 20 vips por instancia, si se requieren de mas hay que configurar una segunda instancia.

Hay redes en las que la tabla ARP del router no se refresca correctamente, para forzarlo:

arping -s VIP -I eth0 GW_IP

Se puede automatizar esto con:

vrrp_instance VI_HA_1 {
    state BACKUP
    interface eth0
    virtual_router_id 10
    priority 100
    notify_master /root/keepMASTER.sh
vi /root/keepMASTER.sh
#! /bin/bash
VIP="A.B.C.D"
IF="eth1"
IPROUTER="E.F.G.H"
DATE=$(date)
echo -e "NEW ROLE: MASTER -- ReARPing Router ARP table: $DATE" >> /tmp/keepalived.log
arping -s $VIP -I $IF -c 5 $IPROUTER

Este artículo es muy interesante y espero que le saquéis el máximo provecho ;)

Si te ha gustado el artículo puedes invitarme a un RedBull aquí