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

相关推荐
H.莓飛1 小时前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
码少女2 小时前
数据结构——B+树基础
数据结构·b树
揽星河..4 小时前
【初阶数据结构】常见的排序算法
数据结构·排序算法·1024程序员节
YLCHUP5 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
啊啊啊啊啊!!!!5 小时前
【c++】⽤哈希表封装myunordered_map和myunordered_set
数据结构·哈希算法·散列表
(●—●)橘子……5 小时前
力扣 第525场周赛 练习理解
数据结构·python·学习·算法·leetcode
Tt有了t5 小时前
Redis的数据结构
数据结构·数据库·redis
東隅已逝,桑榆非晚6 小时前
map和set的使用
数据结构·c++·笔记·学习
2601_970703836 小时前
除湿机原理研究报告:一台机器在物理上能走多远
大数据·数据结构·算法·数据库架构·推荐算法
若亦_6 小时前
排序>>选择排序
数据结构·算法·排序算法