Основы дизайна систем: балансировка нагрузки

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

Вы можете наделить сервер большей мощностью (вертикальное масштабирование) или добавить больше серверов (горизонтальное масштабирование). Но теперь вам нужно выяснить, как входящие запросы распределяются между различными серверами - какие запросы маршрутизируются на какие серверы и как гарантировать, что они не будут перегружены? Другими словами, как вы балансируете и распределяете нагрузку запросов?

Введите балансировщики нагрузки. Задача балансировщика нагрузки - сидеть между клиентом и сервером (но есть и другие места, где он может быть вставлен) и разбираться, как распределять нагрузку входящих запросов между несколькими серверами, чтобы конечный пользователь (клиент) всегда работал быстро, плавно и надежно.

Таким образом, балансировщики нагрузки похожи на менеджеров трафика, которые направляют трафик. И они делают это для поддержания доступности и пропускной способности.

Понимая, где в архитектуре системы вставлен балансировщик нагрузки, вы можете увидеть, что балансировщики нагрузки можно рассматривать как обратные прокси. Но балансировщик нагрузки можно вставить и в другие места - между другими обменнными пунктами - например, между вашим сервером и вашей базой данных.

Действие балансировки - стратегии выбора сервера

Итак, как балансировщик нагрузки решает, как маршрутизировать и распределять трафик запросов? Для начала, каждый раз, когда вы добавляете сервер, вам нужно сообщать вашему балансировщику нагрузки, что есть еще один кандидат для маршрутизации трафика.

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

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

Наивный подход к этому заключается в том, что балансировщик нагрузки просто случайным образом выбирает сервер и направляет каждый входящий запрос таким образом. Но, как вы понимаете, случайность может вызвать проблемы и «несбалансированное» распределение, когда одни серверы загружаются больше, чем другие, и это может отрицательно сказаться на производительности всей системы.

Круговая система (Round Robin) и взвешенная круговая система

Другой метод, который можно понять интуитивно, называется «циклический». Списки этого цикла обрабатываются следующим образом. Вы начинаете с первого элемента в списке, последовательно перемещаетесь вниз, а когда вы закончите с последним элементом, вы снова возвращаетесь к началу и снова начинаете работать по списку.

Балансировщик нагрузки также может сделать это, просто перебирая доступные серверы в фиксированной последовательности. Таким образом, нагрузка распределяется между вашими серверами довольно равномерно по простой и предсказуемой схеме.

Вы можете получить немного больше «фантазии» с круговым алгоритмом, «взвесив» одни услуги над другими. В обычном стандартном циклическом алгоритме каждому серверу присваивается одинаковый вес (допустим, всем присваивается весовой коэффициент 1). Но когда вы по-разному оцениваете серверы, у вас могут быть некоторые серверы с более низким весом (скажем, 0,5, если они менее мощные), а другие могут быть выше, например 0,7, 0,9 или даже 1.

Затем общий трафик будет разделен пропорционально этим весам и распределен по серверам, мощность которых пропорциональна объему запросов.

Выбор сервера на основе нагрузки

Более сложные балансировщики нагрузки могут определять текущую емкость, производительность и нагрузки серверов в своем списке перехода и динамически распределять их в соответствии с текущими нагрузками и расчетами относительно того, какие из них будут иметь наибольшую пропускную способность, наименьшую задержку и т. д., отслеживая производительность каждого сервера и решая, какие из них могут обрабатывать новые запросы, а какие - нет.

Выбор на основе IP-хэширования

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

Маршрутизация на основе IP-хэша может быть очень полезна, когда вы хотите, чтобы запросы из определенной страны или региона получали данные с сервера, который лучше всего подходит для удовлетворения потребностей из этого региона, или где ваши серверы кэшируют запросы, чтобы их можно было быстро обработать.

В последнем сценарии вы хотите убедиться, что запрос поступает на сервер, который ранее кэшировал тот же запрос, так как это повысит скорость и производительность при обработке и ответе на этот запрос.

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

Выбор, основанный на пути или услуге

Вы также можете настроить балансировщик нагрузки для маршрутизации запросов на основе их «пути», функции или услуги, которая предоставляется. Например, если вы покупаете цветы у интернет-магазина цветов, запросы на загрузку «Букетов по специальному заказу» могут быть отправлены на один сервер, а платежи по кредитной карте могут быть отправлены на другой сервер.

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

Смешанный вариант (Mixed Bag)

И, как и во всем, вы можете перейти на более высокие и подробные уровни сложности. У вас может быть несколько балансировщиков нагрузки, каждый из которых имеет разные стратегии выбора серверов! А если у вас очень большая система с большим объемом трафика, вам могут понадобиться балансировщики нагрузки для балансировщиков нагрузки...

В конечном итоге вы добавляете элементы в систему до тех пор, пока ваша производительность не будет настроена в соответствии с вашими потребностями (ваши потребности могут выглядеть плоскими, или слегка замедляться со временем, или быть склонными к скачкам!).


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий