Я использую Haproxy для балансировки нагрузки моих веб-серверов. Не все из них имеют одинаковые ресурсы. Типичные алгоритмы балансировки нагрузки вызвали перегрузку некоторых серверов нижнего уровня, поскольку LB не знает о слухах.
Является ли способ балансировки нагрузки на серверы основанным на их текущей нагрузке, доступности ресурсов и т. Д.?
Самый простой способ добиться этого - иметь страницу состояния на своих веб-серверах, которая возвращает HTTP 200, если сервер в порядке, и HTTP 500, если он перегружается. Кроме того, если вы знаете, что конкретный сервер может обрабатывать на 20% больше соединений, чем другой, вы можете использовать веса, чтобы опередить серверы, перегружающие их:
backend appservers
mode http
option httpchk HEAD /health_check.php
option redispatch
server web1 x.x.x.x:80 weight 100 check inter 2000 rise 5 fall 2
server web2 x.x.x.x:80 weight 120 check inter 2000 rise 5 fall 2
server web3 x.x.x.x:80 weight 80 check inter 2000 rise 5 fall 2
Вы можете динамически регулировать вес сервера с небольшим HAProxy Voodoo любезно set weight
команда
Соответствующие биты (которые отправляются в сокет статистики HAProxy):
установить вес / [%]
Измените вес сервера на значение, переданное в аргументе. Если значение заканчивается знаком «%», то новый вес будет относиться к изначально настроенному весу. Относительные веса разрешены только от 0 до 100%, а абсолютные веса разрешены от 0 до 256. Серверы, которые являются частью фермы, на которой работает алгоритм статической балансировки нагрузки, имеют более строгие ограничения, поскольку вес не может измениться после установки. Таким образом, для этих серверов единственными допустимыми значениями являются 0 и 100% (или 0 и начальный вес). Изменения вступают в силу немедленно, хотя некоторые алгоритмы LB требуют определенного количества запросов для учета изменений. Типичное использование этой команды - отключить сервер во время обновления, установив его вес на ноль, а затем снова включить его после обновления, вернув его на 100%. Эта команда ограничена и может быть запущена только на сокетах, настроенных для уровня «admin». И бэкэнд, и сервер могут быть указаны либо по имени, либо по числовому идентификатору с префиксом тире ('#').
Вам, конечно, нужно будет написать некоторый внутренний код на серверах, чтобы сообщить об их относительной нагрузке, и процессу на вашем HAProxy-сервере потребуется запросить их (это можно было бы включить в ваши проверки работоспособности с некоторым творчеством, но я бы начнем с того, что для простоты сделаем это как отдельный процесс).