Отказоустойчивое решение на базе ОС FreeBSD

Некоторое время назад я озадачился созданием отказоустойчивого решения для домашнего шлюза. Были рассмотрены различные варианты, включая введение в сеть роутера на RouterOS, но поскольку в этом случае требовалась установка еще одной железки, вариант в скором времени отпал, хотя работал более-менее корректно. Еще один минус был в том, что Mikrotik — коммерческий продукт, а поскольку я всегда был сторонником свободно распространяемого программного обеспечения, то это послужило еще одним поводом отказаться от такой схемы. Да и версия «сломанного» мтика была не очень стабильной.
Вобщем поиски продолжились и вскоре я нашел то, что искал — протокол CARP.
Данное решение заключается в следующем:
На каждом из серверов создается виртуальный интерфейс, которому выдается общий IP-адрес. Определяется приоритет каждого сервера, то есть последовательность, с которой один сервер будет подменять другого в случае отказа оного.
Далее дело было за малым, установить 2-ую фряху, поднять нужные сервисы, пересобрать ядро для поддержки CARP и создать виртуальные интерфейсы.

Последовательность действий для установки и настройки карпа:
1. Пересборка ядра с включением поддержки CARP:
Идем в /sys/i386/conf/ и создаем копию конфига ядра со своим произвольным названием, например CARPCONF.

cp /sys/i386/conf/GENERIC /sys/i386/conf/CARPCONF


После этого добавляем в конец нашего нового конфига строку:

device carp


Сохраняем, и запускаем пересборку:

make buildkernel KERNCONF=CARPCONF


Процесс займет некоторое время, в зависимости от мощности Вашего сервера. По окончании даем команду на установку нового ядра:

make installkernel KERNCONF=CARPCONF


2. Добавляем поддержку в sysct.conf:

echo 'net.inet.carp.preempt=1' >> /etc/sysctl.conf 
sysctl net.inet.carp.arpbalance=1


3. Перезагружаемся:

shutdown -r now 


Если процесс прошел нормально, то при вводе:

uname -a


Вы получите следующее:

FreeBSD gateway01.local.home 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Wed Jan 5 03:56:08 MSK 2011 root@gateway01.local.home:/usr/obj/usr/src/sys/<b>CARPCONF</b> i386 


Данную процедуру надо проводить на всех нодах, которые Вы хотите завязать друг на друга.
4. Установка и настройка интерфейсов:
Создаем виртуальные интерфейсы на каждой машине и присваиваем им адреса:

ifconfig carp0 create 
ifconfig carp0 vhid 1 pass %password% 10.10.0.5/24 advskew 0


На резервном:

ifconfig carp0 create 
ifconfig carp0 vhid 1 pass %password% 10.10.0.5/24 advskew 1


Значение vhid (1) — идентификатор группы.
Значение advskew — как раз тот самый _уникальный_ приоритет, по которым идет выбор следующего, в случае отказа предыдущего. Для основного сервера он будет равен 0.
Значение pass (%password%) — пароль для группы серверов. На всех нодах одной группы должен быть одинаковый.
Идем редактировать /etc/rc.conf:

echo 'cloned_interfaces="carp0"' >> /etc/rc.conf 
echo 'ifconfig_carp0="vhid 1 pass %password% 10.10.0.5/24 advskew 0"' >> /etc/rc.conf


Это будет наш основной сервер.
Далее для резервного прописываем:

echo 'cloned_interfaces="carp0"' >> /etc/rc.conf 
echo 'ifconfig_carp0="vhid 1 pass %password% 10.10.0.5/24 advskew 1"' >> /etc/rc.conf


Вот собственно и все. Для надежности можно перезагрузиться.

В связке с Failover DHCP и DNS-сервером (master\slave) на каждой машине, +цепочки clamav+HAVP+Squid+PF, работает это все прекрасно, и при падении любого из серверов, клиенты этого даже не чувствуют.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.