news 2026/7/7 13:00:47

夜莺监控设计思考(一)整体定位、架构设计、单进程多进程选择、高可用设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
夜莺监控设计思考(一)整体定位、架构设计、单进程多进程选择、高可用设计

整体定位

了解一个开源项目,最应该了解的就是其定位,或者说它要解决的问题域。

夜莺的定位就是四个字:告警引擎。夜莺对接多种数据源(比如 Prometheus、VictoriaMetrics、MySQL、ClickHouse、Postgres、ElasticSearch),根据用户配置的告警规则,判定并产生告警事件,然后对事件做 Pipeline 处理,最终通过各类通知媒介发出告警。

可以对比 Grafana 来理解,Grafana 也是对接多种数据源,不过 Grafana 侧重在数据可视化,夜莺侧重在告警。

image

没有夜莺之前,各个数据源的告警是怎么处理的?

Prometheus 是直接配置在 prometheus.yml 里,管理起来稍有不便

VictoriaMetrics 是使用 vmalert,和 Prometheus 是类似的逻辑

ElasticSearch 社区里用的比较多的是 elastalert 开源项目做告警判定

ClickHouse、MySQL、Postgres 等貌似没有专门的告警引擎

有了夜莺之后,就可以在夜莺里统一管理告警规则、通知媒介、消息模板、用户联系方式等。而且,夜莺可以对告警事件做 Pipeline 处理,比如:

Relabel:类似指标的 Relabel,夜莺可以对告警事件做 Relabel

Enrichment:事件丰富,比如调用 CMDB 的接口为事件附加更多丰富的上下文信息

Drop:一些特定的告警事件要丢弃掉

等等

夜莺的核心功能部件

确定了定位之后,如果你是夜莺的设计者,要如何设计其功能部件呢?

首先,需要一个 webapi。用于和用户、第三方交互,用户需要做一些配置,比如:

数据源的配置

用户、角色的管理

用户联系方式管理(比如电话、手机号等,未来在告警触发时,要打电话发告警短信等)

各类规则配置,比如告警规则、屏蔽规则、订阅规则

通知媒介、消息模板的管理

Pipeline 的管理

查看历史告警事件,做一些统计分析等

其次,需要有一个后台任务执行的逻辑,根据用户配置的告警规则,周期性执行,去查询数据源,判定数据异常并生成告警事件,最终发送。

最简单的就是一个告警规则一个 goroutine(轻量级线程)后台执行

如果执行失败,通过某些监控指标反应异常,同时打印执行失败的日志

需要考虑高可用,如果某个实例挂了,其他实例要顶上来

需要考虑 sharding,比如有两个实例,有 1000 条规则,那每个实例要处理 500 条规则,不能重复执行,而且要均匀分配,如果某个实例挂了,剩下的实例要能承接原本宕机的实例负责的那些规则

对于某个实例而言,就要知道当前总共有多少实例,哪些实例存活,哪些实例挂了,否则,我不知道谁挂了我就没法接管。这需要一个中心状态存储,或者引入 Raft 等协议

这个功能部件主要是负责告警,姑且称之为 alert。所以,夜莺至少有两个功能部件:webapi + alert。实际上,夜莺还有其他功能部件,后文再说。

单进程还是多进程

刚才讲,夜莺至少包含两个功能部件:webapi + alert。那是做成一个进程?还是做成两个进程?

如果是公司内部的系统,我更倾向于做成两个进程,方便维护。但作为一个开源项目,还要考虑普通用户的部署复杂度,则更倾向于做成一个进程。

高可用设计

对于 webapi 功能部件而言,是一个无状态的组件,接收 api 请求然后对数据库做 CRUD,所以 webapi 可以水平扩展,部署多个,前面架设负载均衡,就是高可用了。

alert 模块需要协调分配告警规则,是有状态的,既然我们不可避免要使用数据库存储各类配置信息,那就顺便用数据库存储 alert 的心跳信息得了,比较简单。

所以,所有 alert 复用一个 MySQL,周期性心跳,这样 DB 的心跳表里就可以查到所有实例列表,以及最近一次心跳时间,从而得知哪些实例活着哪些已经挂了(长时间没有心跳就认为挂了)。

这样的架构极为简单,每个实例的配置都是相同的,要做高可用就搞多个机器部署多个实例即可。社区用户用起来也简单。

后记

本文介绍了夜莺的定位、架构、单进程还是多进程的抉择、高可用设计,如果你们公司只有一个机房或者有多个机房但是机房之间有很好的网络专线,那就部署一套夜莺就可以了,如果有多个机房,但是机房之间的网络链路很差,就需要考虑夜莺的边缘机房架构模式,咱们下一节详细介绍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 14:47:36

5分钟快速验证SSL连接问题的解决方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个快速原型工具,允许开发者输入遇到SSL peer shut down incorrectly错误的环境参数(如使用的协议、证书详情等),自动生成测试用…

作者头像 李华
网站建设 2026/7/7 16:59:39

什么是functions.php文件?

什么是functions.php文件? functions.php文件是WordPress主题的核心文件之一,它是一个PHP文件,用于添加自定义功能和修改WordPress主题的默认行为。每个主题都有自己的functions.php文件,位于主题目录中。 functions.php文件的位置 主题f…

作者头像 李华
网站建设 2026/7/7 9:38:08

抖音内容批量下载终极方案:告别手动保存的烦恼

抖音内容批量下载终极方案:告别手动保存的烦恼 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为下载抖音视频而烦恼吗?每次都要手动保存、去水印,既耗时又费力&#…

作者头像 李华
网站建设 2026/7/7 6:40:14

AI助力MinIO开发:自动生成存储管理代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个基于Python的MinIO文件管理系统,包含以下功能:1. 使用minio-py SDK实现与MinIO服务器的连接配置 2. 实现文件上传功能,支持断点续传 3. …

作者头像 李华
网站建设 2026/7/7 12:24:20

3w3cc免费vs传统开发:效率提升10倍的秘密

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个效率对比工具,展示3w3cc免费资源与传统开发的差异。输入项目规模(小型/中型/大型),系统自动生成两种方式的预估时间、代码量…

作者头像 李华
网站建设 2026/7/7 15:58:14

1小时搭建:用Tabby Terminal创建自定义CLI工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 实现一个Tabby Terminal的快速原型开发框架,功能:1. 模板化CLI项目生成器(支持Node.js/Python/Go);2. 实时API测试控制台…

作者头像 李华