Как распределить нагрузку на сервер, когда наращивать мощность уже нельзя.
Создавая серьезный веб-проект важно правильно спланировать возможную нагрузку. Ведь если «падает» сервер (а случается это в наиболее неподходящие и неожиданные моменты), многие его пользователи начинают заниматься поисками более надежного ресурса, владелец же теряет свои нервы и деньги. До определенного момента недостаточную производительность сервера при растущих нагрузках можно увеличивать, наращивая его мощность, оптимизируя используемые алгоритмы, программные коды и иные возможности задействованного оборудования. Также чтобы сервера не падали по причине человеческого фактора, заказывайте у нас администрирование.
Но, существует определенный предел, после которого принимаемые меры уже не помогут. В этом случае остается кластеризация. Когда из нескольких серверов создают кластер, распределение нагрузки между ними начинает выполняться по специальной комплексной методике, называемой также балансировкой нагрузки. Использование кластеризации не только помогает основному оборудованию выдержать пиковые перегрузки, но и обеспечивает возможность взаимного резервирования серверов между собой.
Результативность же подобного решения будет варьироваться по мере того, как произойдет распределение нагрузки, и сколько ее сможет задействовать на себя любой из них. Балансировку можно осуществлять как аппаратными, так и программными средствами. Применяемые для этого методы и алгоритмы будут приведены далее в тексте.
Особенности уровней балансировки
В балансировке нагрузки принимают непосредственное участие многочисленные алгоритмы и методы, связанные с тремя уровнями OSI-модели:
- сетевым;
- транспортным;
- прикладным.
Сетевой уровень балансировки возлагает ответственность за единственный серверный IP-адрес на группу независимых физических машин. Чтобы реализовать схему на практике, используют различные варианты:
• DNS-балансировку, где различные IP-адреса принадлежат единому связанному доменному имени. Подбор сервера для обслуживания клиентского запроса осуществляется по алгоритму Round Robin.
• Создание NLB-кластера, в котором объединяется несколько физических машин, используемых как входные и вычислительные узлы. За распределение нагрузки тут также отвечает специальный алгоритм.
• Балансировку по IP-адресам. Для выполнения задачи привлекается дополнительный маршрутизатор (или несколько).
• Территориальный признак. Идентичные сервера, имеющие совпадающие IP-адреса, размещают в территориально-различные регионы всемирной сети (использование технологии Anycast DNS). Способ широко применяется в CDN.
Транспортный уровень балансировки нагрузки наиболее простой и удобный для клиента. В нем балансировщик напрямую запрашивает сервера на возможность обработки клиентского запроса и соединяет с наименее загруженным из них. Тут для выбора используются различные алгоритмы: это может быть и обычный круговой перебор задействованных физических машин по их пулам, и другие способы. Иногда даже опытные пользователи не видят различий между сетевым и транспортным уровнем распределения нагрузки. Для этого нужно отследить, как распределяется поступающая информация. Вот что можно получить, рассматривая сетевой трафик на транспортном уровне:
web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"
match in on $ext_if proto tcp to port 80 rdr-to $web_servers round-robin sticky-address
Тут задействуется определенный порт ТСР для сетевых фильтров pf BSD-систем. В подобном трафике на сетевом уровне сразу станут видны существенные отличия:
pass in on $int_if from $lan_net \
route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) }\
round-robin
Тут не фигурирует ни конкретный порт, ни привязанный к нему протокол. Подобные варианты решений не связаны с пользовательскими сессиями и существуют лишь для направления трафика к тому или иному из серверов, которые организуют сессии с клиентами. В случае же с транспортным уровнем роль прокси выполняет сам балансировщик. Он же самостоятельно общается с клиентами и передает серверам информацию о них, но используя дополнительные данные и заголовки.
Прикладной уровень балансировки нагрузки выставляет балансировщик «умным» прокси. Ему доверяется анализировать запросы от клиентов и перенаправлять их серверам, выбирая ресурс в зависимости от характера поступающей информации. Ответственность за запросы лежит на модуле Upstream. Так происходит их перераспределение между серверами с учетом востребованности тематики предлагаемого контента.
Алгоритмические решения
Для балансировки нагрузки обычно применяются многочисленные алгоритмы и методы, а также их различные комбинации. Чтобы выбрать лучший вариант, учитывают специфику создаваемого веб-проекта, а также преследуемые при этом цели. Они основаны на следующих принципах:
• Справедливости. О ней можно говорить, когда каждый запрос обрабатывается отдельными системными ресурсами и исключается ситуация, при которой остальные запросы в это время выстраиваются в очередь на эти же ресурсы.
• Максимальной эффективности. При ней нагрузка должна распределяться равномерно по всем задействованным серверам. Также не должны возникать моменты, в течение которых один или несколько серверов простаивают, ожидая запросы, а остальные полностью загружены.
• Минимизации временного промежутка, требуемого на обработку запроса. Рассчитывается с момента его поступления на сервер, и до полного завершения. Минимальное время на обработку достигается при правильной балансировке.
• Быстром отклике на запросы пользовательской аудитории.
Не менее важно, чтобы в алгоритме распределения нагрузки сохранились возможности:
• предсказуемости, когда каждый понимает, как получить наиболее эффективное и оперативное решение;
• более-менее равномерной загрузке системных ресурсов;
• масштабируемости, обеспечивающей алгоритму сохранение работоспособности даже когда критически увеличивается нагрузка.