Обзор распределения нагрузки в LVS

Одним из преимуществ LVS кластера является его возможность выполнять гибкое, на уровне IP, распределение нагрузки в наборе реальных серверов. Эта гибкость достигается благодаря использованию различных алгоритмов планировщика при настройке кластера. Распределение нагрузки в LVS превосходит менее гибкие методы, такие как Циклическое распределение DNS (Round-Robin DNS), в котором иерархическая природа DNS и кэширование на клиентских машинах может привести к нарушению баланса. Также фильтрация пакетов на низком уровне, реализованная в LVS маршрутизаторе, имеет преимущетво по сравнению с перенаправлением запросов на уровне приложений, так как требует меньших вычислительных мощностей и допускает большую масштабируемость.

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

Механизм распределения ресурсов в LVS кластере реализуется при установке набора изменений (patch) ядра, называемых IP Virtual Server или IPVS модули. Эти модули допускают L4-переключение, разработанное для использования несколькими серверами одного IP адреса.

Для эффективного отслеживания и перенаправления пакетов на реальные сервера, модуль IPVS строит в ядре системы IPVS-таблицу. Эта таблица используется активным LVS маршрутизатором для перенаправления запросов с адресов виртуального сервера реальным серверам в наборе и обратно. Таблица IPVS постоянно обновляется демоном ipvsadm, который добавляет и удаляет узлы кластеры в зависимости от их доступности.

Алгоритмы распределения

Вид, который имеет таблица IPVS, зависит от выбранного администратором алгоритма распределения для определенного виртуального сервера. Для получения максимальной гибкости в выборе типов служб, работающих в кластере, и распределения запросов к этим службам, Red Hat Enterprise Linux AS 2.1 предлагает вам восемь алгоритмов распределения, перечисленных ниже: За инструкциями о том как назначить алгоритм распределения, обратитесь к разделу ВИРТУАЛЬНЫЙ СЕРВЕР в Главе 9.

Циклическое распределение (Round-Robin Scheduling)

Распределяет каждый запрос между реальными серверами последовательно. В этом алгоритме все реальные сервера считаются одинаковыми, их мощность и нагрузка не учитывается. Этот алгоритм похож на "циклическое распределение DNS" ("round-robin DNS") но является более эффективным, так как основан на сетевом соединении, а не на имени узла. При циклическом распределении LVS также не возникает нарушение баланса, происходящее при кэшировании DNS запросов.

Циклическое распределение с весовыми коэфициентами (Weighted Round-Robin Scheduling)

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

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

Минимум соединений (Least-Connection)

Реальные сервера с меньшим количеством активных соединений получают больше запросов. Так как в этом алгоритме текущие соединения с реальными серверами учитываются в таблице IPVS, он представляет собой алгоритм с динамическим распределением, что делает его лучшим выбором в ситуации с резким изменением нагрузки на кластер. Он работает эффективнее, если все сервера в наборе имеют примерно одинаковую мощность. Если набор состоит из серверов с разной мощностью, алгоритм "минимум соединений с приоритетами" является лучшим выбором.

Минимум соединений с весовыми коэфициентами (Weighted Least-Connections) (алгоритм по умолчанию)

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

Распределение, основанное на размещении и минимуме соединений (Locality-Based Least-Connection Scheduling)

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

Распределение, основанное на размещении и минимуме соединений с репликацией (Locality-Based Least-Connection Scheduling with Replication Scheduling (R))

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

Распределение по получателю (Destination Hash Scheduling)

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

Распределение по источнику (Source Hash Scheduling)

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

Весовой коэфициент сервера и распределение

Администратор LVS кластера может назначить весовой коэфициент каждому узлу в в наборе реальных серверов. Вес сервера - это целое число, которое задается для работы всех алгоритмов с весовыми коэфициентами (например, для алгоритма "Минимум соединений с весовыми коэфициентами") и помогает LVS маршрутизаторам распределять нагрузку более эффективно.

Весовые коэфициенты используются для расчета отношений между ними. Например, если один реальный сервер имеет вес, равный 1, а другой сервер имеет вес 5, то сервер с весом 5, получит 5 соединений, в то время как другой получит только одно. По умолчанию вес сервера равен 1.

Хотя задание веса для различных аппаратных конфигураций в наборе реальных серверов может помочь в более эффективном распределении нагрузки, это может на время нарушить баланс системы при добавлении нового реального сервера в набор, когда виртуальный сервер распределяет нагрузку с весовыми коэфициентами. Например, пусть набор реальных серверов состоит из трех серверов. Сервера A и B имеют весовой коэфициент 1 и третий, сервер C, имеет вес 2. Если сервер C по какой-то причине отключается, сервера A и B восполнят недостаток. Но когда сервер C вернется к нормальной работе, LVS маршрутизатор определит что с ним не установлено никаких соединений, и будет загружать этот сервер всеми входящими подключениями, пока его нагрузка не уравняется с нагрузкой серверов A и B.

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