Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сводка
Эта статья поможет вам диагностировать и устранить проблемы в ситуациях, когда Azure Load Balancer направляет весь или большую часть трафика на один внутренний экземпляр либо закрепляет клиентов за одним и тем же экземпляром.
Azure Load Balancer распределяет потоки с использованием хеш-функции, а не по методу round robin. Таким образом, один клиент или один NAT либо прокси-сервер, находящийся перед системой, может направить весь трафик на один внутренний сервер. Неравномерное распределение обусловлено следующими основными причинами:
- Ожидание заказчика, что при используемом по умолчанию хешировании по 5-кортежу будет применяться round robin для каждого запроса, нереалистично.
- Низкая энтропия IP-адреса источника на стороне вышестоящего NAT или прокси-сервера приводит к тому, что множество клиентов используют один и тот же IP-адрес источника.
- Сохранение сеанса по IP-адресу источника (2-элементный или 3-элементный кортеж) настраивается, если привязка сеанса не требуется.
- Это правило применяется к протоколу, пакеты которого используют один и тот же кортеж (DHCP-ретрансляция, syslog, ловушки SNMP) и поэтому не подходит для балансировщика нагрузки на основе хэширования потока.
Симптомы
Вы можете столкнуться с одним или несколькими из следующих симптомов:
- Один серверный экземпляр показывает почти 100 % полученных байтов или потоков в Microsoft Viva Insights, тогда как у остальных экземпляров этот показатель близок к нулю.
- Определенный IP-адрес клиента, подсеть или офис всегда направляется на один и тот же бэкенд даже после перезапуска бэкенда.
- Добавление дополнительных экземпляров бэкенда не уменьшает нагрузку на перегруженный экземпляр.
- Во время тестирования распределение трафика кажется равномерным, но в рабочей среде оно нарушается после того, как перед балансировщиком нагрузки устанавливают брандмауэр, сетевое виртуальное устройство (NVA) или прокси-сервер.
- Трафик DHCP, syslog или SNMP trap-сообщений накапливается на одном внутреннем сервере. Резервные серверы ретранслятора не получают пакеты.
- Проверки работоспособности помечают все внутренние серверы как
Up, хотя фактически работает только один из них.
Необходимые условия
Чтобы устранить неполадки с неравномерной распределением трафика на Load Balancer, вам потребуется следующее:
-
Необходимые разрешения:
Network Contributorроль в группе ресурсов балансировщика нагрузки (или эквивалентная роль, предоставляющая разрешенияMicrosoft.Network/loadBalancers/read,Microsoft.Network/loadBalancers/writeиMicrosoft.Insights/metrics/read) - Средства: Azure CLI 2.x или агент ИИ, имеющий доступ к Azure CLI
- Обязательные переменные и примеры этих переменных, как показано в следующей таблице
| Variable | Description | Пример |
|---|---|---|
{SUBSCRIPTION_ID} |
идентификатор подписки Azure, в которой размещен балансировщик нагрузки | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
{RESOURCE_GROUP} |
Группа ресурсов, содержащая подсистему балансировки нагрузки | myResourceGroup |
{RESOURCE_NAME} |
Имя ресурса подсистемы балансировки нагрузки | myLoadBalancer |
{RULE_NAME} |
Правило балансировки нагрузки на проверке (из Шаг 1) | httpRule |
Tip
Каждый скрипт, предоставленный в следующих разделах, запрашивает необходимые значения в интерактивном режиме. Чтобы открыть Cloud Shell и ответить на запросы, нажмите кнопку "Попробовать". Значения кэшируются для этого сеанса. Поэтому вы вводите их только один раз.
Этапы диагностики
Note
Эти действия предназначены исключительно для ознакомления ("только для чтения"). Они не вносят изменения в среду.
Шаг 1
Проверьте каждое правило балансировки нагрузки в ресурсе, включая его текущий режим loadDistribution, транспортный протокол, внешние и внутренние порты, время ожидания простоя и параметр плавающего IP-адреса. Эта информация является одним из наиболее важных источников для понимания потоков хэшей подсистемы балансировки нагрузки.
Выполните следующие команды в Azure CLI:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
az network lb rule list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, protocol:protocol, frontendPort:frontendPort, backendPort:backendPort, loadDistribution:loadDistribution, floatingIP:enableFloatingIP, idleTimeoutInMinutes:idleTimeoutInMinutes}" \
--output table
Интерпретация результатов
| Наблюдение | Значение | Дальнейшие действия |
|---|---|---|
loadDistribution — это SourceIP или SourceIPProtocol в затронутом правиле. |
Сохраняемость сеанса включена. Все потоки от клиента (или от клиента и протокола) по замыслу хешируются на один и тот же бэкенд. | Выполните Шаг 2, чтобы проверить, действительно ли требуется постоянная привязка сеанса. |
loadDistribution — это Default, а protocol — это Udp с frontendPort в 67, 68, 514, 162 или 161 |
Правило применяется к протоколу, пакеты которого используют тот же кортеж. Таким образом, хэш 5 кортежей дегенерирует до одного контейнера. | Выполните шаг 4. |
loadDistribution — это Default, а protocol — это Tcp или Udp через обычный порт приложения. |
Используется распределение на основе хеширования по 5‑кортежам. Необходимо измерить, действительно ли распределение асимметрично. | Выполните шаг 2. |
Правило отсутствует или ResourceNotFound. |
Имя подписки, группы ресурсов или балансировщика нагрузки указано неверно. | Повторно введите переменные и выполните шаг 1. |
Запишите имя правила как $RULE_NAME для последующих шагов.
Шаг 2
Проверьте состав серверного пула и фактическое распределение байтов по каждому серверу за последний час. Этот шаг отличает воспринимаемую неравномерность от измеренной неравномерности. Он формирует сигнал для каждого бэкенда, от которого впоследствии зависят решения о маршрутизации.
Выполните следующие команды в Azure CLI:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
LB_ID=$(az network lb show \
--name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "id" --output tsv)
echo "Backend pool members:"
az network lb address-pool list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{pool:name, backends:loadBalancerBackendAddresses[].{ip:ipAddress, network adapter:networkInterfaceIPConfiguration.id}}" \
--output json
echo ""
echo "Per-backend network adapter byte rate (last 60 minutes):"
network adapter_IDS=$(az network lb address-pool list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].loadBalancerBackendAddresses[].networkInterfaceIPConfiguration.id" -o tsv \
| sed -E 's|/ipConfigurations/.*||' | sort -u)
for network adapter in $network adapter_IDS; do
echo "--- $(basename $network adapter) ---"
az monitor metrics list \
--resource "$network adapter" \
--metrics "BytesReceivedRate" "BytesSentRate" \
--aggregation Total \
--interval PT1M \
--output table
done
Note
В метрике ByteCount Azure Load Balancer (цен. категория "Стандартный") используются только измерения FrontendIPAddress, FrontendPort, Direction и Protocol. Он не выводит измерение BackendIPAddress. Необходимо прочитать распределение байтов серверной части из BytesReceivedRate и BytesSentRate значений для каждого сетевого адаптера серверной части (также известного как сетевая карта или сетевой адаптер).
Интерпретация результатов
| Наблюдение | Значение | Дальнейшие действия |
|---|---|---|
loadBalancerBackendAddresses имеет только одну запись. |
Существует только один бэкенд. Распределение не может быть неровным. | Добавьте внутренние серверы, а не сбой балансировки нагрузки. |
Суммарный показатель одного сетевого адаптера серверной части BytesReceivedRate составляет не менее 80 % от общей суммы по всем сетевым адаптерам серверной части, а у остальных показатель близок к нулю. |
Распределение измеримо искажено. Причина — либо сохранение на этапе Step 1, либо низкая входная энтропия на этапе Step 3. | Если показанSourceIP/SourceIPProtocol, выполните разрешение C. В противном случае выполните шаг 3. |
Суммарные значения для сетевых адаптеров серверной части BytesReceivedRate находятся примерно в одном и том же порядке величины (ни на одну серверную часть не приходится более 60 % от общего объема байтов). |
Распределение укладывается в нормальные пределы для 5-кортежного хэша. Неравномерное восприятие — это ожидание по принципу round-robin. | Выполните вариант A. |
| Все метрики сетевого адаптера возвращают ноль или нет строк. | На серверах не зафиксирован трафик за этот интервал. Сгенерируйте трафик и выполните повторную проверку или убедитесь, что сетевые адаптеры подключены, а проверка правила показывает Up. |
Повторно выполните шаг 2 во время известного окна трафика. |
Укажите доминирующий сетевой адаптер на сервере, его процентную долю и были ли байты сгенерированы одним или несколькими IP-адресами клиентов-источников. Чтобы перейти к шагу 3, необходимо знать количество отдельных исходных IP-адресов.
Шаг 3
Проверьте, не находятся ли перед балансировщиком нагрузки NAT, брандмауэр, NVA или обратный прокси-сервер и не объединяют ли они множество IP-адресов клиентов в один исходный IP-адрес. Хэш 5-кортежа для одного исходного IP-адреса и одного IP-адреса назначения или порта назначения дает не более одного внутреннего сервера на каждый исходный порт. Стабильный клиент часто повторно использует один исходный порт. Эта ситуация означает, что хеш фактически привязывается к одному бэкенду.
Выполните следующие команды в Azure CLI:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
LB_ID=$(az network lb show \
--name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "id" --output tsv)
echo "Frontend configuration (public vs internal, attached IP):"
az network lb frontend-ip list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, privateIP:privateIPAddress, publicIPId:publicIPAddress.id, subnetId:subnet.id}" \
--output table
echo ""
echo "Packet count and SYN count on the load balancer (last 60 minutes):"
az monitor metrics list \
--resource "$LB_ID" \
--metrics PacketCount SYNCount \
--aggregation Total \
--interval PT1M \
--output table
Затем, исходя из самого сетевого пути, ответьте на следующие вопросы, ничего не изменяя:
- Является ли балансировщик нагрузки внутренним (с частным IP-адресом в
privateIPAddress)? Достигнут ли он через брандмауэр концентратора, Брандмауэр Azure, NVA или сторонний прокси-сервер? Если да, каждый клиент, проходящий через этот переход, попадает на балансировщик нагрузки с IP-адресом источника этого перехода, а не с исходным IP-адресом клиента. - Общедоступна ли подсистема балансировки нагрузки, но опубликована через Azure Front Door, сеть доставки содержимого (CDN), шлюз приложений или Брандмауэр веб-приложений Azure (WAF)? Если да, то внешний сервис будет исходным IP-адресом, который видит балансировщик нагрузки.
- Если перед этой серверной частью развернут Брандмауэр Azure, проверьте его
SNATPortUtilizationили обработку IP-адреса источника, чтобы убедиться, что он выполняет SNAT в сторону этой серверной части.
Интерпретация результатов
| Наблюдение | Значение | Дальнейшие действия |
|---|---|---|
| Интерфейсный сетевой адаптер, брандмауэр, NVA, Front Door или обратный прокси-сервер находится в пути, а шаг 2 показывает, что один внутренний сетевой адаптер принимает больше или равен 80 процентам байтов. | Низкая энтропия исходных IP-адресов. Входные данные для хеша фактически постоянны, поэтому хеш по 5-кортежу вырождается. | Выполните разрешение B. |
| Внешний интерфейс доступен напрямую со множества различных IP-адресов клиентов (без NAT перед ним или прокси-сервера), а Шаг 2 показывает не менее 80 % на одном бэкенде. | Распределение искажается, несмотря на высокую энтропию. Повторно проверьте шаг 1, чтобы убедиться в сохранении SourceIP/SourceIPProtocol. Если Default, это измерение. Проблема в окне или форме нагрузки, а не в хэшировании. |
Выполните вариант A. |
| Интерфейс прямой и шаг 2 показывает примерно равномерное распределение. | Нет действия. Хэш 5-кортежа работает в соответствии с проектом. | Выполните операцию A исключительно для документирования. |
Шаг 1 уже помечен SourceIP или SourceIPProtocol. |
Сохраняемость переопределяет анализ энтропии. | Выполните операцию C. |
Шаг 4
Проверьте, обслуживает ли правило протокол, пакеты которого нельзя осмысленно распределять по хэшу потока. DHCP-ретрансляция (User Datagram Protocol (UDP), порт 67 или 68), syslog (UDP 514) и ловушки SNMP (UDP 162) обычно имеют один источник на каждый агент ретрансляции, который отправляет данные на один порт назначения. Таким образом, 5 кортежей свернут в один контейнер независимо от того, что делается на уровне подсистемы балансировки нагрузки.
Выполните следующие команды в Azure CLI:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
az network lb rule list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[?protocol=='Udp'].{name:name, frontendPort:frontendPort, backendPort:backendPort, loadDistribution:loadDistribution, floatingIP:enableFloatingIP}" \
--output table
Интерпретация результатов
| Наблюдение | Значение | Дальнейшие действия |
|---|---|---|
Правило с protocol: Udp и frontendPort из 67, 68, 514, 162 или 161. |
Протокол не подходит для балансировки нагрузки на основе хеша потока. Подсистема балансировки нагрузки не может существенно распределять эти пакеты независимо от режима распространения. | Выполните Resolution D. |
| Ни одно правило UDP не соответствует этим портам, но это правило используется для другого протокола, в котором все пакеты используют один и тот же 5-элементный кортеж (например, один туннель Generic Routing Encapsulation (GRE)). | Протокол не подходит для хэш-распределения. | Выполните Resolution D. |
| Все правила UDP служат портам приложений с множеством параллельных кортежей клиентов. | Этот шаг не применяется. | Перейдите на карту принятия решений. |
Карта принятия решений
Используйте следующую таблицу карты принятия решений, чтобы определить соответствующие действия на основе результатов диагностики.
| Результат диагностики | Дальнейшие действия |
|---|---|
Шаг 1 показывает, что loadDistribution равен SourceIP или SourceIPProtocol, и закрепление сеанса не требуется. |
Выполните операцию C. |
| Шаг 2 показывает, что 80 % или более байтов приходится на один внутренний сервер, а Шаг 3 подтверждает наличие в пути прохождения трафика NAT перед клиентом, брандмауэра, NVA, Front Door или обратного прокси-сервера. | Выполните разрешение B. |
| Шаг 2 демонстрирует примерно равномерное распределение (ни на один бэкенд не приходится существенно больше 60 % байтов), но вы ожидали поведения round robin для каждого запроса. | Выполните вариант A. |
| На шаге 4 показано правило UDP для порта 67, 68, 514, 162 или 161 (или другой протокол с одним кортежем) | Выполните Resolution D. |
| Все диагностические проверки проходят успешно, а распределение по-прежнему выглядит неравномерным. | Отправьте запрос поддержка Azure и вложите выходные данные метрик шага 2 и оценку энтропии шага 3. |
Разрешение A
Вы сравниваете балансировщик нагрузки с устройством с циклическим распределением. Load Balancer — это балансировщик нагрузки без сохранения состояния, работающий на основе потоков. Для каждого потока вычисляется хеш по 5-элементному кортежу (исходный IP-адрес, исходный порт, IP-адрес назначения, порт назначения и протокол), чтобы выбрать бэкенд-сервер, после чего этот поток закрепляется за ним на всё время жизни потока.
Выполните следующие команды в Azure CLI.
- Убедитесь, что правило находится в
Defaultдистрибутиве (5 кортежей) (самый удобный для распространения режим):
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$RULE_NAME" ] && read -rp "Rule Name: " RULE_NAME
az network lb rule show \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$RULE_NAME" \
--query "{name:name, loadDistribution:loadDistribution, protocol:protocol}" \
--output json
Если loadDistribution это уже Defaultтак, изменение не требуется. Перейдите к следующему шагу.
- Если для правила задано значение
SourceIPилиSourceIPProtocol, но закрепление сеанса на уровне приложения не требуется, задайте для него значениеDefault.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Ознакомьтесь с ними, чтобы лучше понять, что делает каждая команда. Этот шаг представляет собой операцию записи, которая изменяет способ хэширования новых потоков в бэкенды. Существующие потоки в полете не прерваны.
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$RULE_NAME" ] && read -rp "Rule Name: " RULE_NAME
az network lb rule update \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$RULE_NAME" \
--load-distribution Default
- Повторно выполните шаг 2 по крайней мере через 10 минут трафика.
Нормальный выходной показатель наблюдается, если ни на один отдельный сетевой адаптер серверной части BytesReceivedRate не приходится более чем примерно 60 % от общего значения по всем сетевым адаптерам серверной части за интервал. Если перекос сохраняется и на пути трафика есть NAT или прокси, стоящий перед сервисом, перейдите к разделу B. Если основную часть нагрузки создает один клиент, даже используя много исходных портов, значит, сама рабочая нагрузка сосредоточена, и для распределения по отдельным запросам требуется дополнительный параллелизм на стороне клиента (или балансировщик нагрузки уровня 7, например шлюз приложений).
Разрешение B
Энтропия исходного IP-адреса на уровне балансировщика нагрузки слишком низка, чтобы 5-кортежный хэш мог распределять потоки. Вышестоящее устройство NAT (например, Брандмауэр Azure, NVA в концентраторе, сторонний брандмауэр, Front Door или обратный прокси-сервер) представляет множество исходных клиентов для балансировщика нагрузки как один исходный IP-адрес. С одним исходным IP-адресом и одним конечным IP-адресом или портом хэш-пространство уменьшается до вариантов исходного порта и стабильных клиентов, которые повторно используют один и тот же пин-порт источника для одной серверной части.
- Проверьте входной узел, отследив, где запросы поступают в балансировщик нагрузки:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
az network lb frontend-ip list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, privateIP:privateIPAddress, publicIPId:publicIPAddress.id, subnetId:subnet.id}" \
--output json
Если внешний интерфейс использует частный IP-адрес, определите вышестоящее устройство, интерфейс которого указывает на эту виртуальную сеть (VNet) или подсеть. Если внешний интерфейс использует публичный IP-адрес, определите, есть ли перед ним CDN, Front Door, WAF или NVA. Зафиксируйте границу между устройством и арендатором.
- Удалите fronting NAT из пути хеширования. Поддерживаемые параметры в порядке предпочтения:
- Обходить исходный NAT на переднем устройстве. Настройте вышестоящий брандмауэр или NVA для перенаправления трафика клиента в подсистему балансировки нагрузки, сохранив исходный IP-адрес источника клиента (без преобразования сетевых адресов источника (SNAT). Это действие восстанавливает энтропию хэша клиента без изменения приложения.
- Переместите переднее устройство за подсистемой балансировки нагрузки , а не перед ним, чтобы клиентские IP-адреса напрямую достигли подсистемы балансировки нагрузки.
- Перейдите на шлюз приложений (уровень 7) для рабочей нагрузки. Шлюз приложений распределяет трафик на уровне HTTP-запросов, а не на уровне потоков. Таким образом, одно клиентское подключение по-прежнему распределяет запросы между внутренними серверами и не подвергается сворачиванию кортежей 5.
Этот последний вариант является подходящим исправлением, если вышестоящий NAT должен оставаться на месте, а рабочая нагрузка — HTTP/S.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Ознакомьтесь с ними, чтобы лучше понять, что делает каждая команда. Конкретный набор команд для отключения SNAT зависит от внешнего устройства. Следующие команды подготавливают шлюз приложений в качестве рекомендуемой альтернативы уровня 7. Это действие создает новые оплачиваемые ресурсы и изменяет плоскость данных.
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$AGW_NAME" ] && read -rp "New App Gateway Name: " AGW_NAME
[ -z "$AGW_VNET" ] && read -rp "VNet for App Gateway: " AGW_VNET
[ -z "$AGW_SUBNET" ] && read -rp "Dedicated subnet for App Gateway: " AGW_SUBNET
[ -z "$AGW_PUBIP" ] && read -rp "Public IP name (Standard SKU): " AGW_PUBIP
az network application-gateway create \
--name "$AGW_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--vnet-name "$AGW_VNET" \
--subnet "$AGW_SUBNET" \
--public-ip-address "$AGW_PUBIP" \
--sku Standard_v2 \
--priority 100
- Повторно выполните шаг 2.
Нормальный показатель наблюдается, если сетевой адаптер серверной части BytesReceivedRate распределён между несколькими серверами серверной части и ни на один сетевой адаптер серверной части не приходится более примерно 60 % от общего числа байтов. Если вы приняли шлюз приложений, трафик к исходной подсистеме балансировки нагрузки снижается, а новый шлюз приложений становится метрикой интереса.
Резолюция C
Правило настраивается путем задания для loadDistribution значения SourceIP (2-кортеж — это исходный IP-адрес и IP-адрес назначения) или SourceIPProtocol (3-кортеж — это исходный IP-адрес, IP-адрес назначения и протокол). Оба режима намеренно закрепляют каждый поток от заданного клиента (или клиента и протокола) к одной серверной части. Такое поведение корректно для рабочих нагрузок с сохранением состояния, которым действительно требуется клиентская привязка, однако именно оно чаще всего становится причиной жалоб на то, что «один внутренний сервер перегружен», если задать это значение в правиле без реальной необходимости.
Выполните следующие команды в Azure CLI:
- Убедитесь, что сохраняемость сеанса включена, и зафиксировать текущее значение перед его изменением:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$RULE_NAME" ] && read -rp "Rule Name: " RULE_NAME
az network lb rule show \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$RULE_NAME" \
--query "{name:name, loadDistribution:loadDistribution, protocol:protocol}" \
--output json
Если loadDistribution — SourceIP или SourceIPProtocol, правило использует привязку к IP-адресу источника. Прежде чем переходить к следующему шагу, убедитесь, что рабочая нагрузка не требует привязки к бэкенду (например, отсутствует состояние сеанса в памяти, которое не реплицируется между узлами бэкенда), и что привязка сеанса не является функциональным требованием.
- Переключите правило на
Defaultраспределение (5‑кортежное).
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Ознакомьтесь с ними, чтобы лучше понять, что делает каждая команда. Это изменение устраняет привязку клиента. Любое приложение, зависящее от backend’а с привязкой к одному серверу (например, от сессии в памяти или локального кэша), может перестать работать.
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$RULE_NAME" ] && read -rp "Rule Name: " RULE_NAME
az network lb rule update \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$RULE_NAME" \
--load-distribution Default
Существующие потоки продолжают поступать в текущую серверную часть до тех пор, пока они не завершаются. Новые потоки распределяются по хэшу между всеми исправными серверами.
- Повторно выполните шаг 2 после не менее 10 минут нового трафика.
Исправное состояние считается признаком того, что сетевой адаптер серверной части BytesReceivedRate распределён между несколькими серверами серверной части. Если для рабочей нагрузки действительно требуется привязка сеанса, оставьте постоянство включённым и вместо этого используйте Application Gateway с привязкой на основе файлов cookie. Эта конфигурация обеспечивает распределение для каждого запроса в сочетании с привязкой к сеансу.
Разрешение D
Это правило применяется к протоколу, пакеты которого используют тот же 5-элементный кортеж. Распространенными примерами являются ретрансляция DHCP (UDP 67 или 68), системный журнал (UDP 514) и ловушки SNMP (UDP 162 или 161). Агент ретрансляции или устройство отправляет один поток из одного исходного IP-адреса в один целевой IP-адрес и порт. Хэшу потока не по чему различаться. Поэтому все пакеты попадают в один контейнер каждый раз, независимо от режима распространения. Load Balancer не является правильным приложением для этого трафика.
Выполните следующие команды в Azure CLI.
- Определите параметры высокого уровня доступности для затронутой службы и удалите подсистему балансировки нагрузки из распространения этих пакетов. Ниже приведены распространенные примеры:
- DHCP-ретрансляция: Используйте отказоустойчивость DHCP в Windows или разделение области DHCP между двумя серверами. Добавьте сетевой адаптер каждого сервера как доступный для прямой адресации агентом ретрансляции DHCP. Не перенаправьте их с помощью подсистемы балансировки нагрузки для самого трафика DHCP.
-
Syslog: Настройте клиент syslog (rsyslog, syslog-ng, переадресатор событий Windows) для отправки в несколько точек назначения с циклическим распределением либо в активном или резервном режиме на уровне клиента. Такие средства, как
rsyslogиomfwd, изначально поддерживают несколько целевых платформ. -
Ловушки SNMP: Настройте источник ловушки для отправки всем сборщикам параллельно или используйте управляющую программу пересылки ловушки (например
snmptrapd, для распределения на стороне получателя).
- Удалите неподходяемое правило из подсистемы балансировки нагрузки, чтобы устранить вводящий в заблуждение неровный сигнал и освободить интерфейсный порт.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Эта операция удаляет правило балансировки нагрузки. Убедитесь, что определенный протокол высокой доступности, определенный ранее, установлен перед удалением правила. В противном случае для этого трафика происходит кратковременный сбой.
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$RULE_NAME" ] && read -rp "Rule Name: " RULE_NAME
az network lb rule delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$RULE_NAME"
- Убедитесь, что правило исчезло:
# -- Collect inputs (cached if already set in this session) --
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
az network lb rule list \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, protocol:protocol, frontendPort:frontendPort}" \
--output table
Убедитесь, что трафик протокола теперь достигает целевых объектов высокой доступности напрямую.