среда, 5 января 2011 г.

Отказоустойчивое решение на базе ОС 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/CARPCONF  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, работает это все прекрасно, и при падении любого из серверов, клиенты этого даже не чувствуют.

Читать дальше...

Комментариев нет:

Отправить комментарий