当前位置: 首页 > news >正文

夜莺监控 - 边缘告警引擎架构详解

前言

夜莺类似 Grafana 可以接入多个数据源,查询数据源的数据做告警和展示。但是有些数据源所在的机房和中心机房之间网络链路不好,如果由 n9e 进程去周期性查询数据并判定告警,那在网络链路抖动或拥塞的时候,告警就不稳定了。所以,夜莺引入了边缘告警引擎:n9e-edge。n9e-edge 进程部署在边缘机房,和边缘机房的时序库部署在一起,由 n9e-edge 负责边缘机房的告警判定工作,这样整个架构就稳定的多了。

架构详解

为了说明这个架构下的告警引擎工作原理,我画了一张架构图:

我们这里假设贵司有 3 个机房:中心主力机房、边缘机房 A 和边缘机房 B,其中边缘机房 A 和中心机房之间有专线,网络链路很好,边缘机房 B 和中心机房之间没有专线,走公网,网络链路不够可靠。

n9e 进程部署在中心主力机房,n9e 依赖 mysql 和 redis,所以 mysql 和 redis 也部署在中心主力机房。如果你想做高可用,中心机房的 n9e 可以部署多个实例,配置文件保持一致,连同一个 mysql 和 redis 即可。

上图中,我们有 5 个数据源:

  • 中心机房有一套 Loki,一套 ElasticSearch
  • 边缘机房 A 有一套 ElasticSearch,一套 Prometheus
  • 边缘机房 B 有一套 VictoriaMetrics

我们希望在中心 n9e 统一查看这 5 个数据源的数据,所以要把这 5 个数据源的访问地址配置到夜莺中,菜单位置:集成中心-数据源,如下图所示:

中心 n9e 可以通过内网地址直接连通中心机房和边缘机房 A 的数据源,但是无法直接连通边缘机房 B 的数据源(因为没有专线),那只能把边缘机房 B 的 VictoriaMetrics 暴露一个公网地址(假设地址为 ex.a.com)出来,中心 n9e 通过公网地址访问边缘机房 B 的 VictoriaMetrics,如下:

架构图中的 1、2、3、4、5 这 5 条线,表示中心 n9e 和 5 个数据源的连接关系。用户在查询数据的时候,是在 n9e 的 web 上查的,发请求给 n9e 进程,n9e 进程此时相当于一个 proxy,把请求代理给后端的各个数据源,然后把数据源的数据返回给用户。

n9e-edge 部署在边缘机房 B,用于处理 B 机房 VictoriaMetrics 的告警判定,n9e-edge 会从中心 n9e 同步告警规则(即图中的 A 那条线),然后把告警规则缓存在内存里,对本机房的 VictoriaMetrics 做告警判定工作。这样的架构下,n9e-edge 和 VictoriaMetrics 是内网连通的,所以告警比较可靠,另外即便 n9e-edge 连不通中心机房的 n9e 了,也不影响 B 机房的告警判定工作,因为 n9e-edge 内存中已经缓存了告警规则。

n9e-edge 产生的告警事件会调用 n9e 的接口写回中心 mysql,调用钉钉、飞书、FlashDuty 等的接口发送通知。如果 n9e-edge 和 n9e 之间网络断了,告警事件就写不到 mysql 了,但是只要 n9e-edge 所在机房的外网出口是好的,告警通知还是可以发出去的。

架构图中:

  • 中心机房的 n9e 负责中心机房的 Loki、ElasticSearch 的告警判定,也负责机房 A 的 ElasticSearch 和 Prometheus 的告警判定
  • 边缘机房 B 的 n9e-edge 负责机房 B 的 VictoriaMetrics 的告警判定

那如何指定不同的数据源和告警引擎之间的关联关系呢?其实是在数据源的管理页面:

