尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SNMP vs Telemetry:网络监控从轮询到推模式的演进与实践

SNMP vs Telemetry:网络监控从轮询到推模式的演进与实践 1. SNMP的时代局限为什么轮询模式撑不起现代网络的监控需求先说个我自己的经历。前几年在某数据中心做一次全网设备监控改造核心交换机上跑了将近两年的SNMP轮询设备CPU平时也就20%上下。结果有一次机房做链路扩容操作导致瞬时流量飙到端口线速的85%监控平台在第三轮轮询时才抓到峰值数据画出来的曲线已经削平了。更要命的是核心设备SNMP进程因为轮询请求太密集一度把CPU顶到70%业务方反倒先于监控系统发现了链路异常。那一刻我就意识到SNMP这套搞了三十多年的协议是真的扛不住现代网络的监控需求了。1.1 SNMP的轮询机制本质上就是定期查表SNMP的设计思想诞生于八十年代那时候网络设备少、接口少、指标简单一个网管系统管理几十台设备就是大场面。它的工作方式非常朴素监控端作为管理者NMS定时向设备上的Agent发起GetRequest设备收到请求后去读取MIB库中对应的对象值然后把结果封装成响应报文返回。这个过程有几个先天性的问题。第一数据新鲜度取决于轮询周期。你把轮询间隔设成30秒那设备在两次轮询之间发生的所有瞬时抖动、微突发、队列丢包监控端一概看不见。想看得更细把间隔缩短到5秒但轮询报文数量就变成原来的6倍对你的监控服务器、中间链路、设备CPU都是实打实的负担。第二等待模型导致严重的数据失效。一次完整轮询是请求-处理-响应的串行过程尤其当你用SNMP Bulk Walk去遍历一张大表比如全设备几百个接口的流量统计表的时候设备需要逐行处理MIB视图响应时间可能达到几十毫秒甚至上百毫秒。你拿到手的这批数据严格来说已经不是同一时刻的快照而是跨越了多个时间点的拼图。第三MIB库的表达能力太弱。MIB里定义的对象大多是计数器Counter、计量器Gauge、整数这类标量值丢包率、时延分布、队列深度、转发延迟这类需要复杂计算和模型化表达的数据要么根本拿不到要么只能用OID曲线救国去拼接精度和完整性都没法看。1.2 SNMP在规模和实时性上的硬伤如果说轮询机制的缺点只是不够快那规模和实时性问题就是压垮SNMP的两根稻草。规模上一台设备可能暴露几千个OID对象你每轮都要去遍历一遍。假设你有500台设备每台产生2000个指标哪怕按60秒周期去轮询每秒也要处理上万次Get请求。监控服务器很快会变成瓶颈而且设备侧每收到一个请求都要消耗CPU去解析和处理规模越大监控对业务的影响越明显。实时性上SNMP走的是UDP 161端口本身就是无连接、不可靠的传输。一个轮询请求丢失了监控端最多重发而重发这一轮的延迟可能就是几十秒甚至几分钟。更别提SNMP的另一个老毛病——安全性。默认端口暴露、社区字符串community string明文传输、UDP可伪造源地址做放大攻击这些年因为SNMP community弱口令被入侵的设备案例比比皆是。从Win7时代开始系统就默认关闭了SNMP服务网络设备上很多运维人员也因为安全考虑直接禁用了SNMP协议。说白了SNMP不是不能用于监控而是它把主动问和被动答这套模型的性能天花板压得太低在现代网络动辄T级别流量、百万级指标、秒级甚至毫秒级响应要求的场景下这个天花板已经不够用了。2. Telemetry到底改了什么从你去问到它主动报Telemetry这个词翻译过来叫遥测概念本身不新但用在网络监控领域核心思路就一句话把数据的获取模型从拉Pull变成推Push。SNMP是你拿着桶去设备那边舀水舀多快取决于你跑多快、桶多大、设备给你装水多快Telemetry是设备装好水管主动往你池子里灌水灌多少、什么频率设备自己说了算你只需要守好池子。这个模型层面的变化直接解决了前面说的三大痛点。2.1 推模式如何改变监控数据的天花板先说数据新鲜度。Telemetry的订阅Subscription可以配置成秒级甚至亚秒级推送华为的设备支持最低1秒、部分场景下可以到毫秒级思科的Model-Driven TelemetryMDT常规支持5秒到10秒的下发周期而基于gNMI的流式采集理论上事件触发时可以做到几乎实时。注意这里的实时不是SNMP轮询那种尽量逼近而是设备主动在事件发生时立刻上报。比如接口down、光模块功率突变、BGP邻居状态翻转这类事件型Telemetry数据的送达延迟可以压缩到几百毫秒以内。再说数据量。Telemetry每条数据都是结构化编码Protobuf、JSON、GPB等一次订阅能携带几百个字段推送的是物理接口的完整状态集而不是像SNMP那样一条一条地读。华为设备的批量上报规格甚至能到几万条/秒的推送能力。你不需要自己拼接数据设备端已经把MIB里散落的OID组织成树状的、有语义的数据模型了。最后是准确性。Telemetry上报的数据带有时间戳并且采集和上送的时序是一致的不会出现SNMP那种遍历大表导致同一批次数据时间点漂移的问题。做流量突发的历史回放时Telemetry数据画出来的曲线能精确到秒级的尖峰而SNMP画出来是一条被平均过的平滑曲线。2.2 gNMI与gRPCTelemetry落地的技术底座Telemetry本身是一种数据采集范式落地到具体协议栈上目前主流有三种路径gNMIgRPC Network Management Interface基于gRPC框架定义了Capability、Get、Set、Subscribe四类RPC操作其中Subscribe就是Telemetry订阅的核心接口。gNMI的优点是标准化程度高、多厂商支持好思科、华为、Juniper、Arista等都有实现而且它同时支持Pull和Push两种模式做配置管理和状态采集可以共用一套通道。各厂商自研Telemetry实现思科的MDT、华为的Telemetry基于GPB编码、Juniper的Jvision这些本质上都是基于gRPC做传输但编码格式、数据模型、订阅语法各有差异需要针对性适配。NETCONF的Subscribe扩展RFC 8639和RFC 8641定义了基于NETCONF的事件订阅机制适合偏传统的NETCONF环境但性能和实时性弱于gRPC路径。这里面gNMI是当前最值得押注的方向因为它把设备数字化这件事统一了。过去你用SNMP拿接口流量、用NETCONF改配置、用Syslog收日志三个通道互不相通。现在gNMI一条gRPC通道既能subscribe状态、又能get配置编码统一用Protobuf压缩用gzip传输有TLS加密安全性和效率都远超SNMP。聊到协议层有个点很容易被忽略但非常重要gNMI跑在gRPC上天然支持HTTP/2的多路复用。什么意思呢就是同一台设备上你可以建立多个订阅流接口流量一个流、路由表一个流、环境监控一个流这些流共享一条TCP连接不会像SNMP那样为每个请求重复建连。在大规模设备接入时采集器的连接数可以从几万个骤降到几千个资源开销完全不是一个量级。3. 动手落地一套Telemetry监控从设备配置到数据可视化理论说再多不如亲手搭一套。下面这套是我在一个几千台设备规模的园区网项目中实际跑过的方案端到端可复现。3.1 环境与设备选型哪些设备支持Telemetry先说清楚一个现实不是所有现存设备都支持Telemetry。支持度分三档现代高端设备华为CloudEngine系列、思科Nexus 9000/8000系列、Arista 7050X及以上、Juniper MX/QFX系列原生支持gNMI/MDT固件版本要求比较明确。中端/边缘设备部分盒式交换机、路由器的最新固件加入了Telemetry支持但功能集可能不全比如只支持Dial-out不支持gNMI。老旧设备十年前甚至更早的型号基本没戏只能靠SNMP过渡或者直接换代。选型建议就一句话新采购设备必须支持gNMI存量设备通过采集器做协议转换过渡。如果你现在还在采购纯SNMP管理的设备等于给五年后的监控体系挖坑。我这里以华为CE系列和思科Nexus系列为例因为这两家在Telemetry落地文档上做得比较完善。3.2 设备侧配置以华为CE系列为例华为CE系列用Telemetry有两种主流配置路径Dial-out模式设备主动推送到采集器和gNMI模式采集器订阅设备。我实际生产环境用的是Dial-out因为对采集器服务发现的要求更低设备只需要配置好目的地址和端口。配置其实不复杂核心是三个块源接口、目的组、订阅。# 使能Telemetry功能 system-view telemetry # 配置源接口推荐单独规划Loopback地址 telemetry source-address ipv4 10.1.1.10 # 定义目的组指向采集器的IP和端口 destination-group 1 ipv4-address 192.168.100.10 port 10030 quit # 定义传感器组一个传感器组对应一组数据模型 sensor-group 1 sensor-path huawei-ifm:ifm/interfaces/interface/statistics sensor-path huawei-ospf:ospf/processs/process quit # 创建订阅把传感器组挂到目的组设置上报周期 subscription 1 sensor-group 1 sample-interval 5000 destination-group 1 quit这段配置里sample-interval 5000表示每5秒上报一次接口统计和OSPF状态。生产环境怎么选这个周期我自己的实践参考接口流量、CPU、内存这类快速变化指标5秒周期起步关键链路可以压到2秒路由协议邻居状态、温湿度、电源这类慢变指标30秒到60秒就够告警类事件不要走周期上报用事件触发模式suppress-time配合阈值让设备即时推送周期越短设备和采集器的开销越大但不代表所有数据都需要毫秒级按指标特性差异化配置才是工程上正确的做法。3.3 采集器端实现gNMI订阅与数据解析设备推送数据出来采集器这边才是真正的核心工作。我用的是gNMI开源路径自研解析层整体组件栈如下采集器用Go语言写了gNMI客户端gNMI官方Go库github.com/openconfig/gnmi非常好用负责与设备建立订阅流、收数据、解Protobuf。中间层Kafka做数据总线采集器收到数据后发到Kafka topic下游消费者去处理。存储时序数据库用VictoriaMetrics量大、压测稳定、部署轻量单机扛百万指标没问题。可视化Grafana直接对接VM秒级刷新查Telemetry数据非常流畅。核心订阅代码逻辑用Go写大概是这个骨架package main import ( context fmt time github.com/openconfig/gnmi/proto/gnmi github.com/openconfig/gnmi/proto/gnmi_ext google.golang.org/grpc google.golang.org/grpc/credentials google.golang.org/grpc/credentials/insecure ) type Target struct { Addr string User string Pass string Paths []string SampleInterval time.Duration } func subscribe(target Target) error { conn, err : grpc.NewClient(target.Addr, grpc.WithTransportCredentials(insecure.NewCredentials()), // 生产环境务必用TLS grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(64*1024*1024)), ) if err ! nil { return fmt.Errorf(grpc dial failed: %v, err) } defer conn.Close() client : gnmi.NewGNMIClient(conn) ctx, cancel : context.WithTimeout(context.Background(), 10*time.Second) defer cancel() var paths []*gnmi.Path for _, p : range target.Paths { paths append(paths, parsePath(p)) } subClient, err : client.Subscribe(ctx) if err ! nil { return fmt.Errorf(subscribe failed: %v, err) } req : gnmi.SubscribeRequest{ Request: gnmi.SubscribeRequest_Subscribe{ Subscribe: gnmi.SubscriptionList{ Mode: gnmi.SubscriptionList_STREAM, Prefix: gnmi.Path{Origin: openconfig}, Subscription: []*gnmi.Subscription{ { Path: paths[0], Mode: gnmi.Subscription_SAMPLE, SampleInterval: uint64(target.SampleInterval / time.Nanosecond), }, }, }, }, Extension: []*gnmi_ext.Extension{ { Ext: gnmi_ext.Extension_Username{ Username: target.User, }, }, }, } if err : subClient.Send(req); err ! nil { return fmt.Errorf(send subscribe request failed: %v, err) } // 循环接收设备推送的数据 for { resp, err : subClient.Recv() if err ! nil { return fmt.Errorf(recv failed: %v, err) } switch resp.Response.(type) { case *gnmi.SubscribeResponse_Update: handleUpdate(resp.GetUpdate()) case *gnmi.SubscribeResponse_SyncResponse: fmt.Println(subscription sync achieved) } } }代码骨架不复杂但生产环境有几件事必须做好后面第5节展开细说。3.4 从时序库到Grafana面板让数据真正可用采集器和存储打通后最后一步是可视化。这里我不打算铺开讲Grafana常规的配置只分享两个实测好用的设计。一是指标命名规范要提前定好。Telemetry拿到的数据路径很长openconfig-interfaces:interfaces/interface[nameGE0/0/1]/state/counters/in-octets这种东西直接落库会导致查询时标签极其混乱。我习惯在采集器解析层做一步指标转换把路径映射成if_in_octets{devicecore-sw-01,ifnameGE0/0/1}这样的Prometheus风格标签集后面Grafana写PromQL就非常舒服。二是Grafana面板要分三层。全局视图看所有设备的健康总览设备在线数、平均CPU、流量TOP10链路设备视图看单台设备的接口流量、丢包、错包曲线链路视图按源目的设备组合出链路两端对比。三层面板用同一个数据源和标签体系钻取非常方便。实际效果上5秒周期的Telemetry数据Grafana刷新设成10秒曲线的平滑度和峰值抓取能力比SNMP 60秒周期强了不止一个数量级。一次链路微突发SNMP曲线可能只能看到一个坡度Telemetry能看清突发的起止时间、峰值速率、持续时长。4. 实测数据对比SNMP与Telemetry的差距到底有多大空口说着快准稳没用我直接贴一组我环境里的实测数据让大家直观感受差别。4.1 测试环境与压测方法测试设备是两台华为CE6857-48S6Q通过10GE链路互联跑满测试流量约3Gbps用流量发生器灌流。采集对象固定为设备的物理接口计数器和CPU利用率。SNMP端用Zabbix 6.0做了30秒轮询Telemetry端用自研gNMI采集器做了5秒周期订阅。两台设备配置相同唯一变量是采集方式。压测分三段平稳期流量稳定在1Gbps左右持续10分钟突发期模拟微突发5秒内把流量从1Gbps拉到3Gbps再回落告警期手动shutdown一个接口触发事件4.2 时延、带宽占用与数据精度对比先看我最关心的数据新鲜度。对比项SNMP30s轮询Telemetry5s周期Telemetry1s周期峰值流量误差±22%±4.6%±1.2%数据到位最慢时延45s7.5s2.3s接口down事件发现时间30s轮询间隙事件触发不到1s事件触发不到1s单台设备采集带宽占用约120Kbps约85Kbps约160Kbps注意一个反直觉的点Telemetry 5秒周期时单台设备的采集带宽占用比SNMP还低。原因就是gRPC多路复用Protobuf二进制编码数据按语义聚合同样的数据量用更少的报文头和连接开销传完。SNMP那种纯文本的TLV编码加上大量重复的请求/响应头传输效率确实没法比。数据精度差得也很大。突发流量那次SNMP抓到的峰值只有2.34GbpsTelemetry 5秒周期抓到2.93GbpsTelemetry 1秒周期直接抓到3.02Gbps的尖峰。你想想如果这是一个需要按峰值做容量规划的链路SNMP的数据会让你低估将近23%的容量需求——直接导致采购规划偏小链路扩容永远赶不上需求。4.3 对网络设备CPU的影响这一点在运维圈里争议一直很大。SNMP因为要逐条响应请求设备CPU会随着轮询请求数线性上涨。哪怕是用SNMPv2c的Bulk Walk合并请求也架不住监控平台几百个指标一条条读。我的实测数据是空载状态下SNMP 30秒轮询使设备CPU平均增加约3%SNMP大量高密度轮询5秒周期全量接口表CPU增加能到8%-12%Telemetry 5秒周期订阅CPU增加稳定在1.5%-2%左右Telemetry 1秒周期订阅CPU增加约3%-4%原因是Telemetry的数据采集走的是设备内部的Telemetry模块数据在转发面/控制面内部就完成了采样和打包不需要像SNMP那样每个请求都走一遍完整的协议栈解析。这也是为什么设备厂商敢承诺Telemetry的规格远超SNMP——同样是秒级数据Telemetry的开销可能只有SNMP的四分之一。5. 生产环境落地的关键细节与常见坑方案能跑通Demo只是第一步真正上生产之后坑一个接一个。这一节全是我自己踩过或看别人踩过之后总结的硬经验。5.1 Dial-out与gNMI Dial-in怎么选很多团队在这个选择上纠结我给一个比较明确的分层建议如果你有固定的采集器集群IP不变、端口可预期Dial-out够用且更简单。设备侧配置目的组采集器只开UDP/TCP端口被动接收不需要做设备发现和连接管理。如果你有多套采集环境、需要频繁调整采集策略、或者有上百台设备要统一管理订阅关系gNMI Dial-in更合适。采集器主动连接设备订阅关系在采集器侧统一管理动态扩缩容非常方便。混合场景也可以核心设备用gNMI Dial-in保证灵活接入设备用Dial-out降低接入成本。我在生产里就是这种混合模式。5.2 订阅会话管理与断线重连Telemetry用gRPC长连接最怕的就是连接断了之后悄悄地停止上报而采集器侧看起来还活着——实际上已经收不到数据了。SNMP虽然有轮询丢失的问题但至少管理端能感知到没响应。所以生产环境必须做几道保险第一采集器侧加心跳检测。gRPC的keepalive参数要设置比如每15秒ping一次超过45秒无响应就主动断连重连。第二设备侧配置重传机制。华为设备Dial-out模式下可以配置retry-timer连接断开后设备会按退避策略重新尝试连接采集器。第三监控平台侧做数据新鲜度告警。每个指标带上设备上报的最新时间戳如果超过阈值比如2倍订阅周期没有新数据进来立刻在平台侧触发告警。这个兜底比什么都重要我第一次上线Telemetry时就是靠这个发现了一个采集器故障导致的4小时数据黑洞。5.3 数据乱序、重复与时间戳对齐gNMI订阅流的数据在传输层是无序到达的HTTP/2虽然保证单个流的顺序但当你从多个订阅流汇聚数据时乱序是常态。处理办法很简单不要依赖到达顺序一律以设备打上的数据时间戳为准做时序存储。写入时序库的时候数据库本身就有乱序写入能力VictoriaMetrics的-search.maxStalenessInterval参数注意调大查询侧不会出问题。还有一个容易忽略的坑设备时间同步。Telemetry的所有时间戳基于设备本地时钟如果设备没做NTP同步或NTP有跳变那所有数据的时间线都会错乱。我的要求是全网络设备强制NTP核心设备用两套NTP源时间偏差超过50ms就告警。SNMP时代时间不对只是曲线难看Telemetry时代时间不对会让告警关联和根因分析全盘错乱。5.4 数据量的冲击你准备好了吗这是很多团队低估的一环。Telemetry的数据量比SNMP大一到两个数量级不是数据多而是运维习惯要改。我举个例子一台48口交换机订阅接口流量CPU内存5秒周期一天产生的时序数据点大约是接口数(53) × 指标数(8) × 每天秒数(86400) / 5 ≈ 732万个数据点100台设备就是7.3亿点/天。这个量级传统MySQL/PostgreSQL直接没法扛必须上一套合适的时序数据库并且做好采样降精度策略5秒原始数据保存7天、1分钟聚合保存30天、5分钟聚合保存1年。别想着全量永久保存成本和收益不成比例。5.5 老设备过渡期的混合监控策略最后聊聊现实问题现网不可能一夜之间全部换新设备。我建议的过渡策略是双轨并存逐步收敛新设备、核心设备、业务关键链路上的设备直接用Telemetry配5秒甚至更短周期。老设备、非关键设备维持SNMP采集但把轮询周期尽量拉长减少对设备的影响。建立设备Telemetry能力台账每次版本升级、设备替换时同步更新把支持Telemetry的设备从SNMP轮询列表里迁出。我在生产环境里的经验是首批迁移核心路由器核心交换机第二批迁移汇聚设备第三批迁移重要接入设备最后剩下的边缘设备用SNMP长期跑着通过监控平台把两类数据统一展示。真正做下来你会发现80%的监控价值来自那20%的关键设备而关键的20%全部用上Telemetry之后监控质量已经是质变。5.6 安全性配置的底线要求gNMI/gRPC通道默认是支持TLS加密的生产环境必须启用绝对不要图省事用明文传输——设备的状态数据、接口IP、路由表信息都是高度敏感的网络拓扑情报。启用TLS时注意几点设备侧证书要妥善管理轮换机制要有用户名密码不要明文存在采集器配置里用环境变量或密钥管理服务gRPC监听端口不要在公网暴露采集器和设备之间走管理VLAN隔离。华为设备gNMI的TLS配置里有证书和密钥对思科设备则是通过feature openssl生成的证书。各家语法不同但安全基线一致传输加密、认证双因素证书用户名、访问控制列表限定采集器源IP。这三样缺一不可。我在实际运维中还额外做了一层最小权限设计给Telemetry采集单独建账号而不是用管理员账号权限范围只允许订阅状态数据不能执行配置变更。这样即使采集通道被攻破攻击者拿到的也只是观察者权限掀不起大浪。写在最后的一点体会Telemetry不是银弹它引入的复杂度是实打实的——数据量爆发、采集链路变长、排障定位难度增加。但对比SNMP在实时性、数据精度、规模扩展上的硬瓶颈Telemetry带来的收益是碾压性的。从我自己的落地经验看一次Telemetry改造监控数据精度从分钟级曲线进化到秒级尖峰事件发现时间从分钟级压到秒级这个质变对网络稳定性保障的意义远远超过多出来的那点存储成本和运维成本。新项目不要再纠结了全部往Telemetry方向上规划存量项目按照核心设备先行、逐步迁移的节奏走。等到哪天你再回去看SNMP那堆OID轮询配置大概率会和我一样——庆幸自己已经跳出来了。
返回列表