Отказоустойчивый DHCP кластер на Linux

Всем привет!!!

Я хотел бы поделиться своим опытом настройки отказоустойчивого DHCP кластера, который не только резервирует два сервера, но и делит нагрузку между ними.

Для начала нужно разобраться со схемой работы DHCP в кластере. Имеем два сервера DHCP1 и DHCP2. Они подключены к роутеру или коммутатору, в зависимости от масштаба вашей клиентской сети. Какой тип оборудования не имеет никакого значения. Опционально можно сделать дополнительное подключение между серверами для внутреннего трафика. Так будет безопаснее. Это же опциональное подключение можно так же выполнить не только напрямую, но и через коммутатор или роутер. Кластер передает данные между серверами по протоколу TCP поэтому коммутация или маршрутизация роли не имеет.

На всех серверах нужно создать local_network.conf, в котором прописываются все локальные сети вашего сервера. Если вы настраивали dhcp то знаете, что это необходимо, что бы сервер слушал запросы клиентов на этих интерфейсах.

subnet 10.0.0.0 netmask 255.255.255.248 {
        }

subnet 10.43.99.0 netmask 255.255.255.248 {
        }

В файле ngn-sip-network.conf, который так же должен быть одинаковым на обоих серверах, прописываются параметры для клиентских сетей. Это то, что мы будем выдавать клиентам. Что параметр next-server говорит с какой сети пришел запрос, соответственно в эту сеть будет отдан ответ. Ну что бы у вас не получилось, что сеть такая, а клиенту выдался IP адрес из другой сети. Для этого так же задается дополнительный параметр на маршрутизаторе, если у вас роутер между сервером и клиентом. На оборудовании Cisco это параметр ip helper 10.0.0.4 и ip helper 10.0.0.5. В другом других вендоров этот параметр может отличаться, но он точно есть. Если у вас нет маршрутизатором, а применяется коммутация от сервера до клиента, то тут вообще не стоит переживать. Но для больших сетей коммутация опасна!!!!

shared-network PETR-MG-36-1 {
        subnet 10.43.100.0 netmask 255.255.252.0 {
                pool {
                        failover peer "NGN-SIP";
                        deny dynamic bootp clients;
                        range 10.43.100.2 10.43.103.254;
                        }
                option subnet-mask 255.255.252.0;
                option ntp-servers 10.43.100.1;
                next-server 10.43.100.1;
                option routers 10.43.100.1;
                }
}

shared-network PETR-MG-36-2 {
        subnet 10.43.104.0 netmask 255.255.252.0 {
                pool {
                        failover peer "NGN-SIP";
                        deny dynamic bootp clients;
                        range 10.43.104.2 10.43.107.254;
                        }
                option subnet-mask 255.255.252.0;
                option ntp-servers 10.43.104.1;
                next-server 10.43.104.1;
                option routers 10.43.104.1;
                }
}

Основная часть, которая прописывается на обоих серверах в файл dhcpd.conf. Если вы будите менять какие либо общие параметры на серверах, то учтите, что они должны быть строго одинаковыми. Иначе могут быть проблемы.

ddns-update-style none;
ddns-updates off;

min-lease-time 43200;     # 12h
default-lease-time 86400; # 24h
max-lease-time 2592000;   # 30D

one-lease-per-client true;

ping-check true;
ping-timeout 1;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

if exists agent.remote-id
{
        log ( info, concat( "DHCPAGENT for lease of ", binary-to-ascii (10, 8, ".", leased-address), " on agent ",
        binary-to-ascii(16, 8, ":", substring( option agent.remote-id, 2, 6))));
}

omapi-port 7911;
omapi-key omapi_key;

key omapi_key {
     algorithm hmac-md5;
     secret Ofakekeyfakekeyfakekey==;
}

include "/etc/dhcp/local_network.conf";
include "/etc/dhcp/ngn-sip-network.conf";

На пером сервере DHCP1 в файл dhcpd.conf добавляем следующее:


failover peer "NGN-SIP" {
  primary;
  address 10.43.99.4;
  port 519;
  peer address 10.43.99.5;
  peer port 520;
  max-response-delay 60;
  max-unacked-updates 10;
  mclt 3600;
  split 128;
  load balance max seconds 3;
  auto-partner-down 86400;
}

На втором сервере DHCP2 в файл dhcpd.conf добавляем следующее:

failover peer "NGN-SIP" {
  secondary;
  address 10.43.99.5;
  port 520;
  peer address 10.43.99.4;
  peer port 519;
  max-response-delay 60;
  max-unacked-updates 10;
  mclt 3600;
  split 128;
  load balance max seconds 3;
  auto-partner-down 86400;
}

Таким образом активируется функционал кластера DHCP.

Работает кластер следующим образом. Запрос DHCPDISCOVER приходит от клиента на оба сервера, но ответ DHCPOFFER будет отдан только одним сервером. Второй будет молчать. Затем клиент пришлет опять запрос DHCPREQUEST опять на оба сервера, а окончательный ответ DHCPACK опять даст только один сервер.

Следующий клиент будут получать ответы от второго сервера. Таким образом сервера делят нагрузку. Каждый сервер делит пополам разрешенный пул адресов из файла ngn-sip-network.conf и обслуживает только своих клиентов. Но оба dhcp сервера обмениваются информацией в режиме реального времени, о том, кто кому и что выдал. То есть в базе dhcp будет находиться вся информация всех клиентов.

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

После включения в работу первого исправного сервера после истечения 86400 секунд, второй начинает отдавать половину пула первому, но не сразу, а по мере запросов клиентов.

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

Если возникнут вопросы, то пишите в комментариях, постараюсь ответить.

Добавить комментарий

два + двенадцать =