上图中:

  • URL 是中心 n9e 读取数据的地址,在上例架构中,需要配置为 B 机房 VictoriaMetrics 的公网地址
  • 时序库内网地址是 n9e-edge 连接 VictoriaMetrics 的地址,如果 URL 已经是一个内网地址了,这个配置项就可以留空,留空之后 n9e-edge 就会使用 URL 中的地址。上例中,由于 n9e-edge 和 VictoriaMetrics 在同一个机房,所以这个地址应该配置为内网地址,这样告警判定更可靠
  • Remote Write URL 是 VictoriaMetrics 的 remote write 写入地址,用于记录规则,即 recording rule,n9e-edge 负责处理记录规则,把结果写回时序库,所以需要知道时序库的 remote write 地址,因为是给 n9e-edge 用的,所以使用内网地址。如果你没有用到夜莺的记录规则,这里可以不用配置
  • 关联告警引擎集群,上图选择的是 edge-b,这是 B 机房 n9e-edge 的名字(由 edge.toml 的 EngineName 字段指定),这样配置之后,就建立了 B 机房 n9e-edge 和 B 机房 VictoriaMetrics 之间的关联关系,就会由这个 n9e-edge 来处理 B 机房 VictoriaMetrics 的告警规则和记录规则

新版本的夜莺,n9e-edge 依赖一个 redis,所以需要在 B 机房部署一个 redis 给 n9e-edge 使用,注意,n9e-edge 所用的 redis 和中心机房 n9e 所用的 redis 不是一个。架构图中我特意标注了 R1、R2 两个名字,表示两个 redis,分别给 n9e 和 n9e-edge 使用。

最后说一下 categraf,如果网络链路比较好,categraf 可以把数据直接上报到中心机房的 n9e,比如中心机房和 A 机房的 categraf 都可以直接对接到中心机房的 n9e,但是 B 机房部署了 n9e-edge,那 B 机房的 categraf 就应该对接到 B 机房的 n9e-edge。

配置样例

要达到上述架构,各个组件的配置文件应该如何配置?这里给出一个示例。

中心机房 n9e 配置

中心机房 n9e 的默认配置文件是 etc/config.toml

[HTTP.APIForService]
Enable = true
[HTTP.APIForService.BasicAuth]
user001 = "ccc26da7b9aba533cbb263a36c07dcc5"
user002 = "ccc26da7b9aba533cbb263a36c07dcc6"

重点就是 HTTP.APIForService 这块的配置。默认 Enable 是 false 是为了安全考虑,即默认不支持 n9e-edge 架构,如果要支持,需要改成 true。n9e-edge 调用 n9e 的接口时,可以使用 BasicAuth 认证,即 HTTP.APIForService.BasicAuth 下面的部分,上例中配置了两个用户,分别是 user001 和 user002,密码是 ccc26da7b9aba533cbb263a36c07dcc5 和 ccc26da7b9aba533cbb263a36c07dcc6。其实配置一个用户就行,我配置两个只是为了演示。另外,如果你的 n9e 暴露在公网,千万要修改 BasicAuth 的默认密码,不然很容易被攻击。

边缘机房 n9e-edge 配置

边缘机房 n9e-edge 的默认配置文件是 etc/edge/edge.toml,首先 n9e-edge 要调用中心 n9e 的接口,所以要配置中心 n9e 的地址:

[CenterApi]
Addrs = ["http://N9E-CENTER-SERVER:17000"]
BasicAuthUser = "user001"
BasicAuthPass = "ccc26da7b9aba533cbb263a36c07dcc5"
# unit: ms
Timeout = 9000

N9E-CENTER-SERVER:17000 表示中心 n9e 的地址,你按照自己的环境调整即可。BasicAuthUser 和 BasicAuthPass 是中心 n9e 的 BasicAuth 用户名和密码,如果中心 n9e 没有开启 BasicAuth,这两个字段可以不填。还是那句话,千万要修改 BasicAuth 的默认密码,不然很容易被攻击。

新版本 n9e-edge 依赖 redis,所以要配置 redis 地址,默认应该是在 edge.toml 的最下面,自行修改即可。如果你是老版本,不依赖 redis,那就不用配置了。如何分辨你的版本的 n9e-edge 是否依赖 redis?就看你下载下来的 edge.toml 默认配置中是否带有 redis 配置,带了就说明依赖 redis。

边缘机房 categraf 配置

主要是注意 2 个地方,writer 的地址和 heartbeat 的地址,都配置为 n9e-edge 的地址:

...
[[writers]]
url = "http://N9E-EDGE:19000/prometheus/v1/write"...
[heartbeat]
enable = true# report os version cpu.util mem.util metadata
url = "http://N9E-EDGE:19000/v1/n9e/heartbeat"
...

