ucarp — пакет, доступный в репозиториях Ubuntu, позволяющий обеспечивать гарантированную доступность IP адреса.
Отказоустойчивый IP адрес может быть нужен при использовании некоторых решений для балансировки нагрузки. Рассмотрим как выглядит система на примере кластера MySQL к которому обращается по адресу 192.168.3.10 веб-сервер. Хотя почти всегда лучше настраивать работу через localhost, такая конфигурация тоже встречается.
Допустим, что адрес 192.168.3.10 из приватного диапазона прописан в коде приложения и изменять его по какой-то причине нежелательно. При этом нужна кластеризация MySQL — решением может быть настройка отказоустойчивого IP адреса и использованием системной службы работающей по протоколу CARP (Common Address Redundancy Protocol).
Схема работы будет выглядеть следующим образом:
Один из серверов является мастером, два других не используются. Все машины при этом объединены в локальную сеть и имеют серые IP адреса. Каким-то образом обеспечивается консистентность данных в MySQL (одно из возможных решений — Galera Cluster, при этом не нужен никакой фронтэнд. распределяющий запросы).
Если становится недоступен мастер-хост его роль принимает другая машина.
Меняется аппаратный адрес второго уровня OSI — на третьем все выглядит точно также. Приложение и веб-сервер обращаются к 192.168.3.10 и получают ожидаемый ответ.
Если падает второй сервер роль вновь переходит к другой машине, которая становится MASTER хостом, меняется также только MAC.
Установка и настройка ucarp
Устанавливается пакет из стандартного репозитория, он нужен на каждом сервере, который участвует в процессе
apt-get install ucarp
Настройка не представляет никакой сложности, всю информацию можно найти в README пакета
less /usr/share/doc/ucarp/README
/etc/network/interfaces для каждого хоста нужно скорректировать по образцу (со стороны сетевых настроек для VDS нужен brige):
auto eth1
iface eth1 inet static
address 192.168.3.1
netmask 255.255.255.0
# ID of this machine in cluster
ucarp-vid 3
# Shared between hosts IP
ucarp-vip 192.168.3.10
# Password shared between CARP hosts
ucarp-password jYhems8i3jd7
#Can be increased to lessen the apportunity to become Master for certain host
ucarp-advskew 1
#Frequency of sending notificatio to other hosts
ucarp-advbase 1
#Status on start
ucarp-master no
iface eth0:ucarp inet static
address 192.168.3.1
netmask 255.255.255.0
Потом опускается и вновь поднимается интерфейс eth0 — также можно перезагрузить сервер
ifdown eth1 && ifup eth1
Просмотрев syslog можно увидеть, что служба запущена.
tail -500 /var/log/syslog | grep ucarp
В выводе grep будет статус BACKUP для двух машин и статус MASTER для одной.
На этом настройка завершена. Теперь в случае недоступности MASTER хоста его место займет один из BACKUP хостов. При этом сохраняется IP адрес (меняется только MAC). Веб-сервер, для которого весь кластер невидим, и который обращается к одному IP адресу, и приложение не заметят того, что конфигурация изменилась.
В кластер с отказоустойчивым IP адресом можно включить от двух машин, количество их не ограничено и определяется архитектурой проекта. Работать таким образом можно не только с MySQL, но и с бэкенд/фронтэнд серверами.
Часто так кластеризуется HAPROXY и Nginx.