HA Proxy - раундробин против наименьшего

10

Есть ли какие-либо предложения о том, когда я должен использовать roundrobinи когда я должен использовать leastconn?

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

Есть идеи, чтобы поделиться?

Райан
источник

Ответы:

12

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

Когда вы говорите, что нагрузка распределена неравномерно, это может помочь определить «нагрузку» немного лучше. Если вы имеете в виду ресурсы сервера, то я предлагаю определить, что именно вызывает повышенную нагрузку (то есть определенные типы соединений), и работать в обратном направлении.

Кайл Брандт
источник
4

Это зависит от того, что протокол и сценарий использования для баланса. Для всего, где количество соединений коррелирует с нагрузкой / использованием, лучше использовать 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понимает текущую деятельность и корректирует распределение, которое именно то, что вы хотите от балансировщика нагрузки.

user5994461
источник