4. Алгоритмы планировщика¶
Функционально алгоритмы планировщика NFWare vLB4 устроены так же, как алгоритмы IPVS. Поддерживаемые алгоритмы балансировки:
Weighted Round Robin (WRR)
Weighted Least Connection (WLC)
Source Hash (SH)
4.1. Детали реализации планировщика¶
4.1.1. Конечный автомат состояний RS¶
![digraph {
bgcolor="transparent";
node [shape=box, color="white", fontcolor="white"];
FREE;
DISABLE;
WAIT_DST;
ENABLE;
DEAD;
FREE -> WAIT_DST [label = " Создать RS\n c весом > 0 ", color="white", fontcolor="white"];
FREE -> DISABLE [label = " Создать RS \nс весом 0 ", color="white", fontcolor="white"];
DISABLE -> WAIT_DST [label = " Изменить вес\n на отличный от 0 ", color="white", fontcolor="white"];
DISABLE -> DEAD [label = " Удалить ", color="white", fontcolor="white" ];
WAIT_DST -> DISABLE [label = " Изменить \nвес на 0 ", color="white", fontcolor="white"];
WAIT_DST -> ENABLE [label = " Сетевая \nсвязность найдена ", color="white", fontcolor="white"];
WAIT_DST -> DEAD [label = " Удалить ", color="white", fontcolor="white"];
ENABLE -> DISABLE [label = " Изменить вес на 0 ", color="white", fontcolor="white"];
ENABLE -> WAIT_DST [label = " Сетевая \nсвязность потеряна ", color="white", fontcolor="white"];
ENABLE -> DEAD [label = " Удалить ", color="white", fontcolor="white"];
DEAD -> FREE [label = " Вернуть в \nпул свободных ", color="white", fontcolor="white"];
}](_images/graphviz-1a1bd9e7a2d289240e98410d623caa494abb38e8.png)
![digraph {
bgcolor="transparent";
node [shape=box];
FREE;
DISABLE;
WAIT_DST;
ENABLE;
DEAD;
FREE -> WAIT_DST [label = " Создать RS\n c весом > 0 "];
FREE -> DISABLE [label = " Создать RS \nс весом 0 "];
DISABLE -> WAIT_DST [label = " Изменить вес\n на отличный от 0 "];
DISABLE -> DEAD [label = " Удалить " ];
WAIT_DST -> DISABLE [label = " Изменить \nвес на 0 "];
WAIT_DST -> ENABLE [label = " Сетевая \nсвязность найдена "];
WAIT_DST -> DEAD [label = " Удалить "];
ENABLE -> DISABLE [label = " Изменить вес на 0 "];
ENABLE -> WAIT_DST [label = " Сетевая \nсвязность потеряна "];
ENABLE -> DEAD [label = " Удалить "];
DEAD -> FREE [label = " Вернуть в \nпул свободных "];
}](_images/graphviz-97f70d3fbacc0608a559358b598ee57889adb375.png)
4.1.1.1. Создание RS¶
Пул свободных RS создается при старте системы. Максимальное количество RS можно посмотреть в CLI. При создании нового RS с веcом больше 0 берем его из пула свободных RS и переводим в состояние WAIT_DST. В этом состоянии проверяется сетевая связность до данного RS, а именно наличие маршрута и ARP записи. Если проверка сетевой связности прошла успешно, RS переходит в состояние ENABLE. В случае потери сетевой связности RS вернется обратно в состояние WAIT_DST и будет исключен из списков балансировки.
4.1.1.2. Удаление RS¶
Сначала состояние RS изменяется на DEAD. Новые соединения на RS больше не балансируются. C этого момента будет проверяться количество активных соединений, которые обслуживает RS. Когда все соединения закроются, RS снова попадет в пул свободных, и его состояние изменится на FREE.
4.1.1.3. Состояние DISABLE¶
При изменении веса RS на 0 он переходит в состояние DISABLE. При переходе в это состояние он исключается из всех списков балансировки, и с ним перестают работать все вспомогательные потоки, описанные ниже. По своей сути, состояние DISABLE очень похоже на FREE, за исключением того, что RS все еще остается определенным в конфигурации балансировщика.
4.1.2. Вспомогательные потоки планировщика¶
Garbage Collector отвечает за переход RS из состояния DEAD в FREE (в пул свободных RS). Выполняется с периодичностью intervals.gc мс. Реализует процесс ожидания закрытия всех соединений, которые обслуживаются RS перед его освобождением.
Wait Destination — проверка сетевой связности c RS (routing, ARP). Выполняется с периодичностью intervals.wait_dst мс. Отвечает за переход RS между состояниями WAIT_DST и ENABLE.
Rate — раccчет скорости изменения различных статистик RS и сервисов. Выполнятется с периодичностью intervals.rate мс.
Persistence — проверка записей persistence на наличие соединений, которые их используют. Выполняется с периодичностью intervals.persist мс. Когда все соединения, созданные с учетом записи persistence, закроются через
intervals.persist
мс (на следующей итерации), она удалится описываемым потоком.