Схемы балансировки нагрузки для web-серверов

автор: Александр Качанов
перевод: n|a

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

Оставляя в стороне все "за" и "против" использования многомашинной системы (или как ее еще называют - server farm), давайте зададимся вопросом: "поскольку в Интернете каждому IP-адресу соответствует одна машина, каким же образом можно распределять нагрузку между несколькими машинами так, чтобы они извне выглядели как один единственный web-сайт?"

При конфигурации с одной машиной, на все HTTP-запросы всегда отвечает одна и та же машина. В конфигурации с несколькими машинами все схемы распределения нагрузки между ними используют маршрутизацию (routing), при которой каждый последующий HTTP-запрос передается на (потенциально) другую машину.

Существует несколько распространенных подходов в организации распределения нагрузки. Это:

- круговой DNS, когда для распределения нагрузки используется DNS-сервер

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

- программное распределение нагрузки. Например программа "TCP/IP Network Load Balancing" от Microsoft.

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

Круговой DNS

Круговой DNS - это самый простой способ перенаправления HTTP-запросов на несколько серверов. Как вы знаете, любой DNS-сервер хранит пару "имя хоста/IP-адрес" для каждой машины в определенном домене. Этот список выглядит примерно так:

wrox.com		xxx.xxx.xxx.2
www.wrox.com	xxx.xxx.xxx.3

Помимо этого любому имени можно назначить несколько IP-адресов. В результате чего список будет выглядеть так:

wrox.com		xxx.xxx.xxx.2
www.wrox.com	xxx.xxx.xxx.3
www.wrox.com	xxx.xxx.xxx.4
www.wrox.com	xxx.xxx.xxx.5
www.wrox.com	xxx.xxx.xxx.6

DNS-сервер будет по кругу проходить по всем записям в таблице и отдавать на каждый новый запрос следующий IP-адрес. Так, на первый запрос DNS-сервер выдаст адрес "xxx.xxx.xxx.3", на второй - "xxx.xxx.xxx.4", а на третий - "xxx.xxx.xxx.4" и так далее. В результате все запросы будут поровну разделены между всеми web-серверами.

Балансировка

На первый взгляд это решение кажется неплохим и очень дешевым. Однако балансировка нагрузки здесь заключается лишь в том, что каждый из серверов получит равное количество запросов. Это подразумевает, что у каждого сервера в наличие имеется одинаковый объем ресурсов (вполне реальное предположение), и что им для выполнения всех операций необходимо одинаковое количество этих ресурсов (гораздо менее реальное предположение). В этом решении совершенно не учитывается, насколько сильно загружен процессор той или иной машины. Хоть в определенной степени мы здесь и добиваемся распределения нагрузки, этот способ чрезвычайно неэффективен для серьезных приложений.

Представим себе сцепку из двух серверов:

Например использование процессора на сервере А уже достигло пика в 100% из-за характера выполняемого HTTP-запроса. В это же время сервер В загружен, скажем, лишь на 10-15%. Схема кругового DNS по-прежнему будет направлять половину всех запросов на сервер А, который уже и так перегружен. Это не только неэффективно, но и приводит к тому, что пользователи будут нажимать кнопку "Refresh" снова и снова, видя что ваш сайт медленно отвечает, а значит, что они будут генерировать все больше и больше запросов. Продолжаться это будет до тех пор, пока пользователь не получит сообщение веселенькое "Server too busy".

Отказоустойчивость

Кроме того, эта схема никак не поможет в случае выхода какой-либо из машин из строя. Обратимся опять к примеру выше. Если сервер А выработает свой ресурс и "свалится", половина HTTP-запросов все равно будет перенаправляться на уже недоступную машину. В результате пользователь получит еще более веселенькое сообщение "Server Unavailable".

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

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

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

Кроме того, при такой схеме у вас возникнут проблемы:

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

Список можно продолжить.

Администрирование

С точки зрения администратора же эта схема идеальна. Для ее работы не требуется дополнительное оборудование и переустройство сети и серверов. На внесение изменений в таблицу DNS не требуется много времени и сил.

1. Нет денег на Cray? А зачем?
2. Web-сайты из нескольких серверов
3. Схемы распределения нагрузки во многомашинной системе
- Круговой DNS
- Аппаратное распределение нагрузки
- Программное распределение нагрузки
- Смешанные решения
4. Пару слов о "привязке"
5. Заключение

Rambler's Top100
Rating All.BY
Akavita
Valid XHTML 1.0!