Как работает HTTP plug-in и как он распределяет нагрузку (Load Balancing)

В этой статье будут рассмотрены основные вопросы, связанные с функционированием компонента http plug-in для WebSphere Application Server, такие как: принцип работы plug-in, балансировка нагрузки между участниками кластера WAS, борьба с неравномерным распределением нагрузки.

HTTP plug-in

Это DLL, находящаяся на той же системе где и Web-сервер, загруженная в память Web-сервером во время его запуска и работающая с Web-сервером в рамках одного процесса.

Схема работы HTTP plug-in

Plugin work scheme

Алгоритм работы HTTP plug-in

  1. Получение запроса
  2. Сопоставление, привязка к VirtualHostGroup
  3. Сопоставление, привязка к URIGroup
  4. Определение ServerCluster
  5. Выбор Server (на этом этапе: балансировка нагрузки, отказоустойчивость, сессионность (affinity))
  6. Открытие канала на сервер
  7. Отправка запроса
  8. Получение ответа
  9. Пересылка, ответ клиенту

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

Вес – доля нагрузки, приходящейся на сервер, положительное число.

Максимальный вес, который можно задать через административную консоль, равен 20. Однако вручную, редактируя файл plugin-cfg.xml, можно задать любой положительный вес, гораздо больший 20.

Допустим, мы имеем кластер с тремя участниками, веса которых 8,6 и 18 соответственно.

  1. На долю первого участника будет приходиться: (8/(8+6+18)) = 0,25 * 100% = 25% от всех поступающих в кластер запросов.
  2. На долю второго участника будет приходиться: (6/(8+6+18)) = 0,1875 * 100% = 18,5% от всех поступающих в кластер запросов.
  3. На долю третьего участника будет приходиться: (18/(8+6+18)) = 0,5625 * 100% = 56,5% от всех поступающих в кластер запросов.

Суммарно вся нагрузка на кластер равна 100%.

Как plug-in осуществляет балансировку нагрузки, алгоритм Round Robin

Load Balancing: Background

1) Начальный динамический вес участников кластера во внутренней таблице маршрутизации компонента http plug-in = нормирование на НОД статических весов участников кластера.

Например: 3 участника кластера с определенными статическими весами 8,6, 18. НОД у них это 2, после нормирования на НОД, получаем 4,3,9.

2) Первый запрос идет в случайный (Random selected) сервер, внутренний динамический вес которого >0.

3) Внутренний динамический вес сервера, отрабатывающего запрос, уменьшается на 1.

4) Не сессионные запросы (non-sticky request) никогда не попадут в сервер внутренний динамический вес которого <=0. Однако, сессионные запросы (with affinity, sticky request) могут обрабатываться сервером, внутренний динамический вес которого <= 0, и потенциально могут сводить внутренний динамический вес сервера к отрицательному числу. При условии, что свойство IgnoreAffinityRequests выставлено в false (см. ниже). Если это свойство имеет значение true, то сессионные запросы не учитываются, т.е. не влияют на внутренний динамический вес участников кластера.

5) Когда внутренние динамические веса всех участников кластера <=0, plug-in перестает перенаправлять не сессионные запросы серверам.Plug-in сбрасывает внутренние динамические веса участников кластера в таблице маршрутизации.

6) Значения весов, полученные после сброса, могут не совпадать со стартовыми значениями весов!

7) Новые значения весов получаются следующим образом:

Поиск минимального числа m (m>0), такого, что бы (w + m*s)>0 для всех участников кластера, где w- внутренний динамический вес перед сбросом, s- начальный динамический вес во внутренней таблице маршрутизации.

В нашем примере, начальные динамические веса участников кластера <4,3,9>. Допустим, что перед сбросом в таблице маршрутизации были следующие значения <-20,-40,0>, отрицательные значения были получены в результате обработки серверами сессионных запросов. Число m в нашем примере будет равно 14, так что динамические веса в таблице маршрутизации будут: <(-20 + 14*4), (-40 + 14*3), (0 + 14*9)>=<36,2,126>

Свойство IgnoreAffinityRequests

Параметр определяет, должен ли плагин учитывать сессионные запросы (affinity requests), при использовании карусельного алгоритма распределения нагрузки (Round Robin) между серверами в кластере. Т.е. будут ли учитываться сессионные запросы при расчете динамического веса сервера. Принимает значения true или false (1 или 0) для каждого определения ServerCluster. Если параметр установлен в значение false, то сессионные запросы будут учитываться при выборе сервера.

Значение по умолчанию – true, означающее, что число сессионных запросов не будет использоваться в работе алгоритма Round Robin.

!Неравномерное распределение нагрузки

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

Причины:

  • Это не ошибка, так и должно быть. Нет понимания, как плагин осуществляет балансировку нагрузки между серверами приложений
  • Неправильно сконфигурирован плагин (IgnoreAffinityRequests=false)
  • Использование однопоточного/многопоточнго HTTP-сервера

Что нужно сделать, что бы этого не происходило

1. Выставлять начальные статические веса участников кластера, таким образом, что бы они имели максимально возможные значения, у которых НОД будет не тривиальным. Это позволит предотвратить следующее:

  • Наступление быстрого сбрасывания динамических весов в таблице маршрутизации плагина
  • Достижение одним из участников кластера большого отрицательного динамического веса
  • Получение одним из участников кластера большого положительного динамического веса после сбрасывания

2. Если используется многопоточный HTTP сервер, т.е. несколько процессов сервера, а не один, то в httpd.conf следует определить один процесс HTTP-сервера, и как можно большее количество ниток для этого процесса. Т.е. необходимо уменьшить количество процессов HTTP сервера на максимально возможное число.

Knowledge Collection: Plug-in for WebSphere Application Server: 
http://www-01.ibm.com/support/docview.wss?uid=swg27021301

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
Метки: , , , , ,
Опубликовано в IBM HTTP Server & Plug-in, WebSphere Application Server

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Выбор языка: