从架构到数据结构,到同步逻辑,到 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 卡的问题"完全可以达到。

相关推荐
我能坚持多久4 分钟前
【初阶数据结构01】——顺序表专题
数据结构
rainbow68891 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
xuxie992 小时前
day 21 双向链表以及循环链表
数据结构·链表
历程里程碑3 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
梵刹古音3 小时前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
爱敲代码的TOM5 小时前
数据结构总结
数据结构
皮皮哎哟6 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
堕2747 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
2302_813806227 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构