写点什么

大规模主机监控告警平台的架构演变

  • 2020-03-22
  • 本文字数:3946 字

    阅读完需:约 13 分钟

大规模主机监控告警平台的架构演变

背景

数字科技创立之初,由于不是所有的业务都完全继承自商城的技术体系,很多业务的部署方式甚至开发框架都有很多不同。那时并没有一套通用的监控系统。大多是各业务线自行搭建开源监控系统,nagios、cacti、zabbix 都有人使用过。互相之间的告警也不统一,甚至看个监控图都要去好几个平台,出个故障,事件处理小组要去多个地方截图,再拼接到一起来做故障分析报告。


几个需求和痛点


  • 覆盖率问题。以前多个平台,责任不明确,有些机器没有监控,或装的监控版本不统一,监控项不具备可比性,无法分析问题。

  • 不能丢数据。相关业务经常进行压测,一台机器被临时压死后再恢复过来,这期间的数据要保存下来;或者网络出现问题后,到底业务之间会有怎样的影响不是很明确。

  • 性能要好,不能几千个节点部分功能就失效或不好用了,至少要支持数万个节点而不出现任何问题。

  • 要能结合公司自身的业务信息、组织架构。

  • 能按需求出性能报表。

V1 诞生 - 混沌的开始

按照最开始的 5 点需求,设计了 V1 的版本:



  • miicoo 是 agent 端,部署在每台服务器上。自行采集数据后,主动发送给 paaraa 组件。

  • paaraa 是每个机房的代理节点。汇总数据后,异步的投递给消息队列。

  • 中间有个统一的消息队列。

  • dt-MQ 负责提取消息,并做报警处理。

  • MongoDB 负责存储监控数据。

  • MySQL 负责存储关系数据。

  • DT-monitor 是 web 界面。

V1 架构特点

1、miicoo 放到装机模板里,这样保证每一个终端,都会有我们的监控。之前监控团队的同学需要为每台机器添加监控,现在只要确认每台机器的监控是否运行正常,简化了工作。


2、miicoo 和 paaraa 两个组件,都带有数据缓冲。如果一个机器的网卡 IO 被打满,一时半会无法发送监控数据到 paaraa,它会将发送失败或者超时的数据放入缓冲区,等待下一次成功发送后,再进行补发。同样,如果某个机房的上连线故障,整个区域断网,paaraa 也会把所有数据缓存,等网络恢复后,进行统一的上报。这样就解决了数据丢失的问题。


3、业务和组织架构信息定时通过脚本导入到 MySQL 库中。加上各个机器的告警阈值,一并推送到 dt-MQ 组件中。dt-MQ 不停的从消息队列中抽取监控采集的信息,进行报警判断,同时将原始监控数据存入 MongoDB。


4、DT-monitor 为用户提供可视化的展示,根据 MySQL 中记录的组织架构和权限,相关的绘图数据从 MongoDB 获取。大促前的压测,我们直接使用 MongoDB 跑 MR 任务来生成相关统计报表。


基本上最初的几点需求都满足了。整个从开发设计到最终上线,用时大概不到半年。那年的 618 和双 11 所有的性能报表,都由谛听产生,这为下一年的大促提供了非常重要的优化依据。

几个问题

但随着使用,我们还是发现了很多问题,有的问题甚至无法忍受,相关的投诉也越来越多。


1、所有组件都采用 Python 编写,环境是碰到最麻烦的问题。我们在装机包中,最开始附带了一个 pypi 的运行环境。但发现整个包要超过 200M。后来改用二进制编译 miicoo 组件,即使这样整个包也要超过 100M,而且 python 的二进制化兼容性令人发指……


2、所有告警的策略开始都是统一的,如果想做个性化的配置,就需要修改对应 miicoo 组件的配置文件,同时还要把相关信息推送到 dt-MQ。如果有大量机器需要改特殊配置,例如某些大数据相关的业务,就需要做大量的操作,即使使用自动化脚本去做这件事,效率也非常低。每个特殊的应用上线时,又多了修改默认报警配置的工作,这和最早每个机器上线都需要添加监控相比,并没有什么本质的区别,非常不理想。


3、有些演练压测时必然会产生告警,实际上这些告警并不重要。如果需要暂停这些告警,就要针对相关范围的机器,提前修改告警配置。改配置实在是太多太麻烦了,但是不修改可能会使压测时真故障告警被埋没在告警风暴中,没有及时发现,影响其他业务。


4、miicoo 的版本更新工作繁琐。有些特殊硬件配置的机器,要用特殊版本的 miicoo。而每台机器所部署的 miicoo 版本,没有组件自动管理,全是人工维护。在数万节点的情况下,这个工作非常反人类。


5、在数万节点的前提下,DT-monitor 组件的出图效率非常慢。关注监控的同学,可能每天都要被迫看几十分钟折线图加载过程。

V2 - 灵魂的觉醒

总结之前一年的经验后,有针对性的推出了 V2.0 架构。


V2 架构特点

1、强化节点管理,增加了一个 dt-mgt 组件,用来管理所有的 miicoo 节点。miicoo 也增加了自动升级功能。每次启动时,miicoo 需要通过最近的 paaraa 找到 dt-mgt 服务,进行注册,获取监控配置,获取最新版本信息。这样可以按照预先设定好的节点属性,进行监控,而不用现场去修改配置。每个节点在 dt-mgt 中的属性,也是根据相关的资源系统(IAAS)、应用管理系统(SURE)或者某些专用平台,例如数据库管理系统(MEGA)来同步节点属性。得到了正确的配置,就能进行更准确的监控。如果需要对节点进行批量监控策略调整,只要都到 dt-mgt 修改区域维度或者应用维度的配置,dt-mgt 会自动转义成对应的节点配置并下发下去,miicoo 得到新的配置后,会自行调整。


2、spark 流式计算组件加入,可处理大量的告警计算。


3、Alarm 组件,针对更为复杂的告警策略,可专门负责告警。



相关配置可分为三部分。如上图:


  • 蓝色部分,是采集配置

  • 中间橙色和红色部分是告警判断配置

  • 右边绿色的部分是告警发送配置


把配置分开的好处是可以灵活的进行设置。比如某些监控项可以采集,但不报警。而有些监控项要采集,也要进行告警判断,但在允许的时间内才发送特定形式的告警通知。或者有的告警项在极端的情况下会影响服务器性能,要在大部分时间屏蔽掉,而在特定的时间区间才进行采集。


4、双库存储数据,为了提高绘图效率,并且照顾到数据的存储成本,把数据分成了两个库来存储。


  • Cassandra 库用来存储绘图数据,由 spark 直接计算后写库,数据只是为了绘图使用,长期数据进行归并处理。

  • MongoDB 用来存储原始数据,长期数据可以存储到磁带上进行备份。如果我想分析每年 618 的业务数据的区别,我就可以单独把每年 618 的数据提出进行统一分析。

V2 架构部署

整个 2.0 部署起来如下图:



为了简化部署,用 go 重写了 miicoo。go 语言可以编译成二进制可执行文件,而不需要在每一台机器上部署相同的执行环境,直接传包过去就可以了。所有基础的检查脚本几乎都内置到了单个的可执行文件中。


相应的,也扩充了 paaraa 层的通信协议。首先采用长连接方式来上报采集的数据。当连接中断,或者一定时间没有上传心跳数据,都会触发 paaraa 的宕机检测。再加上之前提到的注册逻辑,就组成了一个实时在线的采集关系网。这时我们又加入了一个创(专)新(利)功能,就是 paaraa 的动态负载均衡策略。



例如当一个机房有 2W 台节点,并且有 2 台 paaraa 节点的时候,理想的情况下应该是每个 paaraa 维护 1 万台 miicoo。如果一台 paaraa 不小心维护了 1 万 6 千台,而另一台只维护了 4 千台时,这就是一种非理想的负载情况。此时设定平均数 AVG=1W,偏移百分比为 OFFSET=40%,也就是说当一个节点维护的量大于 AVG * (1 + OFFSET) = 1W4 时,负载高的一台 paaraa 会强行切断多出来 40%的节点,使两台 paaraa 的压力均衡。如果这时再加入一台新的 paaraa 节点时,同样也是不需要任何人工干预,一个心跳周期后,会变成每台 paaraa 维护 6666 台(或 6667)miicoo。


升级架构后的谛听,当年非常顺利的完成了当年 618 和双 11 的考验。但 V2 的架构在运行了 1 年多的时间里,也积累了一些问题。

几个新问题

1、miicoo 版本太复杂,这是最消耗我们精力的一个问题。随着机型和操作系统版本不停增多,同样的功能所使用的采集细节也会各有区别,再加上虚机和容器的盛行,导致 miicoo 版本复杂到了难以维护的程度。而且经常有特殊情况,促使升级特定区域的 miicoo。每次升级都会导致所有采集项中断几分钟的时间。


2、告警的配置过于局限,一个节点,只有一套告警配置。因为是应用负责人和运维,共同使用一套配置,就会出现配置上的冲突。比如有些应用的 CPU 告警,开发并不关心,就会把阈值调到几乎最大。但运维的 SA 经常碰到 CPU 故障导致强制降频,进而促使使用率过高。如果这个机器的 CPU 告警阈值被开发改大了,很可能 SA 就收不到相关的告警。以往都是靠通过配置不同的告警接收人来解决,但实际情况过于复杂,导致这样也很难满足需求。


3、第三方编写的监控脚本也变得越来越复杂。一个典型的例子,PE 编写的清除磁盘日志的脚本,需要获取磁盘监控的结果。现在的做法是,他们通过订阅我们的消息,然后再远程 ssh 触发脚本删除日志,整个绕了一大圈,中间还容易出现各种意外情况导致日志清理不及时影响业务。或是 DBA 针对数据库监控的一些特殊脚本,可能需要特殊的高频率采集,并且又需要报警和绘图,这都是目前支持起来相对麻烦的事情。

V3 - 越发精彩

通过这段时间的运营总结,针对以上新的问题,设计出了 V3 的架构。对比前一架构有两点明显变化:


1、miicoo 组件拆分

拆分成了 core 和 plugin 的形式。这样主采集框架就可以不用总是去更新,只更新对应的插件就可以,保证了整体的稳定性。个别插件的采集失败也不会影响其他插件汇报数据。专门分化出一个组件 DT-softCenter 用来管理每个节点的插件。每个插件也都有自己能够运行的条件限制。这样不同的系统版本,可以共用主框架,配置不同版本的插件就可以完美运行。

2、alarm 组件拆分

这样 alarm 可以进行更为复杂的告警配置。从下图可以看出,我们的告警配置可以针对所有用户,而不是像以前一样,大家公用一套配置。不同的用户设置的不同阈值,也不会影响互相的告警效果。避免了别人配置了一个过于严格的阈值,导致频繁发送告警,自己被动收取。


未来之路

在未来,行业内推行智能化运维,可能阈值都不需要人为来设置,通过测试中积累的数据,就能自动判断。甚至相关问题的出现也都能提前预测。谛听作为一个工具系统,势必会朝着越来越智能的方向发展。


2020-03-22 21:051296

评论 1 条评论

发布
用户头像
没有特别理解告警配置管理和告警效果
2021-06-14 13:51
回复
没有更多了
发现更多内容

[Go 并发编程实战课]02.Mutex 源代码

Quincy

Go 语言

WebSocket从入门到精通,半小时就够!

JackJiang

html5 网络编程 websocket 即时通讯

4年Java经验,备战两月成功拿到美团、京东、字节offer

Java架构之路

Java 程序员 面试 编程语言

手把手带你玩转 openEuler | 如何安装 openEuler

openEuler

Linux 开源 操作系统 openEuler

生态共赢-anyRTC创业扶持计划

anyRTC开发者

ios 音视频 WebRTC RTC 安卓

[Go并发编程实战课]01.Mutex学习笔记

Quincy

Go 语言

1分钟将vscode撸成小霸王

gamedilong

vscode 大前端

【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!

冰河

并发编程 高并发 架构设计 秒杀 异步

只要十步,你就可以应用表达式树来优化动态调用

newbe36524

C# netcore ASP.NET Core

TensorFlow 篇 | TensorFlow Serving API

Alex

tensorflow keras model serving tensorflow serving api

2020年第三季度《全国移动App 风险监测评估报告》

InfoQ_11eaedef67e9

App 移动安全 个人隐私安全

【全球案例】ESL 游戏公司如何通过 Jira 定制化解决方案连接全球团队

Atlassian

项目管理 敏捷 Atlassian Jira

惊险的B站Java后端岗面试之旅,复盘面试经历及面试真题

Java架构之路

Java 程序员 面试 编程语言

视频会议的应用

anyRTC开发者

ios 音视频 WebRTC 直播 安卓

Java零基础到进阶宝典!从小白到大神,金九银十面试这届斩获23K月薪

Java架构追梦

Java 学习 架构 面试 核心知识点

vidyo在数字化办公中提供了什么便利?

dwqcmo

音视频 集成架构 解决方案 智能硬件

教育场景方案升级| 打通业务前后端,少量开发快速上线(一):互动小班

ZEGO即构

在线教育 低代码

java安全编码指南之:锁的双重检测

程序那些事

java安全编码 java安全编码指南 java代码规范 java代码安全

spring-boot-route(十五)整合RocketMQ

Java旅途

Java RocketMQ Spring Boot

TNFE-Weekly[第七十五周已更新]

莹姐🙈

小程序 大前端 周报

月薪60k的Java开发在阿里是什么级别?对技术能力有哪些要求?

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

LAXCUS大数据集群操作系统:一个分布式分时共享E级系统软件(一)

陈泽云

人工智能 云计算 大数据 基础设施 国产操作系统

技术解析 | 云游戏在未来如何实现?

腾讯云音视频

开发 游戏 视频

搞开发,写SQL就够了

棒锤🐮

sql mybatis springboot Web框架 Rocket API

架构师训练营第四周作业

四夕晖

实现一个简单的 MobX

局外人

大前端 js React

为什么学Go(一)

soolaugust

Go 语言

英特尔聚焦全栈量子研究:发布多项重磅量子计算研究成果

E科讯

手把手带你玩转 openEuler | 初识 openEuler

openEuler

Linux 开源 操作系统

LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释

Lee Chen

大前端 LeetCode

蚁架构师首推SpringBoot套餐(原理+实战+面试)

小Q

Java 学习 架构 微服务 SpringBoot 2

大规模主机监控告警平台的架构演变_文化 & 方法_京东数字科技产业AI中心_InfoQ精选文章