Имя
carp -- Common Address Redundancy Protocol
Применение
device carp
Описание
carp представляет собой псевдо-устройство для реализации
и управления протоколом CARP. CARP позволяет нескольким компьютерам, находящимся в одной
сети, использовать один IP адрес. Главная цель этого протокола состоит в обеспечении
доступности этого IP адреса, но в некоторых конфигурациях 
carp существует 
возможность реализации функциональных возможностей балансировщика нагрузки.
Интерфейс 
carp может быть создан командой 
ifconfig carpN create
в процессе работы или с помощью соответствующей записи в 
/etc/rc.conf.
Для использования 
carp, системный администратор как минимум должен сконфигурировать
идентификатор виртуального хоста и IP адрес виртуального хоста на каждой машине, входящей в 
виртуальную группу. Дополнительные параметры, которые могут быть установлены на каждом интерфейсе:
advbase и 
advskew, которые используются для управления
дискретностью посылок обьявлений главным хостом группы и 
pass, служащий для
аутентификации обьявлений 
carp.
В заключение, 
carpdev используется для определения интерфейса, создаваемого
с помощью 
carp. 
Если интерфейс не определен, ядро пытается самостоятельно установить 
carpdev 
путём поиска интерфейса, находящегося в той же сети, что и IP адрес carp интерфейса.
Такие конфигурации могут быть реализованы с помощью ifconfig(8) или SIOCSVH ioctl(2). 
Дополнительно, некоторые глобальные параметры могут быть установлены с помощью sysctl(8):
- 
net.inet.carp.allow - принимать входящие пакеты carp. Установлено по умолчанию.
- 
net.inet.carp.preempt - позволяет виртуальным хостам резервировать друг друга. Эта функция используется для 
обеспечения отказоустойчивости в группе. Когда эта опция установлена и один из физических интерфейсов на 
котором выполняется carp теряет связь, advskew устанавливает значение 240 
на всех  carp интерфейсах. Хост, у которого advskew меньше назначается главным в группе 
и на него направляются пакеты до отказа интерфейса. Смотри также первй пример.
По умолчанию выключено.
- 
net.inet.carp.log - значение 0 отключает ведение журнального файла. Значение 1 фиксирует некорректные
пакеты carp и состояние интерфейса. Значение 2 включает журналирование смен состояния carp интерфейсов. 
По умолчанию 1.
- 
net.inet.carp.arpbalance - балансировка локального трафика используя ARP. по умолчанию выключено.
Примеры
Для систем сетевой защиты и маршрутизаторов c большим количеством сетевых интерфейсов необходимо для
обеспечения отказоустойчивости реализовать 
carp на всех интерфейсах. Обеспечиваем резервирование, 
устанавливая на маршрутизаторах A и B:
sysctl net.inet.carp.preempt=1
Предположим, что маршрутизатор А является главным(master) и его сетевые
интерфейсы сконфигурированы на сети 192.168.1.x/24 и 192.168.2.y/24 
соответственно. В результате будем иметь настройки, обеспечивающие преимущество маршрутизатора А:
ifconfig carp0 create
	   ifconfig carp0 vhid 1 pass mekmitasdigoat 192.168.1.1 \
		   255.255.255.0
	   ifconfig carp1 create
	   ifconfig carp1 vhid 2 pass mekmitasdigoat 192.168.2.1 \
		   255.255.255.0
Настройки для маршрутизатора В аналогичны, за исключением более высокого 
advskew:
ifconfig carp0 create
	   ifconfig carp0 vhid 1 advskew 100 pass mekmitasdigoat \
		   192.168.1.1 255.255.255.0
	   ifconfig carp1 create
	   ifconfig carp1 vhid 2 advskew 100 pass mekmitasdigoat \
		   192.168.2.1 255.255.255.0
В результате того, что net.inet.carp.preempt = 1, когда один из сетевых интерфейсов дает сбой,
advskew устанавливает значение 240 на всех  
carp интерфейсах.
Это заставит включиться в работу маршрутизатор В. 
Для установки балансировки нагрузки через ARP на виртуальных хостах необходимо сконфигурировать
один виртуальный хост для каждой машины, отвечающей на запросы и таким образом обрабатывающей трафик.
В следующем примере установлено два виртуальных хоста для обеспечения отказоустойчивости и балансировки
нагрузки для IP адреса 192.168.1.10.
Сперва настроим интерфейс 
carp на машине А. параметр 
advskew, установленный в 
100 на втором хосте, будет указывать на увеличенный интервал отсылки обьявлений:
ifconfig carp0 create
	   ifconfig carp0 vhid 1 pass mekmitasdigoat 192.168.1.10 \
		   255.255.255.0
	   ifconfig carp1 create
	   ifconfig carp1 vhid 2 advskew 100 pass mekmitasdigoat \
		   192.168.1.10 255.255.255.0
Конфигурация хоста В идентична вышеприведенной, за исключением зеркальной смены 
advskew:
ifconfig carp0 create
	   ifconfig carp0 vhid 1 advskew 100 pass mekmitasdigoat \
		   192.168.1.10 255.255.255.0
	   ifconfig carp1 create
	   ifconfig carp1 vhid 2 pass mekmitasdigoat 192.168.1.10 \
		   255.255.255.0
В заключение, включаем балансировку ARP:
sysctl net.inet.carp.arpbalance=1
Когда хосты принимают ARP запрос для 192.168.1.10 используется исходящий IP адрес для
определения, какой из хостов будет отвечать. В этом случае, выбранный главным хостом
для виртуальной группы ответит, а второй проигнорирует запрос.
В этом варианте, связанные системы примут различные ARP ответы и последующий трафик будет балансироватся
между хостами. В случае отказа одного из хостов, оставшийся перехватит виртуальный MAC адрес и
будет один отвечать на ARP запросы.
Внимание:
Балансировка ARP работает только в локальном сегменте. Такая балансировка не возможна при использовании
промежуточного маршрутизатора, так как маршрутизатор будет направлять данные на один и тот же хост.
Смотри также
inet(4),
rc.conf(5),
ifconfig(8),
sysctl(8).
История
Устройство  
carp впервые появилось в  OpenBSD 3.5. Впоследствии 
carp 
было импортировано в FreeBSD 5.4.