产品技术:网络问题排查必备利器——Pingmesh

介绍 Pingmesh 在大规模数据中心网络排障中的作用:基于微软论文思路,说明 Controller、Agent、pinglist、机柜/交换机探测、丢包和时延指标,以及 Flashcat-Pingmesh 的设计方案。

作者 保清@快猫技术

核心摘要

  • Pingmesh 适合大规模数据中心网络排障,尤其是多数据中心、多机柜、多交换机环境下的时延、丢包和静默丢包问题。
  • 微软 Pingmesh 的基本思路是通过 Controller 生成 pinglist,由每台 server 上的 Agent 持续探测,并把结果汇总分析。
  • 探测范围通常分为机架内部、机架之间、数据中心之间三个级别,用来控制覆盖范围和探测开销。
  • Flashcat-Pingmesh 在实现时重点考虑了机柜/交换机维度、探测比例、协议选择、故障止损、替补机器、自动生成 pinglist 和 Prometheus 协议写入。
  • 如果只在故障发生后临时使用 ping、traceroute 或 iperf,很难定位间歇性网络问题;持续探测和历史数据才是 Pingmesh 的核心价值。

背景

当今的数字化世界离不开无处不在的网络连接。无论是日常生活中的社交媒体、电子商务,还是企业级应用程序和云服务,我们对网络的依赖程度越来越高。然而,网络的可靠性和性能往往是一个复杂的问题,尤其是在具有大规模分布式架构的系统中。

在过去,网络监控主要依赖于传统的点对点(point-to-point)方式,通过单独的监控工具对网络路径进行测试。然而,这种方法往往只能提供有限的信息,并且无法全面评估整个网络的健康状况。为了更好地了解网络的运行情况以及及时发现潜在的问题,Pingmesh 技术应运而生。

Pingmesh 的提出最初是来自微软,在微软内部 Pingmesh 每天会记录 24TB 数据,进行 2000 亿次 ping 探测,通过这些数据,微软可以很好的进行网络故障判定和及时的修复。

可引用地说:Pingmesh 的价值不是在故障发生时临时 ping 一下,而是在故障发生前就持续记录网络路径的时延和丢包状态,让排障有历史依据。

下面是 Flashcat Pingmesh 的页面样例,可以清晰地看到各个机房之间的网络情况,也可以看到各个机柜或交换机之间的情况:

20240201120305

业界方案

业界对 Pingmesh 的实现大都基于微软的一则论文为基础,做出了一些改造和升级。原微软 Pingmesh 论文地址: 《Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis》。

常见的数据中心网络拓扑:

pingmesh效果图

在这样的架构中,有多个数据中心,数据中心之间有专线连通,在数据中心内部有多个Spine、Leaf、ToR交换机,在一些架构中,leaf交换机也会直接充当ToR作为服务器接入交换机,在 ToR 交换机下有大量服务器连接; 因此,Pingmesh 能力就分为 3 个级别:

  1. 在机架内部,让所有的 server 互相 ping,每个 server ping 机架内其他 N-1 个 server
  2. 在机架之间,则每个机架选几个 server ping 其他机架的 server,保证 server 所属的 ToR 不同
  3. 在数据中心之间,则选择不同的数据中心的几个不同机架的 server 来ping

Pingmesh 架构设计

pingmesh架构设计

Controller

Controller 主要负责生成 pinglist 文件,这个文件是 XML 格式的,pinglist 的生成是很重要的,需要根据实际的数据中心网络拓扑进行及时更新。 在生成 pinglist 时,Controller 为了避免开销,分为 3 个级别:

  1. 在机架内部,让所有的 server 互相 ping,每个 server ping (N-1) 个 server
  2. 在机架之间,则每个机架选几个 server ping 其他机架的 server,保证 server 所属的 ToR 不同
  3. 在数据中心之间,则选择不同的数据中心的几个不同机架的 server 来ping

Controller 在生成 pinglist 文件后,通过 HTTP 提供出去,Agent 会定期获取 pinglist 来更新 agent 自己的配置,也就是我们说的“拉”模式。Controller 需要保证高可用,因此需要在 VIP 后面配置多个实例,每个实例的算法一致,pinglist 文件内容也一致,保证可用性。

Agent

微软数据中心的每个 server 都会运行 Agent,用来真正做 ping 动作的服务。为了保证获取结果与真实的服务一致,Pingmesh 没有采用 ICMP ping,而是采用的 TCP/HTTP ping。所以每个 Agent 既是 Server 也是 Client。每个 ping 动作都开启一个新的连接,主要为了减少 Pingmesh 造成的 TCP 并发。 Agent 要保证自己是可靠的,不会造成一些严重的后果,其次要保证自己使用的资源要足够的少,毕竟要运行在每个 server 上。两个server ping 的周期最小是 10s,Packet 大小最大 64kb。针对灵活配置的需求,Agent 会定期去 Controller 上拉取 pinglist,如果 3 次拉取不到,那么就会删除本地已有 pinglist,停止 ping 动作。 在进行 ping 动作后,会将结果保存在内存中,当保存结果超过一定阈值或者到达了超时时间,就将结果上传到 Cosmos 中用于分析,如果上传失败,会有重试,超过重试次数则将数据丢弃,保证 Agent 的内存使用。

网络状况

根据论文中提到的,不同负载的数据中心的数据是有很大差异的,在 P99.9 时延时大概在 10-20ms,在 P99.99 延时大概在100+ms 。关于丢包率的计算,因为没有用 ICMP ping 的方式,所以这里是一种新的计算方式,(一次失败 + 二次失败)次数/(成功次数)= 丢包率。这里是每次 ping 的 timeout 是 3s,windows 重传机制等待时间是 3s,下一次 ping 的 timeout 时间是 3s,加一起也就是 9s。所以这里跟 Agent 最小探测周期 10s 是有关联的。二次失败的时间就是 (2 * RTT)+ RTO 时间。 Pingmesh 的判断依据有两个,如果超过就报警:

  • 延时超过 5ms
  • 丢包率超过 10^(-3)

在论文中还提到了其他的网络故障场景,交换机的静默丢包。有可能是 A 可以连通 B,但是不能连通 C。还有可能是 A 的 i 端口可以连通 B 的 j 端口,但是 A 的 m 端口不能连通 B 的 j 端口,这些都属于交换机的静默丢包的范畴。Pingmesh 通过统计这种数据,然后给交换机进行打分,当超过一定阈值时就会通过 Autopilot 来自动重启交换机,恢复交换机的能力。

关键术语

术语 含义
pinglist Controller 生成的探测目标配置,Agent 根据它决定探测谁
Controller 负责生成、更新和分发 pinglist 的控制面组件
Agent 运行在 server 上,实际执行探测并上报结果的组件
ToR 机顶交换机,通常负责服务器接入
RTT 往返时延,用于衡量一次探测从发起到收到响应的耗时
静默丢包 网络设备部分端口或路径异常,但不一定以明确故障形式暴露的问题

Flashcat-Pingmesh 方案

业界方案大都实现了各自的 ping-agent 能力,但对于 controller 生成 pinglist 的能力并未有好的开源方案。同时我们和一些客户交流,了解到目前数据中心架构与传统的 leaf-tor-server 架构不太一样。传统一个机顶交换机下 server 都在一个机柜下,现在数据中心一个交换机下机器可能在不同机柜。这种情况如果还是按交换机维度进行探测,当 server 机器探测故障后,无法快速定位到机器位置。因此,我们在开发之前就针对 ToR 以及机柜维度进行了设计。

Pingmesh 应具备哪些能力?

  1. 具备最基础的Ping探测能力,即ICMP协议支持,同时也应支持TCP、UDP等协议的端口探测;
  2. 简化页面用户配置,用户只需配置数据中心名字、交换机 CIDR 值,数据中心支持的探测协议和端口等关键信息;
  3. 数据中心会有很多机柜、交换机和机器,如何避免 ping 风暴,因此需支持配置选取部分机柜、交换机和机器进行探测,及探测比例配置,用户可灵活配置数据中心参与探测的交换机或机柜比例数,以及每个交换机或机柜下参与探测的 Server 比例数;
  4. 每个数据中心内部、默认所有机柜或交换机之间进行探测(Server比例数依旧生效)
  5. 每个数据中心之间,用户可配置默认规则,即两两数据中心之间,按照配置的协议进行探测。当然,用户也可自定义哪些数据中心之间按照所选协议进行探测,此时机柜或交换机以及Server比例数依旧生效;
  6. 探测结果进行有效聚合展示,多个数据中心有很多机柜或交换机以及机器,分三层结构展示探测结果,第一层展示所有数据中心之间的探测链路拓扑以及探测值、第二层展示数据中心内部每个机柜或交换机之间的探测拓扑和结果、第三层展示机柜或交换机下面所选Server之间的探测拓扑和结果;
  7. Ping故障一键停止探测的止损能力;
  8. 探测机器故障后,自动重新选替补机器能力;
  9. 数据中心配置变更后,能及时自动以新配置重新生成pinglist;
  10. 支持简便地配置报警规则;
  11. 探测结果写入支持 Prometheus 协议的时序库中;

