以负载均衡为例,在有web界面的负载均衡中,修改一个配置,是如何下发到控制平面、数据平面的。
在负载均衡中,控制平面管理的“对象”包括:
· Virtual Server(虚拟服务器)
· Real Server(真实服务器)
· Server Group(服务器组)
· Health Check(健康检查)
· Persistence(会话保持)
· SSL Profile(SSL 配置)
“对象”与“实例” 的区别、配置模型 与 运行时状态模型 的分离。
比如说在web上创建了一个虚拟服务器,这是一个配置;为虚服务器配置服务器组,引用一个实服务器,这是一个引用;可能还有另一个虚服务器也引用这个实服务器,并且配置不同。
以 Virtual Server 和 Real Server 为例说明
场景设定:
Real Server (RS1):
IP: 192.168.1.10
Port: 80
Name: WebServer-A
Virtual Server (VS1):
VIP: 10.1.1.100:80
Server Group: Group-A → 包含 RS1
Virtual Server (VS2):
VIP: 10.1.1.200:443
Server Group: Group-B → 也包含 RS1
- 配置阶段(静态定义)
- 系统中只存在 一个 Real Server 配置对象:
WebServer-A
。 Group-A
和Group-B
都通过“指针”或“引用”(如对象 ID)指向这个唯一的WebServer-A
。- 这是共享的、全局的配置,避免重复定义,节省内存,便于统一管理。
类比:就像 C 语言中的结构体指针,多个地方指向同一个对象。
- 运行阶段(动态状态)
当设备运行时,系统需要维护每个 Real Server 的运行状态,而这些状态是与上下文相关的,可能不同:
状态项 | VS1 上下文中的 RS1 | VS2 上下文中的 RS1 |
---|---|---|
健康检查策略 | HTTP 检查,间隔 5s | TCP 检查,间隔 10s |
当前健康状态 | UP(通过 HTTP 检查) | DOWN(TCP 连接失败) |
当前连接数 | 120 | 80 |
权重(动态调整) | 8 | 5 |
最后响应时间 | 15ms | N/A(DOWN) |
这些状态不能共享!因为不同 Virtual Server 可能使用不同的健康检查机制或策略。
所以,系统会为每个“上下文”创建一个 运行时状态实例(Runtime Instance) :
- 在
Group-A
的上下文中,系统为RS1
创建一个运行时状态实例,记录其健康状态、连接数等。 - 在
Group-B
的上下文中,系统为RS1
再创建一个独立的运行时状态实例,记录另一套状态。
这些实例是轻量级的,只保存动态状态,不复制配置数据。
它们通过“引用 + 上下文”绑定到同一个配置对象。
技术实现模型(简化)
// 1. 配置对象(全局唯一)
struct RealServerConfig {
uint32_t id; // 对象ID
char name[64]; // 名称
ip_addr_t ip;
uint16_t port;
// ... 其他静态配置
};
// 2. 运行时状态实例(每个上下文一个)
struct RealServerRuntime {
RealServerConfig *config; // 指向配置对象(共享)
HealthStatus health; // 健康状态(按上下文)
uint32_t conn_count; // 当前连接数
uint8_t weight; // 当前权重
timestamp_t last_check;
// ... 动态状态
};
// 3. Server Group(运行时)
struct ServerGroupRuntime {
RealServerRuntime *rs_instances[MAX_RS];
int count;
};
- 多个
ServerGroupRuntime
可以引用同一个RealServerConfig
。 - 但每个
ServerGroupRuntime
拥有自己独立的RealServerRuntime
实例数组。
“比如 Virtual Server 应用了某个 Real Server,会创建一个 Real Server 实例吗?”
答:
- 不会创建新的配置对象实例(即不会复制一份 Real Server 的配置)。
- 但会在该 Virtual Server 的上下文中,创建一个 Real Server 的“运行时状态实例” ,用于维护其独立的健康状态、连接数等动态信息。
- 配置是共享的(通过指针引用),状态是隔离的(按上下文创建实例)。
类比:
一个“员工档案”是唯一的(配置对象),
但他在不同项目组中的“当前任务状态、工时、绩效”是不同的(运行时实例)。
这种“配置与状态分离”、“对象引用 + 运行时上下文实例化”的设计,是现代网络设备(包括 H3C、F5、Citrix、华为等)控制平面的通用架构模式,兼顾了效率、灵活性与可维护性。