Краткое введение
Про сам протокол очень хорошо написанно в википедии. Кому интересны подробности и история — туда. В двух словах о нём можно сказать так: это протокол избыточности, который позволяет двум или более компьютерам в одной подсети иметь одновременно один и тот же IP адрес, при этом возможна настройка этой группы компьютеров как взаимозаменяемые (главный компьютер отключился/сломался – вместо него сразу же принимается за работу другой, у которого приоритет выше) и так по кругу, обеспечивая тем самым почти 100% доступность служб. СARP является «родным» для OpenBSD, FreeBSD и NetBSD. На линуксе с ядром выше 2.4 доступен через ucarp.
Немного сумбурно, но в дальнейшем, надеюсь, ситуация прояснится.
Окружение
Для данного описания мною использовался Debian GNU/Linux 4.0 под VMWare ESX. Тестировать же будем сервис вебсервера Apache.
Начало. Инсталяция
Первым делом ставим ucarp. Под дебианом все предельно просто:
apt-get install ucarp
Инсталяция из сорсов тоже не должна вызвать особых сложностей
wget download.pureftpd.org/pub/ucarp/ucarp-1.2.tar.bz2
tar jxf ucarp-1.2.tar.bz2
cd ucarp-1.2
./configure
make
make install
Заодно ставим и вебсервер
apt-get install apache2
Конфигурация UCARP
Основная часть конфигурации общая как для мастера так и для слейва (отличия расмотрим отдельно)
Прежде всего создадим .conf файл в котором пропишем параметры для старта ucarp и конфигурации виртуальных интерфейсов
mkdir /etc/ucarp
touch /etc/ucarp/ucarp.conf
/etc/ucarp/ucarp.conf:
# Интерфейс на котором будет запущен ucarp
UCARP_INTERFACE=eth0
# Виртуальный интерфейс которому будет присвоен виртуальный ip кластера
UCARP_IF_ALIAS=eth0:0
# Действительный ip интерфейса. Естественно для каждого узла он будет своим.
UCARP_SRCIP=172.16.0.11
# CARP ID виртуального сервера
UCARP_VHID=1
# Интервал для сравнения узлов, в секундах.
# Чем он меньше, тем выше приоритет слейва
UCARP_ADVBASE=1
# Пароль дла hmac шифрования соединения (посредством sha1).
UCARP_PASS=geheim
# Виртуальный ip по которому будет доступен кластер
UCARP_ADDR=172.16.0.1
# Маска нашего сегмента сети
UCARP_MASK=255.255.0.0
# Путь к скриптам которые будут запущены при активации/деактивации узла
UCARP_UPSCRIPT=/etc/ucarp/ucarp-up.sh
UCARP_DOWNSCRIPT=/etc/ucarp/ucarp-down.sh
Теперь пришло время написать скрипты которые будут поднимать виртуальный интерфейс когда управление(статус мастера) будет переходить к текущему хосту и наоборот.
cd /etc/ucarp
touch ./ucarp-up.sh
touch ./ucarp-down.sh
/etc/ucarp/ucarp-up.sh
#!/bin/bash
source /etc/ucarp/ucarp.conf
ifconfig $UCARP_IF_ALIAS $UCARP_ADDR netmask $UCARP_NETMASK
/etc/ucarp/ucarp-down.sh
#!/bin/bash
source /etc/ucarp/ucarp.conf
ifconfig $UCARP_IF_ALIAS down
ucarp-up.sh будет запущен при активации узла. Параметры для алиаса, виртуального интерфейса, адреса и маски берутся из файла ucarp.conf. Как только узел теряет статус мастера, запускается ucarp-down.sh и виртуальный интерфейс отключается.
Следующим шагом создаём скрипт для запуска самого UCARP (альтернативно можно создать инит-скрипт). Скрипт назовём start.sh и положим в /etc/ucarp.
source /etc/ucarp/ucarp.conf
ucarp /
--interface=$UCARP_INTERFACE /
--srcip=$UCARP_SRCIP /
--vhid=$UCARP_VHID /
--pass=$UCARP_PASS /
--advbase=$UCARP_ADVBASE /
--preempt /
--addr=$UCARP_ADDR /
--daemonize /
--upscript=$UCARP_UPSCRIPT /
--downscript=$UCARP_DOWNSCRIPT
Первая строчка подключает наш конфиг ucarp.conf, все переменные берутся от туда. Опция --daemonize запускает UCARP в режиме демона. Важной является опция --preemt которая будет присутствовать только для мастера. Последним шагом делаем наши скрипты запускаемыми из под рута
chmod 0700 /etc/ucarp/*.sh
Что бы начать тестирование я склонировал MasterVm и внёс изменения в следующие параметры
— ip адресс
— Hostname
— UCARP_SRCIP в /etc/ucarp/ucarp.conf
также в файле /var/www/apache2-default/index.html указал название сервера, чтобы знать на какой узел попадаю.
Поехали
Запускаем мастера и слейва с помощью скрипта /etc/ucarp/start.sh. Так как мы указали параметер --daemonize никаких сообщений выведено не будет. Через ifconfig на мастере видем запущеный виртуальный интерфейс:
eth0 Link encap:Ethernet HWaddr 00:22:15:6a:80:d8 inet addr:172.16.0.11 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::250:56ff:fe82:352c/64 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:402618 errors:0 dropped:0 overruns:0 frame:0 TX packets:9019 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:34064624 (32.4 MiB) TX bytes:623570 (608.9 KiB) Interrupt:177 eth0:0 Link encap:Ethernet HWaddr 00:22:15:6a:80:d8 inet addr:172.16.0.1 Bcast:172.20.255.255 Maske:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177
На слейве никакого виртуального интерфейса, естественно нет, он будет запущен только при передачи статуса мастера. Статус узла ucap пишет в /var/log/syslog. Выглядит это приблизительно так:
На мастере:
Nov 26 03:49:17 vmdebian01 ucarp[2327]: [WARNING] Switching to state: MASTER
Nov 26 03:49:17 vmdebian01 ucarp[2327]: [WARNING] Spawning [/etc/ucarp/ucarp-up.sh eth0]
На слейве
Nov 26 03:50:24 vmdebian02 ucarp[3802]: [WARNING] Switching to state: BACKUP
Nov 26 03:50:24 vmdebian02 ucarp[3802]: [WARNING] Spawning [/etc/ucarp/ucarp-down.sh eth0]
При обращении к виртуальному ip оказываемся на сервере номер 1 (запущеному как мастер). При отключении мастера от сети, слейв тут же меняет свой статус и запускает интерфейс который доступен по ip/mac кластера. Перезагрузка страницы в броузере показывает, что мы уже на сервере номер 2. При подключении мастера всё возвращается на свои места.
Итог
конечно всё вышесказанное является упрощёной версией конфигурации ucarp. в реальной жизни прийдётся также подумать и о синхронизации уровня приложений, сессий если это вебсервер, файлов в случае фтп и т.п.