
去年11月份,我写过一篇《混合云监控架构:Prometheus + VictoriaMetrics 实现数据容灾》,提出了“云端短期采集 + 本地长期存储”的容灾架构。
后来我对此架构有做了一些升级。而就在昨天,我恰好真实经历了一次“灾难”。
昨天,我给本地机房的运行 VictoriaMetrics 的 Ubuntu 虚拟机从 AMD 宿主机热迁移到 Intel 宿主机时,因跨厂商指令集缓存冲突,系统直接爆出 Kernel Panic,网络层也彻底瘫痪。本地机房的 Metrics 核心存储节点,这下给宕机了。
但这并不是一篇“删库跑路”的检讨书。相反,我的告警系统依然稳稳的,所有监控数据照常查询,所有告警都能正常播报。
在上一版架构中,云端使用的是 Prometheus 作为采集和短期存储。但在今年的架构演进中,我将采集层全部替换为了 VictoriaMetrics 家族的 vmagent。

这套监控架构的核心设计思想是:写入端强解耦,查询端高可用,存储端冷热分层。
1. 采集端:vmagent 统一抓取与缓冲
vmagent 实例定时抓取。vmagent 层面配置了 5GB 的本地磁盘缓冲(Disk Buffer)。按照我们当前的指标体量,这 5GB 缓冲足以兜底长达 24 小时的机房网络中断或节点宕机。2. 数据流向:异地实时双写 (Geo-Dual-Write)
vmagent 在获取到数据后,不进行任何本地积压,而是立刻开启并行 Remote Write,将指标数据同时写入两个异地存储节点。一旦任意一端写入失败,会将失败的数据块暂存入上述的 5GB 队列中等待节点上线重发。
3. 存储层:冷热数据分层 (Data Tiering)
4. 查询层:基于 HAProxy 的自动故障转移 (Auto-Failover)
HAProxy 作为查询网关。Grafana 的所有查询请求都直接发往 HAProxy。当本地机房节点 Kernel Panic 离线后,vmagent 立即探测到 xxx.xxx.xxx.xxxx:8428 无法路由。但在监控终端,和告警播报端毫无感知。
得益于我们的高可用网关设计,当底层检测到本地节点不可用时,触发了自动故障转移(Auto-Failover)。Grafana 的数据源查询请求无缝 Fallback 到云端的 7 天热数据节点。虽然无法查看去年的历史数据(平滑降级),但最近 7 天的面板和所有实时的告警规则依然精准触发。告警引擎,零延迟,零宕机。
机房宕机这几个小时,vmagent 在云端默默扛下了所有。它迅速启用了配置中的 -remoteWrite.tmpDataPath,将原本要发往厦门机房的数据全部转存到云服务器的本地磁盘。
当我将虚拟机关机重新冷启动,恢复本地节点后,打开 Grafana 看板,可以看到 HAProxy 已经将查询流量切换到了本地节点,看板上的指标线条,虽然有着一整晚十个多小时的空白,但是却正在一点一点的往右增长,那是 VMAgent 在将数据写回。
稍作等待,再刷新看板,发现数据已经完全刷写完成了。