CARP. Отказоустойчивый IP

carpРешил написать короткую статью о настройке отказоустойчивого IP на основе CARP(Common Address Redundancy Protocol) протокола. Суть заключается в назначении одного IP адреса многим машинам(устройствам) в пределе одного сегмента сети. Эта технология может применяться при настройка отказоустойчивого mysql, web-proxy, net filter, firewall, gateway и т.п. кластера. Очень мощная вещь, которая очень легко и быстро настраивается (по крайней мере под Ubuntu). В роли серверов возьмем три Ubuntu 12.04/16.04.

Имеем следующие настройки:

Hostname

IP

CARP IP

carp1 eth1 192.168.1.130 192.168.1.135
carp2 eth1 192.168.1.131
carp3 eth0 192.168.1.132

1. Установка и настройка

Под Ubuntu нужно установить ucarp пакет для настройки CARP протокола. Идем на первый сервер и устанавливаем.

root@carp1:~# apt-get install ucarp

По настройкам и принципу работа есть отдельные документы, с которыми нужно ознакомиться более детально.

root@carp1:~# less /usr/share/doc/ucarp/README.
README.Debian  README.gz

Далее, все что осталось сделать – это настроить интерфейс.

root@carp1:~# cat /etc/network/interfaces
…
auto eth1
iface eth1 inet static
        address 192.168.1.130
        netmask 255.255.255.0
        # Virtual Host ID - ID группы в которую должны входить все 3 CARP хоста
        ucarp-vid 3
        # Shared redundancy IP - наш отказоустойчивый IP
        ucarp-vip 192.168.1.135
        # Пароль для общения между CARP хостами
        ucarp-password Yqb5wfgxZT2mVJqw
        # На сколько смещать отправку оповещений(Чем больше число, ти меньше вероятность, что хост станет Мастером)
        ucarp-advskew 1
        # Как часто оповещать всем хостам о своем статусе в redundancy группе
        ucarp-advbase 1
        # Роль в redundancy группе при старте
        ucarp-master no
# Виртуальный интерфейс of redundancy group
iface eth0:ucarp inet static
        address 192.168.1.135
        netmask 255.255.255.0
…

Теперь осталось перезагрузить сеть и у нас будет Мастер.

root@carp1:~# /etc/init.d/networking restart

Проверяем настройки интерфейса и логи.

root@carp1:~# ip a
…
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ba:a6:cf brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.130/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.135/24 brd 192.168.1.255 scope global secondary eth1:ucarp
    inet6 fe80::a00:27ff:feba:a6cf/64 scope link
       valid_lft forever preferred_lft forever
…

root@carp1:~# tail -100 /var/log/syslog | grep ucarp
Sep 20 07:18:28 carp1 ucarp[671]: [WARNING] Switching to state: MASTER
Sep 20 07:18:28 carp1 ucarp[671]: [WARNING] Spawning [/usr/share/ucarp/vip-up eth1 192.168.1.135]
Sep 20 07:18:32 carp1 ntpd[1023]: Listen normally on 8 eth1:ucarp 192.168.1.135 UDP 123

Первый хост поднят. Переходим к настройке второго. Ставим нужный пакет и настраиваем интерфейс.

root@carp2:~# apt-get install ucarp
root@carp2:~# cat /etc/network/interfaces
…
auto eth1
iface eth1 inet static
        address 192.168.1.131
        netmask 255.255.255.0
        # Virtual Host ID - ID группы в которую должны входить все 3 CARP хоста
        ucarp-vid 3
        # Shared redundancy IP - наш отказоустойчивый IP
        ucarp-vip 192.168.1.135
        # Пароль для общения между CARP хостами
        ucarp-password Yqb5wfgxZT2mVJqw
        # На сколько смещать отправку оповещений(Чем больше число, ти меньше вероятность, что хост станет Мастером)
        ucarp-advskew 1
        # Как часто оповещать всем хостам о своем статусе в redundancy группе
        ucarp-advbase 1
        # Роль в redundancy группе при старте
        ucarp-master no
# Виртуальный интерфейс of redundancy group
iface eth0:ucarp inet static
        address 192.168.1.135
        netmask 255.255.255.0
…

