夜莺监控设计思考(二)边缘机房架构思考

夜莺监控设计思考系列第二篇,解释多数据中心、弱网络链路和本地数据源场景下,为什么需要 n9e-edge 边缘告警引擎,以及边缘架构如何在中心统一管理规则和本地执行告警之间做取舍。

作者 巴辉特

这将是一个系列,讲解 夜莺监控 的设计思考。你可以把它理解为:原理、最佳实践和产品设计时的折中取舍。

本系列其他文章:

下面开始第 2 篇。

核心要点

  • 夜莺边缘机房架构解决的是多数据中心、跨地域弱网络下的告警判定可靠性问题。
  • 告警引擎会高频查询数据源,如果中心端跨机房访问远端数据源,经常超时就会影响告警准确性。
  • n9e-edge 的作用是把告警判定下沉到边缘机房,让它靠近本地 Prometheus、VictoriaMetrics、ElasticSearch 等数据源。
  • 中心端 n9e 仍负责统一规则管理,边缘端 n9e-edge 从中心同步规则并缓存到内存中执行。
  • 网络临时中断时,边缘端规则短期无法更新,事件也可能无法写回中心,但本地告警判定和外部通知仍可继续工作。

上一篇遗留了一个问题:如果公司有多个数据中心,而且数据中心之间网络链路较差,此时应该怎么办?

问题场景:多数据中心和本地数据源

举个例子,假设公司有北京、上海、美东三个数据中心。北京和上海之间有良好的专线打通,但美东和国内网络链路较差。

北京、上海、美东三地都部署了服务,指标和日志都选择落在本地,而不是传输到中心。假设指标使用 VictoriaMetrics 存储,日志使用 ElasticSearch 存储,整体示例如下:

北京、上海机房之间网络链路很好,可以姑且看成一个大机房,用一套夜莺统一处理。例如把夜莺部署在北京机房,让夜莺读取北京、上海的数据源并做告警判定。

美东就不能这么处理。如果让北京机房的夜莺读取美东数据源做告警,跨地域网络经常超时,告警判定就会变得不可靠。

为什么告警引擎要靠近数据源

告警判定是周期性的,例如每 15 秒执行一次。这个动作非常频繁,并且对查询结果的稳定性很敏感。

如果告警引擎和数据源之间网络不稳定,会出现几类问题:

  • 查询超时,导致本该触发的告警没有触发。
  • 查询失败被误认为数据恢复,导致告警状态不准确。
  • 网络抖动引入大量噪声,让排障人员难以判断是真故障还是链路问题。
  • 中心端同时查询多个远端数据源时,整体延迟和失败率会被放大。

因此,弱网络场景下的最佳实践是把告警引擎部署到数据源旁边。这样告警引擎查询本机房数据源,网络链路更短、更可控。

夜莺边缘架构模式

夜莺为这种场景引入了边缘机房部署架构:把告警引擎抽离出来作为一个单独模块,部署到边缘机房。

这个边缘模块可以从中心端夜莺同步告警规则,把规则存在内存里,然后查询本地数据源的数据,做告警判定。

架构示意图如下:

夜莺中心端进程叫 n9en9e 是 Nightingale 的缩写。边缘机房单独部署的进程叫 n9e-edge。在图中的例子里,美东机房部署了一个 n9e-edge 进程。

n9e-edge 需要连接中心端 n9e,所以要在 n9e-edge 的配置文件中指定中心端 n9e 的 HTTP 地址和认证信息(如需)。

中心端和边缘端如何分工

夜莺边缘架构的关键,是把“规则管理”和“规则执行”分开:

职责 中心端 n9e 边缘端 n9e-edge
告警规则配置 负责 不负责
规则同步 提供规则接口 从中心拉取规则
告警判定 可负责中心数据源 负责边缘本地数据源
数据源访问 访问网络质量好的数据源 访问本机房数据源
告警事件展示 中心页面展示 尽量写回中心
外部通知 可通知 可直接通知钉钉、企微、Slack 等

这个分工的目标很明确:中心端统一管理,边缘端本地执行。

网络中断时会发生什么

如果美东和北京的网络临时中断,影响分几层看:

  1. n9e-edge 无法从北京的 n9e 同步最新告警规则。
  2. n9e-edge 产生的告警事件可能无法写到中心数据库,因此页面上可能看不到相关事件。
  3. 只要美东外网出口正常,n9e-edge 仍然可以把告警事件推送出去,因为钉钉、企微、Slack 等告警媒介都是外网 SaaS 服务。

所以,短时间网络中断不等于边缘机房失去告警能力。它主要影响规则更新和中心端事件可见性,不影响 n9e-edge 基于内存规则继续查询本地数据源并发出通知。

什么时候需要 n9e-edge

不是所有多机房都需要边缘架构。判断是否需要 n9e-edge,可以看几个条件:

判断问题 如果答案是“是”
数据源是否分散在多个机房? 需要评估中心端查询延迟
跨机房网络是否经常超时或抖动? 倾向部署 n9e-edge
告警判定是否依赖高频查询? 告警引擎应靠近数据源
边缘机房是否能访问外部通知媒介? 断网时仍可直接通知
是否需要中心统一管理规则? 使用中心 n9e + 边缘同步模式

如果北京、上海之间网络非常好,可以继续用中心 n9e 统一查询;如果美东、海外、专线不稳定机房经常出现查询超时,就应该考虑部署 n9e-edge

FAQ

n9e-edge 是否需要直接访问中心数据库?

不需要。原文描述中,n9e-edge 是连接中心端 n9e 的 HTTP 地址和认证信息,从中心端同步告警规则,而不是直接读中心数据库。

网络断了以后,边缘规则会不会立刻失效?

不会。n9e-edge 会把同步到的规则缓存在内存中。网络断开后,规则短期无法更新,但已有规则仍然可以继续用于本地告警判定。

边缘机房产生的告警一定能在中心页面看到吗?

不一定。如果边缘机房到中心端网络中断,n9e-edge 产生的告警事件可能无法写回中心数据库,中心页面就可能看不到。但只要外网通知通道可用,告警仍然可以推送出去。

只有指标数据源才需要边缘告警吗?

不只指标。原文示例里既有 VictoriaMetrics 指标存储,也有 ElasticSearch 日志存储。只要告警判定需要频繁查询远端数据源,并且跨机房网络不稳定,都可能需要边缘化。

小结

夜莺边缘机房架构的核心不是把系统做复杂,而是让告警判定靠近数据源。

中心端 n9e 负责统一管理规则,边缘端 n9e-edge 负责在本机房查询本地数据源并执行告警判定。这样既保留中心化管理体验,又避免弱网络链路影响告警准确性。

本篇先到这里。下一篇预告:夜莺没有自研时序存储,却又提供了 agent,有点拧巴,到底是为什么?

延伸路径

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

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

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云