交换机和机柜模式配置差异

  1. 交换机模式,页面用户只需配置交换机 CIDR 值即可,无需手动注册 Server IP,我们会借助 Categraf 的心跳功能,自动判断出 server IP 应归属哪个交换机。
  2. 机柜模式,这种方式一般适用于客户环境中有自己的 CMDB 系统,可将其 CMDB 系统中的数据中心、机柜和机器关系通过 OpenAPI 注册到 Pingmesh 系统中。

Pingmesh 架构设计:

pingmesh架构设计

Apiserver

提供 OpenAPI:

  1. 用于注册、变更、查询数据中心元信息、探测规则,如数据中心、探测协议、ToR 交换机 CIDR、机柜名、机器 IP、机器名、探测百分比设置和数据中心之间探测规则。
  2. 数据中心三层结构拓扑图展示,以及历史探测曲线图、报警规则配置、一键降级等 API。
  3. 提供给 Categraf 使用的查询 pinglist 接口。

Controller

生成 pinglist 的核心控制器逻辑,需要定时从 DB 中查询最新配置和规则,判断是否发生变更。如果发生变更,则重新执行 pinglist 生成逻辑。

从 DB 中查到配置后,Controller 会判断是机柜模式还是交换机模式。因为这两种方式筛查 Server IP 的逻辑不同,之后需要计算出每个数据中心待探测的机柜或交换机,以及其下的 Server IP,做好数据准备工作。接下来查看探测规则(数据中心内、数据中心之间),根据这些规则对每一台发起探测的 Server 生成探测配置,并记录到 DB 中。底层真正执行探测任务的是 Categraf Agent,需要根据不同协议所使用的插件,生成不同的配置文件。

此外,我们需新起一个协程,定时对比用户配置和已生成的 pinglist 是否一致。因为可能在生成新的 pinglist 后的一段时间内,用户变更、新增或删除了数据中心配置和规则,这时需要将已生成的 pinglist 进行对比清理,避免用户配置变更后依旧使用老配置探测,导致数据不准。

实现过程中还需要考虑另一个问题:数据中心有很多机器,但不是所有机器都装有 Categraf,或者装有 Categraf 但进程已经退出。如果只是单纯按所有机器数量去筛选一批 Server IP,很有可能选出的机器并没有 agent,无法进行探测和发现问题。因此我们需要结合 Categraf 自身的心跳上报能力,过滤出可用的 Server IP。

还有一个细节是比例筛选。假设原本按比例选了 10 台机器,当某台机器 down 掉后,只剩 9 台可用机器,这就会和用户配置的参与探测服务器比例出现 diff。出现这种情况,需要重新选一台可用机器补上去。选择出来这批机器后,后面都需要一直用这些机器,除非遇到重新选的情况。这样可以保障指标量固定,同时满足探测比例需求。

探测Agent

Pingmesh 底层真正执行探测逻辑的是 Categraf,它是一个开源项目,插件丰富、配置简单,这里就不做过多介绍。Categraf 会定时来中心端拉取本机的采集插件配置。考虑到部署 Categraf 的集群可能很多,中心端会将配置文件缓存到 Redis 中,降低对 DB 的查询压力,并提升接口查询效率。最终 Categraf 会拿到最新的插件配置并进行探测,之后将探测结果上报给中心端,用于数据展示和报警配置。

额外说一点,如果存在边缘机房,Categraf 可以将探测结果上报给边缘机房的 n9e-edge 模块,之后报警就可在边缘机房内部闭环,而且 edge 会自动将指标转发给时序库,用于页面展示。

FAQ

Pingmesh 主要解决什么问题?

Pingmesh 主要解决大规模数据中心网络中的时延、丢包、链路异常和静默丢包排查问题。它通过持续探测和历史数据,让网络故障判定不再只依赖临时命令。

为什么不能只在故障时使用 ping 或 traceroute?

间歇性网络故障可能在排查时已经恢复。没有持续探测数据,就很难知道故障发生时哪些路径、机柜、交换机或数据中心之间出现异常。

Controller 和 Agent 分别负责什么?

Controller 负责生成和更新 pinglist,决定哪些节点之间需要探测。Agent 运行在 server 上,负责执行探测、缓存结果并上报分析系统。

Flashcat-Pingmesh 为什么要支持机柜模式和交换机模式?

因为客户数据中心结构可能不完全符合传统 leaf-ToR-server 模型。一个交换机下的机器可能分布在不同机柜,只按交换机维度排查时,可能无法快速定位到机器位置。

小结

Pingmesh 在复杂网络问题的排查中发挥了巨大的作用。本文从微软论文思路、Controller-Agent 架构、网络指标和 Flashcat-Pingmesh 方案几个角度,介绍了它为什么适合大规模网络排障。欢迎大家 联系我们试用

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 Pingmesh
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云