En entornos de alta disponibilidad es imprescindible el uso de ips flotantes, estas se caracterizan por poder migrar de un servidor a otro de forma transparente consiguiendo de este modo seguir proveyendo de servicio en caso de caÃda de uno de los servidores.
En esta ocasión vamos a utilizar CARP que es la implementación de VRRP por parte del equipo de OpenBSD , el código está totalmente integrado en FreeBSD asà que toda la configuración se realizará empleando las herramientas propias del sistema sin necesidad de instalar ningún paquete adicional.
Para mostar el funcionamiento de CARP dispondremos de dos servidores cada uno con su ip independiente, compartiendo una VIP entre ellos:
- VIP: 192.168.69.40
- PeanutBrain01: 192.168.69.41
- PeanutBrain02: 192.168.69.42
Cargamos el módulo carp en ambos servidores:
Indicamos al sistema operativo que lo cargue en el arranque:
carp_load="YES"
Si estamos utilizando un custom kernel tendremos que habilitar la siguiente opción en la compilación del mismo:
device carp
En CARP existen dos roles MASTER/BACKUP, dicho role se decide en base al peso asignado en la configuración, el servidor con menor peso será MASTER.
En mi caso voy a asignar los siguientes pesos:
MASTER: PeanutBrain01 -> advskew 0(por defecto)
BACKUP: PeanutBrain02 -> advskew 100
Realizamos la configuración en PeanutBrain01:
ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.69.40/32"
Realizamos la configuración en PeanutBrain02:
ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.69.40/24"
Reniciamos la red en ambos servidores:
service routing restart
Podemos ver en la salida de ifconfig una ip adicional en cada servidor, donde se indica el role de la VIP y el peso.
PeanutBrain01:
root@PeanutBrain01:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
ether 08:00:27:42:4c:a5
inet 192.168.69.41 netmask 0xffffff00 broadcast 192.168.69.255
inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
carp: MASTER vhid 1 advbase 1 advskew 0
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
PeanutBrain02:
root@PeanutBrain02:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
ether 08:00:27:37:5f:f2
inet 192.168.69.42 netmask 0xffffff00 broadcast 192.168.69.255
inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
carp: BACKUP vhid 1 advbase 1 advskew 100
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
La forma mas sencilla de comprobar en que servidor está la VIP es poner a la escucha un socket mediante netcat , dependiendo del servidor que tenga activa la VIP en ese momento veremos la salida en un servidor u otro.
Instalamos netcat en ambos servidores:
Ahora ponemos a la escucha el socket en ambos servidores:
Desde nuestro pc realizamos una conexión a la VIP:
Podemos ver como PeanutBrain01 recibe la conexión:
Garrus $ ~> nc 192.168.69.40 7777
111111
root@PeanutBrain01:~ # nc -l 7777
111111
Si reiniciamos PeanutBrain01 veremos en PeanutBrain02 que ahora es MASTER:
root@PeanutBrain02:~ # ifconfig em0
em0: flags=8963<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
ether 08:00:27:37:5f:f2
inet 192.168.69.42 netmask 0xffffff00 broadcast 192.168.69.255
inet 192.168.69.40 netmask 0xffffff00 broadcast 192.168.69.40 vhid 1
carp: MASTER vhid 1 advbase 1 advskew 100
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
Si volvemos a realizar la conexión esta es recibida PeanutBrain02:
Garrus $ ~> nc 192.168.69.40 7777
222222
root@PeanutBrain02:~ # nc -l 7777
222222
Debemos tener en cuenta que si el BACKUP toma la VIP esta NO volverá al MASTER cuando este se recupere, si queremos que esto ocurra de forma automática tendremos que habilitar el parámetro sysctl
net.inet.carp.preempt
en ambos servidores:
Si queremos hacerlo permanente:
net.inet.carp.preempt=1
También podemos forzar el cambio manualmente ejecutando en el servidor de BACKUP: