Configurando o UCARP no Debian Jessie

Cenário:

  1. IP do Master: 10.3.0.101/24
  2. IP do Slave: 10.3.0.102/24
  3. IP Compartilhado: 10.3.0.103/24

Deve ser executado nos dois servidores.

Vamos atualizar os repositórios

apt-get update

Vamos instalar o pacote necessário

apt-get install ucarp -y

Vamos criar os scripts que vão controlar o que deve ser feito quando o carp subir e quando ele for baixar.

Aqui vamos efetuar uma configuração simples, aqui vamos somente adicionar um novo endereço ip na interface de rede, porém podemos extender a ideia e criar scripts mais elaborados.

Vamos criar o script que deve ser executado quando o carp subir.

vim /etc/vip-up.sh
#!/bin/bash

IP="10.3.0.103/24"
DEV="eth0"

CHECK_IP=$(ip addr show ${DEV} | grep ${IP} | awk '{ print $2}')

if [ -z "${CHECK_IP}" ]; then
	/sbin/ip addr add ${IP} dev ${DEV}
fi

Vamos criar o script que deve ser executado quando o carp baixar.

vim /etc/vip-down.sh
#!/bin/bash

IP="10.3.0.103/24"
DEV="eth0"

CHECK_IP=$(ip addr show ${DEV} | grep ${IP} | awk '{ print $2}')

if [ ! -z "${CHECK_IP}" ]; then
	/sbin/ip addr del ${IP} dev ${DEV}
fi

Agora precisamos ajustar as permissões dos arquivos

chmod +x /etc/vip-up.sh /etc/vip-down.sh

Agora vamos subir o serviço do ucarp manualmente

ucarp -i eth0 -s 10.3.0.101 -v 1 -p tequila123 -a 10.3.0.103 -b 1 -k 10 -B -S -u /etc/vip-up.sh -d /etc/vip-down.sh -P

Segue abaixo uma descrição das opções

ucarp --help

ucarp 1.5.2 - Apr 17 2014

--interface=<if> (-i <if>): bind interface <if>
--srcip=<ip> (-s <ip>): source (real) IP address of that host
--vhid=<id> (-v <id>): virtual IP identifier (1-255)
--pass=<pass> (-p <pass>): password
--passfile=<file> (-o <file>): read password from file
--preempt (-P): becomes a master as soon as possible
--neutral (-n): don't run downscript at start if backup
--addr=<ip> (-a <ip>): virtual shared IP address
--help (-h): summary of command-line options
--advbase=<seconds> (-b <seconds>): advertisement frequency
--advskew=<skew> (-k <skew>): advertisement skew (0-255)
--upscript=<file> (-u <file>): run <file> to become a master
--downscript=<file> (-d <file>): run <file> to become a backup
--deadratio=<ratio> (-r <ratio>): ratio to consider a host as dead
--shutdown (-z): call shutdown script at exit
--daemonize (-B): run in background
--ignoreifstate (-S): ignore interface state (down, no carrier)
--nomcast (-M): use broadcast (instead of multicast) advertisements
--facility=<facility> (-f): set syslog facility (default=daemon)
--xparam=<value> (-x): extra parameter to send to up/down scripts

Agora vamos listar os endereços da nossa máquina

ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:e4:51:1a brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.101/24 brd 10.3.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.3.0.103/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee4:511a/64 scope link 
       valid_lft forever preferred_lft forever

Como podemos notar temos o endereço ip 10.3.0.103/24 que é o nosso ip compartilhado.

Vamos ver os logs

tail -f /var/log/syslog
[...]
Jun 27 10:25:02 jessie01 ucarp[1144]: [INFO] Local advertised ethernet address is [08:00:27:e4:51:1a]
Jun 27 10:25:02 jessie01 ucarp[1144]: [WARNING] Switching to state: BACKUP
Jun 27 10:25:02 jessie01 ucarp[1144]: [WARNING] Spawning [/etc/vip-down.sh eth0 10.3.0.103]
Jun 27 10:25:07 jessie01 ucarp[1144]: [WARNING] Switching to state: MASTER
Jun 27 10:25:07 jessie01 ucarp[1144]: [WARNING] Spawning [/etc/vip-up.sh eth0 10.3.0.103]

Como podemos notar uma das primeiras ações a serem tomadas é mudar o estado do carp para BACKUP, agora ele não vai subir o endereço ip compartilhado. Após a checagem ele notou que não tem um MASTER para o vhid que ele esta trabalhando com isso ele precisa se promover para subir o endereçamento ip. Após a checagem o servidor mudou o estado para MASTER e chamou o script vip-up.sh que vai adicionar o endereço compartilhado caso ele não esteja atribuido a interface que definimos no script.

Para subir sempre esta configuração na inicialização da máquina vamos forçar subir o ucarp quando a interface for iniciada.

vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
	address 10.3.0.101
	netmask 255.255.255.0
	network 10.3.0.0
	broadcast 10.3.0.255
	gateway 10.3.0.234

up ucarp -i eth0 -s 10.3.0.101 -v 1 -p tequila123 -a 10.3.0.103 -b 1 -k 10 -B -S -u /etc/vip-up.sh -d /etc/vip-down.sh -P

Vamos criar os scripts que vão controlar o que deve ser feito quando o carp subir e quando ele for baixar.

Aqui vamos efetuar uma configuração simples, aqui vamos somente adicionar um novo endereço ip na interface de rede, porém podemos extender a ideia e criar scripts mais elaborados.

