4. Алгоритмы планировщика

Функционально алгоритмы планировщика NFWare vLB4 устроены так же, как алгоритмы IPVS. Поддерживаемые алгоритмы балансировки:

  1. Weighted Round Robin (WRR)

  2. Weighted Least Connection (WLC)

  3. 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"];

 }
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пул свободных "];

 }

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. Вспомогательные потоки планировщика

  1. Garbage Collector отвечает за переход RS из состояния DEAD в FREE (в пул свободных RS). Выполняется с периодичностью intervals.gc мс. Реализует процесс ожидания закрытия всех соединений, которые обслуживаются RS перед его освобождением.

  1. Wait Destination — проверка сетевой связности c RS (routing, ARP). Выполняется с периодичностью intervals.wait_dst мс. Отвечает за переход RS между состояниями WAIT_DST и ENABLE.

  1. Rate — раccчет скорости изменения различных статистик RS и сервисов. Выполнятется с периодичностью intervals.rate мс.

  1. Persistence — проверка записей persistence на наличие соединений, которые их используют. Выполняется с периодичностью intervals.persist мс. Когда все соединения, созданные с учетом записи persistence, закроются через intervals.persist мс (на следующей итерации), она удалится описываемым потоком.