Здесь только меняется уникальный IP адрес хоста. Рестарт сети и проверка логов и интерфейсов.

root@carp2:~# /etc/init.d/networking restart
root@carp2:~# tail /var/log/syslog | grep ucarp
…
Sep 20 07:31:30 carp2 ucarp[3358]: [INFO] Local advertised ethernet address is [08:00:27:0c:25:8a]
Sep 20 07:31:30 carp2 ucarp[3358]: [WARNING] Switching to state: BACKUP
Sep 20 07:31:30 carp2 ucarp[3358]: [WARNING] Spawning [/usr/share/ucarp/vip-down eth1 192.168.1.135]
…
root@carp2:~# ip a
…
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:0c:25:8a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.131/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::a00:27ff:fe0c:258a/64 scope link
       valid_lft forever preferred_lft forever
…

Как видно, интерфейс стал Backup.
Остался последний хост. Ставим пакеты и настроим интерфейс.

root@carp3:~# apt-get install ucarp
root@carp3:~# cat /etc/network/interfaces
…
auto eth0
iface eth0 inet static
        address 192.168.1.132
        netmask 255.255.255.0
        # Virtual Host ID - ID группы в которую должны входить все 3 CARP хоста
        ucarp-vid 3
        # Shared redundancy IP - наш отказоустойчивый IP
        ucarp-vip 192.168.1.135
        # Пароль для общения между CARP хостами
        ucarp-password Yqb5wfgxZT2mVJqw
        # На сколько смещать отправку оповещений(Чем больше число, ти меньше вероятность, что хост станет Мастером)
        ucarp-advskew 1
        # Как часто оповещать всем хостам о своем статусе в redundancy группе
        ucarp-advbase 1
        # Роль в redundancy группе при старте
        ucarp-master no
# Виртуальный интерфейс of redundancy group
iface eth0:ucarp inet static
        address 192.168.1.135
        netmask 255.255.255.0

Теперь рестартуем сеть, и смотрим что получилось.

root@carp3:~# /etc/init.d/networking restart
root@carp3:~# tail /var/log/syslog | grep ucarp
…
Sep 20 07:43:19 carp3 ucarp[2520]: [INFO] Local advertised ethernet address is [08:00:27:88:0c:a6]
Sep 20 07:43:19 carp3 ucarp[2520]: [WARNING] Switching to state: BACKUP
Sep 20 07:43:19 carp3 ucarp[2520]: [WARNING] Spawning [/usr/share/ucarp/vip-down eth0 192.168.1.135]
…
root@carp3:~# ip a
…
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:88:0c:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.132/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::a00:27ff:fe88:ca6/64 scope link
       valid_lft forever preferred_lft forever
…

Теперь у нас есть три хоста с отказоустойчивым IP.

Тестирование

Протестировать кластер можно используя простую команду ping. Так как это были три виртуальные машины с bridged интерфейсами, можно перейти на хостовую машину и запустить ping нашего кластерного отказоустойчивого IP.

PS D:\> ping 192.168.1.135
Pinging 192.168.1.135 with 32 bytes of data:
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.1.135:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

PS D:\> arp -a
  Internet Address      Physical Address      Type
  192.168.1.1           ac-22-0b-ba-d7-4c     dynamic
  192.168.1.130         08-00-27-ba-a6-cf     dynamic
  192.168.1.131         08-00-27-0c-25-8a     dynamic
  192.168.1.132         08-00-27-88-0c-a6     dynamic
  192.168.1.135         08-00-27-ba-a6-cf     dynamic

После пинга в arp таблицу попал 192.168.1.135 с МАС 08-00-27-ba-a6-cf. Так же, видно, что этот МАС принадлежит первому хосту.
Теперь вырубаем сеть на первом хосту (или ребутаем его вообще) и пингуем кластерный IP.

PS D:\> ping 192.168.1.135
Pinging 192.168.1.135 with 32 bytes of data:
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.1.135:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

PS D:\> arp -a
  Internet Address      Physical Address      Type
  192.168.1.1           ac-22-0b-ba-d7-4c     dynamic
  192.168.1.130         08-00-27-ba-a6-cf     dynamic
  192.168.1.131         08-00-27-0c-25-8a     dynamic
  192.168.1.132         08-00-27-88-0c-a6     dynamic
  192.168.1.135         08-00-27-0c-25-8a     dynamic

