Модуль Apache mod_lbmethod_byrequests
| Описание: | Алгоритм планировщика балансировщика нагрузки с подсчётом запросов для mod_proxy_balancer
|
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | lbmethod_byrequests_module |
| Исходный файл: | mod_lbmethod_byrequests.c |
| Совместимость: | Выделен из mod_proxy_balancer в версии 2.3 |
Общие сведения
Этот модуль не предоставляет собственных директив конфигурации. Для его работы необходимы службы mod_proxy_balancer, а сам он предоставляет метод балансировки нагрузки byrequests.
Алгоритм подсчёта запросов
Этот планировщик включается с помощью lbmethod=byrequests. Его идея заключается в распределении запросов между различными рабочими процессами, чтобы каждый получал настроенную для него долю от общего числа запросов. Алгоритм работает следующим образом:
lbfactor — это ожидаемый объём работы для этого рабочего процесса, или рабочая квота процесса. Это нормализованное значение, представляющее его «долю» от общего объёма выполняемой работы.
lbstatus — это насколько срочно этому рабочему процессу нужно выполнять работу, чтобы выполнить свою квоту.
Рабочий процесс — это участник балансировщика нагрузки, обычно удалённый узел, обслуживающий один из поддерживаемых протоколов.
Мы распределяем рабочую квоту между рабочими процессами, а затем определяем, кому из них нужнее всего работать (у кого наибольшее значение lbstatus). Этот процесс выбирается для выполнения работы, а его lbstatus уменьшается на общую квоту, распределённую между всеми процессами. Таким образом, сумма всех значений lbstatus не изменяется (*), и запросы распределяются нужным образом.
Если некоторые рабочие процессы отключены, планирование для остальных всё равно будет выполняться корректно.
for each worker in workers worker lbstatus += worker lbfactor total factor += worker lbfactor if worker lbstatus > candidate lbstatus candidate = worker candidate lbstatus -= total factorЕсли балансировщик настроен следующим образом:
| рабочий процесс | a | b | c | d |
|---|---|---|---|---|
| lbfactor | 25 | 25 | 25 | 25 |
| lbstatus | 0 | 0 | 0 | 0 |
И процесс b отключён, будет сформировано следующее расписание:
| рабочий процесс | a | b | c | d |
|---|---|---|---|---|
| lbstatus | -50 | 0 | 25 | 25 |
| lbstatus | -25 | 0 | -25 | 50 |
| lbstatus | 0 | 0 | 0 | 0 |
| (повтор) | ||||
То есть запросы будут направляться так: a c d a c d a c d ... Обратите внимание:
| рабочий процесс | a | b | c | d |
|---|---|---|---|---|
| lbfactor | 25 | 25 | 25 | 25 |
Поведение будет точно таким же, как и при настройке:
| рабочий процесс | a | b | c | d |
|---|---|---|---|---|
| lbfactor | 1 | 1 | 1 | 1 |
Это объясняется тем, что все значения lbfactor нормализуются относительно друг друга. Для конфигурации:
| рабочий процесс | a | b | c |
|---|---|---|---|
| lbfactor | 1 | 4 | 1 |
рабочему процессу b в среднем будет доставаться в 4 раза больше запросов, чем процессам a и c.
Следующая несимметричная конфигурация работает ожидаемым образом:
| рабочий процесс | a | b |
|---|---|---|
| lbfactor | 70 | 30 |
| lbstatus | -30 | 30 |
| lbstatus | 40 | -40 |
| lbstatus | 10 | -10 |
| lbstatus | -20 | 20 |
| lbstatus | -50 | 50 |
| lbstatus | 20 | -20 |
| lbstatus | -10 | 10 |
| lbstatus | -40 | 40 |
| lbstatus | 30 | -30 |
| lbstatus | 0 | 0 |
| (повтор) | ||
То есть после 10 назначений расписание повторяется: выбираются 7 запросов для a, а между ними распределяются 3 запроса для b.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_lbmethod_byrequests.html