Задача
Требуется обеспечить работоспособность определённого IP-адреса (шлюза, важного сервера и т.д.) при пропадании связи с устройством, которому этот адрес первоначально принадлежит, с помощью резервных устройств.
В статье для этой цели будут использованы Debian Linux, протокол CARP и утилита ucarp.
Принцип действия
К основному устройству-владельцу IP (master) добавляется одно или несколько резервных (backup) с такими же сервисами,
Каждое устройство дополнительно имеет уникальный служебный IP-адрес и назначаемый приоритет,
Резервные устройства непрерывно опрашивают мастера,
Как только мастер перестаёт отвечать, резервное устройство, имеющее максимальный приоритет, поднимает публичный IP на своём сетевом интерфейсе,
Протоколы и термины
Hot standby — общее обозначение механизма (а также название устаревшего проприетарного протокола HSRP от Cisco), при котором для ресурса создаётся резерв, работающий в холостом режиме и готовый немедленно автоматически перейти в рабочий режим.
VRRP, Virtual Router Redundancy Protocol — разработан IETF на базе HSRP, но несовместим с ним. Доступен в виде RFC, но содержит патентные закладки Cisco. Поддерживается многими аппаратными маршрутизаторами профессионального уровня и имеет открытые реализации для Linux/Unix.
CARP, Common Address Redundancy Protocol — открытый, разработан как часть OpenBSD, портирован во FreeBSD. В *BSD поддерживается непосредственно ядром и управляется средствами базовой системы.
High Availibility (HA) — то, для чего применительно к IP-адресам служит Hot-standby средствами VRRP и CARP.
Load balancing (LB) — то, что часто упоминается совместно с HA, но в нашем случае не обеспечивается.
Решения для Linux/Unix
heartbeat — система для узлов кластера, т.е. умеющая делать больше, чем простое добавление-убирание IP-адреса (пример применения).
keepalived — ещё одна система для организации кластера.
carp — модуль для ядра Linux от Евгения Полякова. В официальное ядро не входит, со стандартным CARP то ли совместим неполностью, то ли несовместим вообще.
vrrpd, ucarp — User-space daemons implementing VRRP and CARP.
Конфигурация тестовой системы
Два физических маршрутизатора R1 и R2, образующих один виртуальный отказоустойчивый VR.
1.2.3.4 — внешний IP-адрес VR.
10.0.0.1/16 — внутренний IP-адрес VR.
eth0 — LAN-интерфейсы маршрутизаторов.
eth1 — WAN-интерфейсы маршрутизаторов.
10.255.0.0/24 — приватная подсеть для связи маршрутизаторов через LAN-интерфейс.
10.255.1.0/24 — приватная подсеть для связи маршрутизаторов через WAN-интерфейс.
10.255.*.11, .12, .13,… — IP-адреса маршрутизаторов R1, R2,… в приватных подсетях.
10.0.0.2 — тестовый компьютер со шлюзом по умолчанию 10.0.0.1
Установка ucarp на R1 и R2
apt-get install ucarp
Документация
В Debian настройка и запуск ucarp производятся не напрямую, а с помощью дополнительных параметров в стандартном системном файле-хранилище сетевых настроек /etc/network/interfaces, поэтому рекомендуется в первую очередь прочесть не «man ucarp» (хотя это тоже не будет лишним), а /usr/share/doc/ucarp/README.Debian.
У такого подхода есть и плюсы, и минусы. С одной стороны, настройка становится более наглядной. С другой, если на одном интерфейсе требуется поддерживать несколько независимых виртуальных IP, то для всех, кроме первого, ucarp придётся запускать вручную.
Настройка на R1
auto eth0
iface eth0 inet static
address 10.255.0.11
netmask 255.255.255.0
ucarp-vid 1
ucarp-vip 10.0.0.1
ucarp-password qwerty1
ucarp-advskew 10
iface eth0:ucarp inet static
address 10.0.0.0.1
netmask 255.255.0.0
iface eth1 inet static
address 10.255.1.11
netmask 255.255.255.0
ucarp-vid 2
ucarp-vip 1.2.3.4
ucarp-password qwerty2
ucarp-advskew 10
iface eth1:ucarp inet static
address 1.2.3.4
netmask 255.255.255.248
gateway 1.2.3.1
Настройка на R2
auto eth0
iface eth0 inet static
address 10.255.0.12
netmask 255.255.255.0
ucarp-vid 1
ucarp-vip 10.0.0.1
ucarp-password qwerty1
ucarp-advskew 20
iface eth0:ucarp inet static
address 10.0.0.1
netmask 255.255.0.0
iface eth1 inet static
address 10.255.1.12
netmask 255.255.255.0
ucarp-vid 2
ucarp-vip 1.2.3.4
ucarp-password qwerty2
ucarp-advskew 20
iface eth1:ucarp inet static
address 1.2.3.4
netmask 255.255.255.248
gateway 1.2.3.1
Пояснения
vid — номер отказоустойчивой группы. Должен быть одинаковым на всех серверах. От 1 до 255.
password — ключ шифрования сетевого протокола. Должен быть одинаковым на всех серверах-участниках данной группы.
advskew — позволяет управлять приоритетом назначения мастера из нескольких кандидатов.
Порядок выборов мастера из нескольких кандидатов
Выборы производятся, если не обнаружено ни одного мастера, либо если обнаружилось несколько мастеров (например, после split-brain'a).
Сравнивается флаг «preemptive» (директива «ucarp-master yes»). Наличие флага = больший приоритет.
Сравнивается интервал рассылки уведомлений advbase + advskew/255, сек. Меньший интервал = больший приоритет.
Сравниваются IP-адреса. Меньший IP = больший приоритет.
Проверка
На R1 и R2: /etc/init.d/networking restart.
Через несколько секунд выполняем на обоих "ip a" и видим, что на R2 побавились eth0:ucarp=10.0.0.1 и eth1:ucarp=1.2.3.4.
"ip r" показывает на R2 маршрут «default via 1.2.3.1».
Выполняем «ps axww | grep ucarp» на R1 и R2, видим по два экземпляра "/usr/sbin/ucarp -i eth..."
На тестовой рабочей станции запускаем «ping 8.8.8.8» (в Windows — с ключом "-t").
На R2 (при наличии доступа к физической консоли!): /etc/init.d/networking stop. Пинг на рабочей станции пропустит 3-4 ответа и возобновится.
«ip a» и «ip r» покажут, что маршрут и IP-адреса исчезли на R2 и появились на R1.
"arp 10.0.0.1" на рабочей станции покажет, что MAC-адрес шлюза изменился.
Спасибо за статью. Очень полезная штука – настраивал под Ubuntu (http://sysadm.pp.ua/linux/carp-ubuntu.html) кластер из трех серверов – до сих пор на проде работает. Не подскажите, если ли возможность(технология) для geodistributed redundent IP, может сталкивались ? Заранее спасибо.