Теперь у нас 192.168.1.135 закреплен за МАС 08-00-27-0c-25-8acarp2 хост. Идем на carp2 хост и смотри что случилось.

root@carp2:~# tail /var/log/syslog | grep ucarp
…
Sep 20 08:05:33 carp2 ucarp[3358]: [WARNING] Switching to state: MASTER
Sep 20 08:05:33 carp2 ucarp[3358]: [WARNING] Spawning [/usr/share/ucarp/vip-up eth1 192.168.1.135]
…
root@carp2:~# ip a
…
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:0c:25:8a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.131/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.135/24 brd 192.168.1.255 scope global secondary eth1:ucarp
    inet6 fe80::a00:27ff:fe0c:258a/64 scope link
       valid_lft forever preferred_lft forever
…

Таки да, второй хост подхватил инициативу и стал мастером с отказоустойчивым IP. Теперь вырубаем и этот хост и запускаем ping.

root@carp2:~# reboot

PS D:\> ping 192.168.1.135
Pinging 192.168.1.135 with 32 bytes of data:
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Reply from 192.168.1.135: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.1.135:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

PS D:\> arp -a
  Internet Address      Physical Address      Type
  192.168.1.1           ac-22-0b-ba-d7-4c     dynamic
  192.168.1.130         08-00-27-ba-a6-cf     dynamic
  192.168.1.131         08-00-27-0c-25-8a     dynamic
  192.168.1.132         08-00-27-88-0c-a6     dynamic
  192.168.1.135         08-00-27-88-0c-a6     dynamic

Как видим, наш третий хост стал мастером. Проверяем, что творится на carp3 сервере.

root@carp3:~# tail /var/log/syslog | grep ucarp
…
Sep 20 08:13:26 carp3 ucarp[2520]: [WARNING] Switching to state: MASTER
Sep 20 08:13:26 carp3 ucarp[2520]: [WARNING] Spawning [/usr/share/ucarp/vip-up eth0 192.168.1.135]
…
root@carp3:~# ip a
…
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:88:0c:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.132/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.135/24 brd 192.168.1.255 scope global secondary eth0:ucarp
    inet6 fe80::a00:27ff:fe88:ca6/64 scope link
       valid_lft forever preferred_lft forever
…

Теперь, чтобы мастером стал обратно первый хост, можно послать сигнал ucarp демону на carp3, чтобы тот сменил статус на Backup.

root@carp3:~# killall -USR2 ucarp
root@carp3:~# tail /var/log/syslog
…
Sep 20 08:25:05 carp3 ucarp[2520]: [INFO] MASTER on eth0 id 3
Sep 20 08:27:42 carp3 ucarp[2520]: [WARNING] Switching to state: BACKUP
Sep 20 08:27:42 carp3 ucarp[2520]: [WARNING] Spawning [/usr/share/ucarp/vip-down eth0 192.168.1.135]
…

Теперь Мастером станет один из хостов, которые входят в группу. В моем случае это стал первый хост carp1.

root@carp1:~# ip a
…
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ba:a6:cf brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.130/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.135/24 brd 192.168.1.255 scope global secondary eth1:ucarp
    inet6 fe80::a00:27ff:feba:a6cf/64 scope link
       valid_lft forever preferred_lft forever
…

Так же можно послать сигнал USR1, чтобы узнать статус демона.

root@carp1:~# killall -USR1 ucarp
root@carp1:~# tail /var/log/syslog
…
Sep 20 08:33:23 carp1 ucarp[507]: [INFO] MASTER on eth1 id 3
…

root@carp2:~# killall -USR1 ucarp
root@carp2:~# tail /var/log/syslog
…
Sep 20 08:34:33 carp2 ucarp[629]: [INFO] BACKUP on eth1 id 3
…

root@carp3:~# killall -USR1 ucarp
root@carp3:~# tail /var/log/syslog
…
Sep 20 08:35:43 carp3 ucarp[2520]: [INFO] BACKUP on eth0 id 3
…

Вот и все.

Автор: admin, 20 сентября 2015
Рубрики: Linux
Метки: ,

Написать комментарий

Последние статьи

Яндекс.Метрика
?>