N9E-EDGE:19000 表示 n9e-edge 的地址,注意,n9e-edge 默认监听的端口是 19000,也可以在 edge.toml 中自行修改。

ibex 配置

ibex 部分,即故障自愈的功能,这个功能有些公司担心安全问题不开放。如果你们要开启这个功能,同样的道理,在 edge.toml 中开启:

[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

然后边缘机房的 categraf 连边缘机房的 n9e-edge 的 20090 端口即可,即 categraf 的 config.toml 要做如下配置:

[ibex]
enable = true
## ibex flush interval
interval = "1000ms"
## n9e ibex server rpc address
servers = ["N9E-EDGE-IP:20090"]
## temp script dir
meta_dir = "./meta"

N9E-EDGE-IP:20090 表示 n9e-edge 的 RPC 地址。注意这是 RPC 地址,不是 HTTP 地址,所以,不要在 N9E-EDGE-IP 前面画蛇添足加上 http:// 啦。

其他适用场景

除了网络链路不好的场景之外,有时为了安全考虑,网络也会有分区,比如某个网络区域只有一台中转机可以连通中心的 n9e,其他机器都不能连通,这时候就可以在中转机上部署 n9e-edge,然后其他机器的 categraf 连中转机的 n9e-edge 即可。

总结

这个边缘机房告警引擎的模式听起来稍微有点复杂,不过对提高监控系统的可用性有很大帮助,多读两遍本文,理解架构了就容易了,希望本文可以帮到你,加油!

相关文章:

夜莺监控 - 边缘告警引擎架构详解

前言 夜莺类似 Grafana 可以接入多个数据源,查询数据源的数据做告警和展示。但是有些数据源所在的机房和中心机房之间网络链路不好,如果由 n9e 进程去周期性查询数据并判定告警,那在网络链路抖动或拥塞的时候,告警就不稳定了。所…...

18440二维差分

18440二维差分 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q scanne…...

安全传输,高效共享 —— 体验FileLink的跨网文件传输

在当今数字化转型的浪潮中,企业在进行跨网文件传输时面临诸多挑战,包括数据安全、传输速度和用户体验等。为了解决这些问题,FileLink应运而生,成为一款高效、安全的跨网文件传输解决方案。 一、FileLink的核心特点 1.加密技术 …...

SOME/IP 教程知识点总结

总结关于SOME/IP的教程,首先通读整个文件,理解各个部分的内容。看起来这个教程从介绍开始,讲到了为什么在车辆中使用以太网,然后详细讲解了SOME/IP的概念、序列化、消息传递、服务发现(SOME/IP-SD)、发布/订阅机制以及支持情况。 首先,我需要确认每个章节的主要知识点。…...

学习路程八 langchin核心组件 Models补充 I/O和 Redis Cache

前序 之前了解了Models,Prompt,但有些资料又把这块与输出合称为模型输入输出(Model I/O)‌:这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示(prompt),通过通用接口调…...

图书数据采集:使用Python爬虫获取书籍详细信息

文章目录 一、准备工作1.1 环境搭建1.2 确定目标网站1.3 分析目标网站二、采集豆瓣读书网站三、处理动态加载的内容四、批量抓取多本书籍信息五、反爬虫策略与应对方法六、数据存储与管理七、总结在数字化时代,图书信息的管理和获取变得尤为重要。通过编写Python爬虫,可以从各…...

【DeepSeek系列】05 DeepSeek核心算法改进点总结

文章目录 一、DeepSeek概要二、4个重要改进点2.1 多头潜在注意力2.2 混合专家模型MoE2.3 多Token预测3.4 GRPO强化学习策略 三、2个重要思考3.1 大规模强化学习3.2 蒸馏方法:小模型也可以很强大 一、DeepSeek概要 2024年~2025年初,DeepSeek …...

安装pointnet2-ops库

由于服务器没有连网,现在已在github中下载pointnet2_ops文件包并上传到服务器 (首先保证cuda版本和pytorch版本对应) 如何查找cuda的安装路径: 然后执行安装命令即可。...

DO-254航空标准飞行器电机控制器设计注意事项

DO-254航空标准飞行器电机控制器设计注意事项 1.核心要求1.1 设计保证等级(DAL)划分1.2生命周期管理1.3验证与确认2.电机控制器硬件设计的关键注意事项2.1需求管理与可追溯性2.2冗余与容错设计2.3验证与确认策略2.4元器件选型与管理2.5环境适应性设计2.6文档与配置管理3.应用…...

ABAP语言的动态程序

通过几个例子,由浅入深讲解 ABAP 动态编程。ABAP 动态编程主要通过 RTTS (Runtime Type Services) 来实现,包括 RTTI 和 RTTC: 运行时类型标识(RTTI) – 提供在运行时获取数据对象的类型定义的方法。运行时类型创建(R…...

开源电商项目、物联网项目、销售系统项目和社区团购项目

以下是推荐的开源电商项目、物联网项目、销售系统项目和社区团购项目,均使用Java开发,且无需付费,GitHub地址如下: ### 开源电商项目 1. **mall** GitHub地址:[https://github.com/macrozheng/mall](https://git…...

Docker教程(喂饭级!)

如果你有跨平台开发的需求,或者对每次在新机器上部署项目感到头疼,那么 Docker 是你的理想选择!Docker 通过容器化技术将应用程序与其运行环境隔离,实现快速部署和跨平台支持,极大地简化了开发和部署流程。本文详细介绍…...

HTML:自闭合标签简单介绍

1. 什么是自结束标签&#xff1f; 定义&#xff1a;自结束标签&#xff08;Self-closing Tag&#xff09;是指 不需要单独结束标签 的 HTML 标签&#xff0c;它们通过自身的语法结构闭合。语法形式&#xff1a; 在 HTML5 中&#xff1a;直接写作 <tag>&#xff0c;例如 …...

【和鲸社区获奖作品】内容平台数据分析报告

1.项目背景与目标 在社交和内容分享领域&#xff0c;某APP凭借笔记、视频等丰富的内容形式&#xff0c;逐渐吸引了大量用户。作为一个旨在提升用户互动和平台流量的分享平台&#xff0c;推荐算法成为其核心功能&#xff0c;通过精准推送内容&#xff0c;努力实现更高的点击率和…...

GitCode 助力 python-office:开启 Python 自动化办公新生态

项目仓库&#xff1a;https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察&#xff0c;打造 Python 办公神器 项目作者程序员晚枫在运营拥有 14w 粉丝的 B 站账号 “Python 自动化办公社区” 时&#xff0c;敏锐察觉到非程序员群体对 Python 学习的强烈需求。在数字…...

超参数、网格搜索

一、超参数 超参数是在模型训练之前设置的&#xff0c;它们决定了训练过程的设置和模型的结构&#xff0c;因此被称为“超参数”。以KNN为例&#xff1a; 二、网格搜索 交叉验证&#xff08;Cross-Validation&#xff09;是在机器学习建立模型和验证模型参数时常用的方法&…...

or-tools编译命令自用备注

cmake .. -G "Visual Studio 17 2022" -A Win32 //vs2022 cmake .. -G "Visual Studio 15 2017" -A Win32 //vs2017 -DBUILD_DEPSON //联网下载 -DCMAKE_INSTALL_PREFIXinstall //带安装命令 -DCMAKE_CXX_FLAGS"/u…...

vulnhub靶场【kioptrix-4】靶机

前言 靶机&#xff1a;kioptrix-4&#xff0c;IP地址为192.168.1.75&#xff0c;后期IP地址为192.168.10.8 攻击&#xff1a;kali&#xff0c;IP地址为192.168.1.16&#xff0c;后期IP地址为192.168.10.6 都采用VMware虚拟机&#xff0c;网卡为桥接模式 这里的靶机&#xf…...

readline模块详解!!【Node.js】

‌“书到用时方恨少&#xff0c;事非经过不知难。”‌ —— 陆游 目录 ‌readline 是什么&#xff1f;‌基本用法&#xff1a;‌创建 Interface 类&#xff1a;核心流程‌&#xff1a; ‌Interface 类的关键事件&#xff1a;line&#xff1a;close&#xff1a;pause&#xff1a…...

软件测试的七大误区

随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...