Краткое введение
Про сам протокол очень хорошо написанно в википедии. Кому интересны подробности и история — туда. В двух словах о нём можно сказать так: это протокол избыточности, который позволяет двум или более компьютерам в одной подсети иметь одновременно один и тот же 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 downucarp-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. в реальной жизни прийдётся также подумать и о синхронизации уровня приложений, сессий если это вебсервер, файлов в случае фтп и т.п.
