3. Принцип обработки пакетов¶
Обработка пакета в NFWare Load Balancer работает по принципу, схожему с IPVS.
Поиск RS сначала осуществляется по таблице соединений, потом по таблице Persistence и только после этого отправляется в модуль балансировки. Соединение содержит в себе информацию о Sourse/Destination IP-адресах и портах, протоколе (TCP/UDP), а также информацию о RS, который его обслуживает. Persistence содержит в себе информация о Source IP, SID и RS, который его обслуживает.
Подробней про обработку пакета можно узнасть из блок-схемы, представленной ниже:
![digraph G {
bgcolor="transparent";
comment="Pipeline of packet processing";
node [fontsize=12, height=.2, width=.25, color="#000000", fontcolor="#000000"];
edge [fontsize=12, arrowsize=.8, color="#000000", fontcolor="#000000"];
RCV [shape=box, label="Получение пакета"];
CONN_EXIST_COND [shape=diamond, conditional=true, label="Есть ли \nинформация о соединении\n в таблице?"];
GET_FROM_C [shape=box, label="Информацию о RS берем \nиз таблицы соединений"];
P_ENABLE_COND [shape=diamond, conditional=true, label="Включен ли\nPersistence в настройках\n сервиса?"];
P_EXIST_COND [shape=diamond, conditional=true, label="Есть ли\nсоответствующая запись в \nтаблице Persistence?"];
GET_FROM_P [shape=box, label="Информацию о RS берем \nиз таблицы Persistence"];
BAL [shape=box, label="Балансировка/Выбор RS"];
CRT_C [shape=box, label="Заполняем таблицы соединений \nи Persistence (если нужно)"];
SND [shape=box, label="Отправка пакета"];
RCV -> CONN_EXIST_COND
CONN_EXIST_COND -> GET_FROM_C [label=" Да "];
CONN_EXIST_COND -> P_ENABLE_COND [label=" Нет "];
P_ENABLE_COND -> P_EXIST_COND [label=" Да "];
P_EXIST_COND -> GET_FROM_P [label = " Да "]
P_EXIST_COND -> BAL [label = " Нет "];
P_ENABLE_COND -> BAL [label = " Нет " ];
BAL -> CRT_C;
GET_FROM_P -> CRT_C;
GET_FROM_C -> SND;
CRT_C -> SND;
subgraph "cluster_#1" {
label="Fast Path";
color="#0000ff";
CONN_EXIST_COND; GET_FROM_C
}
}](_images/graphviz-ed7725236bf3ab8dff0c2eaaad81c33c0722e798.png)
![digraph G {
bgcolor="transparent";
comment="Pipeline of packet processing";
node [fontsize=12, height=.2, width=.25, color="white", fontcolor="white"];
edge [fontsize=12, arrowsize=.8, color="white", fontcolor="white"];
RCV [shape=box, label="Получение пакета", color="white", fontcolor="white"];
CONN_EXIST_COND [shape=diamond, conditional=true, label="Есть ли \nинформация о соединении\n в таблице?", color="white", fontcolor="white"];
GET_FROM_C [shape=box, label="Информацию о RS берем \nиз таблицы соединений", color="white", fontcolor="white"];
P_ENABLE_COND [shape=diamond, conditional=true, label="Включен ли\nPersistence в настройках\n сервиса?", color="white", fontcolor="white"];
P_EXIST_COND [shape=diamond, conditional=true, label="Есть ли\nсоответствующая запись в \nтаблице Persistence?", color="white", fontcolor="white"];
GET_FROM_P [shape=box, label="Информацию о RS берем \nиз таблицы Persistence", color="white", fontcolor="white"];
BAL [shape=box, label="Балансировка/Выбор RS", color="white", fontcolor="white"];
CRT_C [shape=box, label="Заполняем таблицы соединений \nPersistence (если нужно)", color="white", fontcolor="white"];
SND [shape=box, label="Отправка пакета", color="white", fontcolor="white"];
RCV -> CONN_EXIST_COND
CONN_EXIST_COND -> GET_FROM_C [label=" Да "];
CONN_EXIST_COND -> P_ENABLE_COND [label=" Нет "];
P_ENABLE_COND -> P_EXIST_COND [label=" Да "];
P_EXIST_COND -> GET_FROM_P [label = " Да "]
P_EXIST_COND -> BAL [label = " Нет "];
P_ENABLE_COND -> BAL [label = " Нет " ];
BAL -> CRT_C;
GET_FROM_P -> CRT_C;
GET_FROM_C -> SND;
CRT_C -> SND;
subgraph "cluster_#1" {
label="Fast Path";
color="green";
CONN_EXIST_COND; GET_FROM_C
}
}](_images/graphviz-f03369cad5bb2832831adbf78a88042c47322541.png)