Vamos criar o script que deve ser executado quando o carp subir.

vim /etc/vip-up.sh
#!/bin/bash

IP="10.3.0.103/24"
DEV="eth0"

CHECK_IP=$(ip addr show ${DEV} | grep ${IP} | awk '{ print $2}')

if [ -z "${CHECK_IP}" ]; then
	/sbin/ip addr add ${IP} dev ${DEV}
fi

Vamos criar o script que deve ser executado quando o carp baixar.

vim /etc/vip-down.sh
#!/bin/bash

IP="10.3.0.103/24"
DEV="eth0"

CHECK_IP=$(ip addr show ${DEV} | grep ${IP} | awk '{ print $2}')

if [ ! -z "${CHECK_IP}" ]; then
	/sbin/ip addr del ${IP} dev ${DEV}
fi

Agora precisamos ajustar as permissões dos arquivos

chmod +x /etc/vip-up.sh /etc/vip-down.sh

Agora vamos subir o serviço do ucarp manualmente

ucarp -i eth0 -s 10.3.0.102 -v 1 -p tequila123 -a 10.3.0.103 -b 1 -k 20 -B -S -u /etc/vip-up.sh -d /etc/vip-down.sh

Segue abaixo uma descrição das opções

ucarp --help

ucarp 1.5.2 - Apr 17 2014

--interface=<if> (-i <if>): bind interface <if>
--srcip=<ip> (-s <ip>): source (real) IP address of that host
--vhid=<id> (-v <id>): virtual IP identifier (1-255)
--pass=<pass> (-p <pass>): password
--passfile=<file> (-o <file>): read password from file
--preempt (-P): becomes a master as soon as possible
--neutral (-n): don't run downscript at start if backup
--addr=<ip> (-a <ip>): virtual shared IP address
--help (-h): summary of command-line options
--advbase=<seconds> (-b <seconds>): advertisement frequency
--advskew=<skew> (-k <skew>): advertisement skew (0-255)
--upscript=<file> (-u <file>): run <file> to become a master
--downscript=<file> (-d <file>): run <file> to become a backup
--deadratio=<ratio> (-r <ratio>): ratio to consider a host as dead
--shutdown (-z): call shutdown script at exit
--daemonize (-B): run in background
--ignoreifstate (-S): ignore interface state (down, no carrier)
--nomcast (-M): use broadcast (instead of multicast) advertisements
--facility=<facility> (-f): set syslog facility (default=daemon)
--xparam=<value> (-x): extra parameter to send to up/down scripts

Agora vamos listar os endereços da nossa máquina

ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:87:b8:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.102/24 brd 10.3.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe87:b8e6/64 scope link 
       valid_lft forever preferred_lft forever

Como podemos notar não temos o endereço ip 10.3.0.103/24 que é o nosso ip compartilhado.

Vamos ver os logs

tail -f /var/log/syslog
[...]
Jun 27 10:28:34 jessie02 ucarp[1140]: [INFO] Local advertised ethernet address is [08:00:27:87:b8:e6]
Jun 27 10:28:34 jessie02 ucarp[1140]: [WARNING] Switching to state: BACKUP
Jun 27 10:28:34 jessie02 ucarp[1140]: [WARNING] Spawning [/etc/vip-down.sh eth0 10.3.0.103]

Como podemos notar uma das primeiras ações a serem tomadas é mudar o estado do carp para BACKUP, agora ele não vai subir o endereço ip compartilhado. Após a checagem ele notou que tem um MASTER para o vhid que ele esta trabalhando com isso ele não precisa se promover para subir o endereçamento ip. Ele somente vai subir como master caso o servidor MASTER caia.

Para subir sempre esta configuração na inicialização da máquina vamos forçar subir o ucarp quando a interface for iniciada.

vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
	address 10.3.0.102
	netmask 255.255.255.0
	network 10.3.0.0
	broadcast 10.3.0.255
	gateway 10.3.0.234

up ucarp -i eth0 -s 10.3.0.102 -v 1 -p tequila123 -a 10.3.0.103 -b 1 -k 20 -B -S -u /etc/vip-up.sh -d /etc/vip-down.sh

Agora vamos desligar o servidor master para testar e vamos analisar os logs do ucarp.

tail -f /var/log/syslog
[...]
Jun 27 10:30:23 jessie02 ucarp[1140]: [WARNING] Switching to state: MASTER
Jun 27 10:30:23 jessie02 ucarp[1140]: [WARNING] Spawning [/etc/vip-up.sh eth0 10.3.0.103]

Como podemos notar o ucarp identificou que o servidor master estava down e subiu o endereço ip compartilhado.

Agora vamos checar a interface de rede para confirmar que o ip subiu

ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:87:b8:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.102/24 brd 10.3.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.3.0.103/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe87:b8e6/64 scope link 
       valid_lft forever preferred_lft forever

Como podemos notar está tudo funcionando tudo certinho.

Agora podemos subir o servidor master novamente para analisar os logs do ucarp

tail -f /var/log/syslog 
[...]
Jun 27 10:31:30 jessie02 ucarp[1140]: [WARNING] Switching to state: BACKUP
Jun 27 10:31:30 jessie02 ucarp[1140]: [WARNING] Spawning [/etc/vip-down.sh eth0 10.3.0.103]
Jun 27 10:31:30 jessie02 ucarp[1140]: [WARNING] Preferred master advertised: going back to BACKUP state

Referências