Согласно с раздел 6 из RFC 3074 кажется, что процесс выбора сервера балансировки нагрузки в ISC DHCP выглядит следующим образом:
- Клиент рассылает сообщение об обнаружении, которое либо напрямую достигает DHCP-серверов в активном-активном состоянии, либо ретранслируется на оба сервера (мы игнорируем возможность раздел 5.4 «HBA, предназначенный для сервера пересылки» для этого примера).
- Серверы присваивают идентификатор транзакции службы (STID) транзакции для внутреннего (?) использования. Аппаратный адрес клиента (
чадр
) хэшируется с использованием алгоритма хеширования Пирсона, который перебирает ключ (чадр
) и выполняет побитовое НЕ против предыдущей итерации и устанавливает результат как число, найденное по индексу этого значения в псевдослучайной таблице из 256 чисел от 1 до 255.
- Результат хэша, число от 1 до 255, сравнивается с HBA, что в случае DHCP-сервера ISC только с
расколоть
поле, определенное в конфигурации HA, представляет собой растровое изображение, в котором количество единиц, начинающихся слева (или справа, на вторичном сервере), соответствует значению расколоть
поле конфигурации. Например, расколоть
100 будет соответствовать HBA на первичном FF FF FF FF FF FF FF FF FF FF FF FF FF F0 00 00 00 00
а на вторичке как 00 00 00 00 00 00 00 00 00 00 00 00 0F FF FF FF FF FF ...
. Если HBA имеет бит 1 в данном индексе (из результата хеширования), то сервер передает клиенту сообщение с предложением DHCP.
Насколько я понимаю, пока HBA не пересекается между серверами, оба сервера не могут в конечном итоге решить обслуживать клиента.
TL;DR: алгоритм балансировки нагрузки DHCP гарантирует, что только один сервер DHCP будет отвечать данному клиенту.
Теперь мой вопрос: почему у меня есть клиент, который получает предложение с обоих серверов. На самом деле, я вижу, что количество предложений, отображаемых на моем интерфейсе маршрутизатора, почти вдвое превышает количество запросов, что означает, что это проблема не только одного моего клиента (но я не подтверждал это). Моя единственная мысль заключалась в том, что, поскольку Максимальное количество секунд балансировки нагрузки
поле в разделе HA моих серверов равно 3, возможно, этот клиент слишком медленный, чтобы принять его, и поэтому партнерский DHCP-сервер вмешивается.
При каких условиях два DHCP-сервера с балансировкой нагрузки будут предлагать клиенту адрес?
Вот где этот процесс происходит в ISC Kea:
Где принимается серверное решение:
https://gitlab.isc.org/isc-projects/kea/-/blob/master/src/hooks/dhcp/high_availability/query_filter.cc#L330
Функция, которая хэширует chaddr:
https://gitlab.isc.org/isc-projects/kea/-/blob/master/src/hooks/dhcp/high_availability/query_filter.cc#L384
Я не знаю, где находится код стандартного ISC DHCP.