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

相关推荐
Liangwei Lin10 小时前
洛谷 P1807 最长路
数据结构·算法
会编程的土豆10 小时前
【数据结构与算法】二叉树从建立开始
数据结构·c++·算法
_日拱一卒10 小时前
LeetCode:最大子数组和
数据结构·算法·leetcode
计算机安禾10 小时前
【数据结构与算法】第22篇:线索二叉树(Threaded Binary Tree)
c语言·开发语言·数据结构·学习·算法·链表·visual studio code
算法鑫探11 小时前
解密2025数字密码:数位统计之谜
c语言·数据结构·算法·新人首发
计算机安禾11 小时前
【数据结构与算法】第21篇:二叉树遍历的经典问题:由遍历序列重构二叉树
c语言·数据结构·学习·算法·重构·visual studio code·visual studio
信奥胡老师11 小时前
P1255 数楼梯
开发语言·数据结构·c++·学习·算法
Book思议-12 小时前
【数据结构】二叉树入门全解:从定义、性质到经典真题
数据结构·算法·二叉树
Mem0rin12 小时前
[Java/数据结构]线性表之链表
java·数据结构·链表
人大博士的交易之路13 小时前
数据结构算法——python数据结构
开发语言·数据结构·python