网络设备控制平面的通用架构模式

4 阅读3分钟

以负载均衡为例,在有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
  1. 配置阶段(静态定义)
  • 系统中只存在 一个 Real Server 配置对象WebServer-A
  • Group-A 和 Group-B 都通过“指针”或“引用”(如对象 ID)指向这个唯一的 WebServer-A
  • 这是共享的、全局的配置,避免重复定义,节省内存,便于统一管理。

类比:就像 C 语言中的结构体指针,多个地方指向同一个对象。


  1. 运行阶段(动态状态)

当设备运行时,系统需要维护每个 Real Server 的运行状态,而这些状态是与上下文相关的,可能不同:

状态项VS1 上下文中的 RS1VS2 上下文中的 RS1
健康检查策略HTTP 检查,间隔 5sTCP 检查,间隔 10s
当前健康状态UP(通过 HTTP 检查)DOWN(TCP 连接失败)
当前连接数12080
权重(动态调整)85
最后响应时间15msN/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、华为等)控制平面的通用架构模式,兼顾了效率、灵活性与可维护性。