Балансировка нагрузки

Балансировщики нагрузки решают (а также создают) множество проблем в работе интернет-проектов. Их главной задачей является распределение нагрузки между пулами серверов или кластерами, причем они могут оказаться как самыми простыми, так и самыми сложными программными компонентами в вашем вычислительном центре. Балансировщик нагрузки обычно реализуется во frontend-подсистеме он играет роль регулировщика для веб-серверов, обрабатывающих запросы пользовательских браузеров. Однако распределители нагрузки также могут обеспечивать баланс нагрузки по нескольким базам данных, прикладным серверам среднего уровня, географически удаленным вычислительным центрам, почтовым серверам, и так далее.

Балансировщики нагрузки используют относительно ограниченный набор алгоритмов и позволяют задавать протоколы, трафик которых должен распределяться по серверам. В книге Тео Шлосснейгла «Scalable Internet Architectures» приведена чрезвычайно полезная информация о балансировщиках нагрузки и их роли в веб-архитектурах.

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

Однако существует и другая, отрицательная, сторона Поскольку балансировщики нагрузки являются неотъемлемой частью архитектуры системы, их сбои бывают особенно эффектными и драматичными.

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

Джереми Заводны (Jeremy Zawodny) в первом издании книги «High Performance MySQL» поведал историю о том, как в базах данных Yahoo! применялась балансировка нагрузки по схеме «минимальною количества подключений». Такая схема хорошо работает при распределении нагрузки на веб-серверах: она гарантирует, что трафик будет направлен на сервер, обслуживающий минимальное количество запросов. Но веб-запросы почти всегда имеют короткий жизненный цикл, и их результаты (в среднем) не имеют заметных различий по размеру и задержке. Однако для баз данных эта парадигма подходит плохо, потому что запросы могут значительно различаться по размерам и времени обработки, а результаты запросов могут иметь весьма значительные объемы. Заводны привел этот пример для того, чтобы: читатели усвоили важный урок — относительно небольшое количество подключений к базе данных вовсе не означает, что сервер выдержит дополнительную нагрузку.

Вторая проблема с балансировкой нагрузки в базах данных связана с проверкой состояния исправности конкретных серверов.

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

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