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.
En ha10:
! 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:
! 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:
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
Arrancamos keepalive y lo metemos en el arranque:
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:
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
#! /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 ;)