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

相关推荐
jllws11 小时前
数据结构_字符和汉字的编码与查找
数据结构
学困昇1 小时前
C++11中的包装器
开发语言·数据结构·c++·c++11
weixin_4577600010 小时前
Python 数据结构
数据结构·windows·python
明洞日记11 小时前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学
开发语言·数据结构·c++
fashion 道格12 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
xxxxxxllllllshi12 小时前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
铁手飞鹰13 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
[J] 一坚14 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
司铭鸿15 小时前
祖先关系的数学重构:从家谱到算法的思维跃迁
开发语言·数据结构·人工智能·算法·重构·c#·哈希算法