Решил написать короткую статью о настройке отказоустойчивого 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-8a – carp2 хост. Идем на 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 …
Вот и все.