Cluster para Novatos Parte I : Keepalived + Asterisk / Kamailio
En los siguientes artículos voy a abordar diferentes aspectos para clusterizar o mejorar el comportamiento en alta disponibilidad con Asterisk y Kamailio.
Tradicionalmente para disponer de una ip de servicio que balancea automáticamente entre dos máquinas, una activa y otra pasiva , o activo-activo, se ha usado pacemaker y corosync, incluso en algunos casos ucarp. Estos proyectos cierto es que han sido empleados mucho en el pasado pero hoy en día , keepalived es un proyecto que está creciendo bastante y merece la pena empezar a usarlo en estas arquitecturas. Usa el protocolo VRRP empleado en alta disponibilidad en red como routers, mikrotik y similares.
En debian simplemente tenemos que instalar los paquetes con apt-get
apt-get install keepalived
También nos hará falta instalar sipsak que luego veremos para que nos servirá.
apt-get install sipsak
Para el buen funcionamiento deberemos cambiar algunos parámetros de sysctl , algunos relacionados con ARP para que cuando haya un salto se encaminen las peticiones lo antes posible a la máquina activa y otros para permitir bindear Asterisk a ips que no tiene (la activa).
Editaremos /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.conf.all.arp_ignore = 3
net.ipv4.conf.all.arp_announce = 2
y aplicaremos los cambios con:
sysctl -p
Una vez hecho esto ya configuraremos el keepalived /etc/keepalived/keepalived.conf de cada uno de los nodos:
vrrp_instance cluster{
state MASTER
interface eth0
virtual_router_id 01
priority 100
nopreempt
advert_int 1
virtual_ipaddress { IP.SER.VI.CIO/24 dev eth0 label eth0:1 }
track_script { comprobar_sip }
notify_master “/etc/keepalived/estado.sh MAESTRO “
notify_backup “/etc/keepalived/estado.sh BACKUP “
}
Para provocar el salto cuando Asterisk o Kamailio no responda usaremos un script comprobar_sip, que empleará el sipsak como antes comentábamos.
vrrp_script comprobar_sip {
script “/etc/keepalived/comprobar_sip.sh”
interval 10 # se comprueba cada 10 segundos
fall 3 # Si falla 3 veces consideramos caído
rise 5 #Exigimos 5 veces para OK
}
El script en cuestión comprobará si responde Asterisk. En el caso de Kamailio hay que tener cuidado y que responda a los OPTIONS y en Asterisk que el contexto entrante por defecto tenga la extensión en cuestión (s)
[entrantes]
exten => s,1,Noop
Para que no tengamos problemas.
Crearemos el script comprobar_sip.sh como sigue:
#!/bin/bash
sipsak -s sip:s@IP_SERVICIO:5060
if [$? -ne 0 ] ; then
exit
else
exit 0
fi
Y crearemos el script estado.sh
#!/bin/bash
STATE=$1
case $STATE in
“MAESTRO”)
service kamailio start || service kamailio restart
exit 0
;;
“BACKUP”)
service kamailio stop
exit 0
;;
esac
En el otro nodo haremos lo mismo pero intercambiando las IPS en el script comprobar_sip.sh y
….
state BACKUP
virtual_router_id 01
priority 99
….
en la configuración de keepalived.conf