Configurando o UCARP no Debian Stretch

Cenário:

  1. IP do Master: 10.3.0.104/24
  2. IP do Slave: 10.3.0.105/24
  3. IP Compartilhado: 10.3.0.106/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.106/24"
DEV="enp0s3"

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.106/24"
DEV="enp0s3"

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 enp0s3 -s 10.3.0.104 -v 1 -p tequila123 -a 10.3.0.106 -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 enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:e8:a5:14 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.104/24 brd 10.3.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 10.3.0.106/24 scope global secondary enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee8:a514/64 scope link 
       valid_lft forever preferred_lft forever

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

Vamos ver os logs

tail -f /var/log/syslog
[...]
Jun 27 13:54:34 stretch01 ucarp[877]: [INFO] Local advertised ethernet address is [08:00:27:e8:a5:14]
Jun 27 13:54:34 stretch01 ucarp[877]: [WARNING] Switching to state: BACKUP
Jun 27 13:54:34 stretch01 ucarp[877]: [WARNING] Spawning [/etc/vip-down.sh enp0s3 10.3.0.106]
Jun 27 13:54:38 stretch01 ucarp[877]: [WARNING] Switching to state: MASTER
Jun 27 13:54:38 stretch01 ucarp[877]: [WARNING] Spawning [/etc/vip-up.sh enp0s3 10.3.0.106]

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).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet static
        address 10.3.0.104/24
        gateway 10.3.0.234
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 10.0.0.132 10.0.0.133
        dns-search dqs.local

up ucarp -i enp0s3 -s 10.3.0.104 -v 1 -p tequila123 -a 10.3.0.106 -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.106/24"
DEV="enp0s3"

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.106/24"
DEV="enp0s3"

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 enp0s3 -s 10.3.0.105 -v 1 -p tequila123 -a 10.3.0.106 -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 enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:51:0d:ec brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.105/24 brd 10.3.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe51:dec/64 scope link 
       valid_lft forever preferred_lft forever

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

Vamos ver os logs

tail -f /var/log/syslog
[...]
Jun 27 13:58:19 stretch02 ucarp[1153]: [INFO] Local advertised ethernet address is [08:00:27:51:0d:ec]
Jun 27 13:58:19 stretch02 ucarp[1153]: [WARNING] Switching to state: BACKUP
Jun 27 13:58:19 stretch02 ucarp[1153]: [WARNING] Spawning [/etc/vip-down.sh enp0s3 10.3.0.106]

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).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet static
        address 10.3.0.105/24
        gateway 10.3.0.234
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 10.0.0.132 10.0.0.133
        dns-search dqs.local

up ucarp -i enp0s3 -s 10.3.0.105 -v 1 -p tequila123 -a 10.3.0.106 -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 14:00:47 stretch02 ucarp[1153]: [WARNING] Switching to state: MASTER
Jun 27 14:00:47 stretch02 ucarp[1153]: [WARNING] Spawning [/etc/vip-up.sh enp0s3 10.3.0.106]

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 enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:51:0d:ec brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.105/24 brd 10.3.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 10.3.0.106/24 scope global secondary enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe51:dec/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 14:01:54 stretch02 ucarp[1153]: [WARNING] Switching to state: BACKUP
Jun 27 14:01:54 stretch02 ucarp[1153]: [WARNING] Spawning [/etc/vip-down.sh enp0s3 10.3.0.106]
Jun 27 14:01:54 stretch02 ucarp[1153]: [WARNING] Preferred master advertised: going back to BACKUP state

Referências