Это зависит от того, что протокол и сценарий использования для баланса. Для всего, где количество соединений коррелирует с нагрузкой / использованием, лучше использовать leastconn
. Из-за того, как работают сети и приложения, это почти всегда так, и вам лучше использовать leastconn
по умолчанию.
RDP / X11 удаленные рабочие столы / Jump Hosts
Например, у компании есть пул удаленных рабочих столов, к которым подключаются сотрудники. Вы бы хотели, чтобы сотрудники были равномерно распределены по рабочим столам.
Количество активных подключений в этом случае примерно равно «сколько сотрудников сейчас используют этот рабочий стол». На хосте с наименьшим количеством подключений используется наименьшее количество сотрудников, и он, вероятно, наименее загружен. Используйте «наименьшее количество» в этих условиях, оно равномерно распределяет нагрузку по количеству пользователей.
Идеальный балансировщик нагрузки должен знать о нагрузке удаленного рабочего стола. Сколько пользователей? Сколько приложений? Сколько памяти и процессора потребляется? Существуют коммерческие решения, предназначенные для удаленных рабочих столов (Microsoft / Citrix / и т. Д.), Они обычно измеряют эти показатели, чтобы распределить использование очень хорошо. HAProxy - это простой балансировщик сетевой нагрузки, и он не может работать лучше, чем подсчет соединений leastconn
.
HTTP / HTTPS
С HTTP активное соединение означает, что сервер занят обработкой запроса. Соединения прямо пропорциональны нагрузке. Вы хотите выбрать сервер с наименьшим количеством активных соединений (выполняющихся запросов). Использовать leastconn
для HTTP (S) трафика.
Представьте себе сценарий с двумя HTTP-серверами, где один сервер медленнее обрабатывает запросы (возможно, он перегружен, может, у него более старое оборудование).
roundrobin
будет распределять запросы пополам между двумя серверами. Это очень неэффективно, более быстрый сервер должен занять больше. Хуже того, более медленный сервер может быть перегружен, он станет еще медленнее, поскольку поступит больше запросов и может начать отбрасывать запросы в любое время. Вы этого не хотите.
leastconn
обнаружит, что серверы работают неравномерно. Более медленный сервер держит соединения дольше, он имеет большее количество соединений. leastconn
учитывает это и предпочитает другой сервер.
По своему опыту, включая роли, в которых я занимался исключительно тестированием производительности для средних и крупных сайтов. leastconn
может быть на 300% эффективнее, чем roundrobin
для HTTP (S). roundrobin
не распределяет соединение справедливо, и это вызовет нестабильность при высокой нагрузке.
Запрос DNS
(Давайте не будем обращать внимания на то, что HAProxy не поддерживает UDP, а UDP меньше подключается).
Последний пример. DNS - это простой протокол. Клиенты отправляют одно UDP-сообщение для запроса домена, а DNS-сервер отвечает одним сообщением.
В этом случае нет никакой связи. Даже если бы они были, он был бы немедленно закрыт (теоретически).
В этих обстоятельствах не имеет смысла считать соединения, это не оптимально для leastconn
. Простые roundrobin
могут распространять сообщения.
Общее недоразумение
Люди иногда считают, что их не следует использовать leastconn
для кратковременных соединений (аналогично последнему примеру). Даже документация HAProxy вводит в заблуждение по этому поводу.
leastconn
Use of this algorithm is recommended where very long sessions are
expected, such as LDAP, SQL, TSE, etc... but is not very well
suited for protocols using short sessions such as HTTP.
[misleading advice, should ignore it]
В реальном мире short connections
это не вещь.
Приложения построены поверх TCP. Сообщения доставляются и часто обрабатываются по порядку. Когда сервер работает медленно или перегружен, «короткие» соединения становятся длиннее. Если есть (больше) соединений, вероятно, некоторая (больше) работа выполняется. Количество подключений и продолжительность подключения различны и имеют значение.
Подумайте об основном HTTP-сервере. Некоторые ресурсы занимают несколько миллисекунд, некоторые вызовы API - несколько секунд, страница может загружаться в любое время с любым количеством запросов в ней и т. Д. Запросы не являются кратковременными, их время жизни зависит от того, что обрабатывается на каком сервере. leastconn
понимает текущую деятельность и корректирует распределение, которое именно то, что вы хотите от балансировщика нагрузки.