从架构到数据结构,到同步逻辑,到 show run 流程优化

一、总体架构设计(解决 show run 卡顿的核心)

设计目标

  • show run 不再访问 driver → SDK → 芯片

  • 查询操作毫秒级返回

  • 配置实时同步,保证一致性

  • 大规模设备也不再卡顿

整体架构图

cpp 复制代码
          ┌──────────────────┐
          │   用户/界面       │
          └───────▲──────────┘
                  │ show run
          ┌───────┴──────────┐
          │   网管 NMS/Controller   
          │  (维护 Shadow Config)
          └───────▲──────────┘
                  │ sync + set
          ┌───────┴──────────┐
          │  设备 Agent/CLI   │  ← 只在少数情况访问
          └───────▲──────────┘
                  │
          ┌───────┴──────────┐
          │  driver → SDK → HW│
          └──────────────────┘

二、VLAN Shadow 数据结构设计

以下结构可以满足几乎所有厂商的 VLAN 功能:

cpp 复制代码
{
  "vlans": {
    "10": {
      "exist": true,
      "name": "sales",
      "ports": {
        "ge0/1": "untagged",
        "ge0/2": "tagged"
      },
      "svi": {
        "enable": true,
        "ip": "192.168.10.1/24"
      },
      "qinq": {
        "mode": "none"
      }
    },
    "20": {
      "exist": true,
      "ports": {
        "ge0/3": "untagged"
      }
    }
  },
  "meta": {
    "last_sync_time": "2025-11-24 13:00:00",
    "device_reboot_flag": false
  }
}

关键字段:

  • exist: VLAN 是否存在

  • ports: 每个端口的 tagged/untagged

  • svi: 三层接口存在与否

  • qinq: 描述双 VLAN 业务

  • meta: 同步信息


三、核心流程:SET / GET / Sync

➤ 1. 配置下发(SET)

当 NMS 下发 VLAN 配置时:

cpp 复制代码
发送配置到设备 → 设备返回成功 → NMS 写入 shadow

示例:

cpp 复制代码
add vlan 10 tagged ge0/1, ge0/2

更新 shadow:

cpp 复制代码
shadow.vlans[10].exist = true
shadow.vlans[10].ports["ge0/1"] = "tagged"
shadow.vlans[10].ports["ge0/2"] = "tagged"

➤ 2. show run(GET)

不再访问 driver,不再访问设备!

流程:

cpp 复制代码
NMS 直接读取 shadow 的 JSON → 格式化 → 返回

时间:通常 < 2ms。

彻底解决"show run vlan 卡顿"问题。


➤ 3. 同步机制(Sync)

为了解决"设备被别的系统改配置"等情况,需要同步:

同步触发场景

  • 设备重启 → 自动同步一次

  • 每 10 分钟后台同步一次(不影响前端 show)

  • 配置失败事件 → 修正节点

  • 管理员人工点击"同步设备实际配置"

同步方式

cpp 复制代码
设备一次性捞 driver → 返回当前 VLAN 配置 → NMS 更新 shadow

相比每次 show 都捞,压力低 100 倍。


四、实际落地示例(伪代码)

1. SET(配置下发)

cpp 复制代码
def set_vlan_config(device, vlan_id, port, mode):
    rsp = device.send("set vlan {} {} {}".format(vlan_id, port, mode))
    if rsp.success:
        shadow.vlans[vlan_id]["exist"] = True
        shadow.vlans[vlan_id]["ports"][port] = mode
        save_shadow()

2. GET(show run)

cpp 复制代码
def show_vlan():
    return render_shadow(shadow.vlans)

3. SYNC(校准)

cpp 复制代码
def sync_from_device():
    data = device.send("dump vlan all")  # 只在同步时访问底层
    shadow = parse(data)
    save_shadow()

五、时间性能对比

操作方式 每次 show run 耗时 多 VLAN 情况 设备压力
旧:直接捞 driver 100ms--3000ms VLAN 越多越卡
新:shadow 机制 < 2ms VLAN 再多也不变 极低

"解决 show run 卡的问题"完全可以达到。

相关推荐
奋发向前wcx4 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
ChaoZiLL9 小时前
我的数据结构4-栈和队列
数据结构
miller-tsunami9 小时前
顺序表相关知识点
数据结构·顺序表
华玥作者12 小时前
uniapp 万条数据不卡顿:我写了个虚拟列表组件 hy-list,原生支持瀑布流
数据结构·uni-app·list·vue3
2401_8414956412 小时前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂
晚笙coding12 小时前
LeetCode 108:将有序数组转换为二叉搜索树 —— 从数组到平衡二叉树的递归构造
数据结构·算法·leetcode
不如语冰12 小时前
AI大模型入门-模块导入import
数据结构·人工智能·pytorch·python
岑梓铭13 小时前
《考研408数据结构》第七章(7.1 查找:顺序查找、折半查找、分块查找)复习笔记
数据结构·笔记·考研·408·ds·查找
壹号用户13 小时前
c++入门之list了解及使用
数据结构·list
来一碗刘肉面13 小时前
什么是双端队列
数据结构·链表