Использование ucarp для построения систем высокой готовности во FreeBSD


Данная статья есть перевод файла README, идущего в комплекте исходных кодов ucarp.

Паре виртуальных хостов должны быть заданы :

- разделяемый виртуальный ("серый") ip-адрес, по которому будет "откликаться" один активный хост. Системам высокой готовности необходимо назначить этот адрес.

- реальный ip-адрес для каждого хоста.

- разделяемый идентификатор, представляющий собой число в диапазоне от 1 до 255, для каждого виртуального ip-адреса.

- для каждого хоста требуется задать временную базу и "перекос", которые будут информировать хосты, как часто хост будет рассылать уведомление о том, что еще является активным. По умолчанию база равна 1, "перекос" - 0, что означает, что уведомление будет рассылаться раз в секунду. Протокол весьма прост, крошечный пакет, посылаемый один раз в секунду, не окажет заметного влияния на сеть.

- разделяемый пароль (никогда не передающийся в виде незашифрованного текста по сети).

- сценарий для назначения виртуального адреса хосту в тот момент, когда он становится ведущим.

- сценарий для изъятия виртуального адреса у машины, перестающей быть ведущей.
Использование

Сервер по умолчанию устанавливается как /usr/local/sbin/ucarp. Управление осуществляется с помощью интерфейса командной строки. Для просмотра доступных опций выполните команду "/usr/local/sbin/ucarp -h".

Не вдаваясь в длительные технические дискуссии, рассмотрим пример.

Ваша компания использует внутренний почтовый релэй, чей ip-адрес - 10.1.1.252. Каждый пользователь сконфигурировал свой почтовый клиент таким образом, чтобы релэй функционировал всегда, и не требовалась переконфигурация в случае сбоя. Поэтому Вы устанавливаете два почтовых сервера с идентичными конфигурациями. Их реальные ip-адреса - 10.1.1.1 и 10.1.1.2.

Давайте посмотрим, как можно назначить одновременно этим двум машинам один и тот же адрес - 10.1.1.252 таким образом, чтобы при выходе одного сервера из строя второй использовал бы его конфигурацию.

Сперва мы пишем сценарий, назначающий сетевому интерфейсу ip-адрес. Сохраним этот файл как /etc/vip-up.sh:
#!/bin/sh
/sbin/ip addr add 10.1.1.252/24 dev eth0

Теперь - другой, изымающий этот адрес :
#!/bin/sh
/sbin/ip addr del 10.1.1.252/24 dev eth0

Разумеется, в сценариях можно написать все, что угодно. Например, Вы можете добавить маршруты, написать что-то в журнальные файлы или отправить почту. В конце концов, но не ограничиваясь этим, можно добавить возможность управления Вашими коммутаторами для сброса ARP-таблиц на них. некоторые пользователи сообщали об ускорении переключения хостов при сбросе таблиц коммутаторов.

Интерфейс передается в качестве параметра при вызове сценария, Вы можете заменить "eth0" на "$1" в предыдущем примере.

Не забудьте присвоить этим сценариям право на выполнение :
chmod +x /etc/vip-up.sh /etc/vip-down.sh

Теперь необходим идентификатор для виртуального адреса. Возьмем "42". Также необходим пароль. Используем "love".

На первой машине (с адресом 10.1.1.1) запускаем :
/usr/local/sbin/ucarp -v 42 -p love -a 10.1.1.252 -s 10.1.1.1 &

На машине с адресом 10.1.1.2 :
/usr/local/sbin/ucarp -v 42 -p love -a 10.1.1.252 -s 10.1.1.2 &

Вы можете видеть, что одна из этих машин становится ведущей, другая - вспомогательной. Сценарии выполняются при изменении.

Теперь отключите ведущую машину. Через несколько секунд другая машина станет ведущей. Изменяя базу, Вы можете выбрать предпочитаемую ведущую машину. Чем меньше величина, тем больше ее приоритет.

Пожалуйста, заметьте, что по умолчанию и если все в порядке, ведущая машина останется ведущей так долго, насколько это возможно. Если Вам необходимо, чтобы определенная машина становилась ведущей, даже если ведущая уже назначена:

- добавьте опцию "-preempt" (-P) для всех хостов

- используйте меньший перекос или меньшее значение базы для предпочитаемого хоста.

Опция "-deadratio" в основном определяет, как долго вспомогательная машина будет ждать уведомления от ведущей перед тем, как сочтет, что ведущая вышла из строя и попытается стать ведущей. В оригинале протокола значение равно 3. Это также является значением по умолчанию при отсутствии явно указанного значения при вызове ucarp.

Сообщения отправляются как на stderr/stdout, так и демону syslog (с использованием средства "daemon"). stderr/stdout не используются, если демон запущен в фоновом режиме (опция "-daemonize"). Средства (facilities) могут изменяться с помощью опции "-syslog". Используйте -syslog=none для выключения журналирования событий, если например, предпочитаете что-то похожее на multilog.

ucarp может выдавать сообщения на вашем национальном языке с помощью gettext/libintl. Если Вы хотите этого, загляните в каталог po/. Скопируйте файл ucarp.pot в файл с именем <имя>.pot и используйте Kbabel или Emacs для его обновления. Лучше всего использовать настройку вашей locale, а не UTF-8.

http://wiki.bsdportal.ru/doc:ucarp

Обновлено: 12.03.2015