速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 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:051272

评论 1 条评论

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

架构师系列 14 PageRank算法

桃花原记

IM即时通讯实现的原理

v16629866266

架构师 3 期 3 班 -week8- 作业

zbest

作业 week8

2020中国ToB独角兽:估值逆势起飞,寡头效应加剧

ToB行业头条

热情空前,家长纷纷变身“寒假规划师”,如何抓住这波热潮?

ZEGO即构

AI 在线教育 在线课堂

盘点2020 | 百度AI的2020

百度大脑

盘点2020

iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件

米开朗基杨

iterm2

SpringCloud 从入门到精通 11---Nacos负载均衡

Felix

阿里架构师经验分享!Android面试知识点总结宝典助你通关!顺利通过阿里Android岗面试

欢喜学安卓

android 程序员 面试 移动开发

dubbo-go 白话文 | 从零搭建 dubbogo 和 dubbo 的简单用例

阿里巴巴云原生

Java 云原生 dubbo 中间件 dubbogo

《2020年微信视频号研究报告》 | 视频号 28 天 (11)

赵新龙

28天写作

iOS音视频--视频合集

程序员 音视频 OpenGL ES GPUImage Metal

【有奖调研】中国人工智能开发者调研

百度大脑

我所认为的产品经理能力模型

day day up

TarsBenchmark | 服务性能压测利器

TARS基金会

微服务 压力测试 TARS

redis持久化怎么选?成年人从来不做选择...

moon聊技术

Soul网关源码阅读番外篇(一) HTTP参数请求错误

Java 源码阅读 网关

惊喜来袭!253页全彩免费电子书《Python 编程参考》正式上线发布

穿甲兵

Python redis 程序设计 Go 语言

阿里巴巴2021年最新开源十亿级Java高并发系统设计手册

Java架构追梦

Java 阿里巴巴 架构 并发 系统架构设计手册

从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程

JackJiang

网络编程 高并发 协程 高性能 即时通讯

作业1

瑾瑾呀

合约跟单交易软件系统开发|合约跟单交易APP开发

系统开发

QA为什么转换角色

BY林子

软件测试 QA 职业发展

Java 程序经验小结:返回零长度的数组或集合,而不是null

后台技术汇

28天写作

COCO聊天挖矿系统开发|COCO聊天挖矿软件APP开发

系统开发

使用Apollo升级一下yml文件管理和发布

Sky彬

springboo

简化业务代码开发:看Lambda表达式如何将代码封装为数据

华为云开发者联盟

函数式接口 数据 代码 函数 lambad

《我想进大厂》之分布式事务篇

艾小仙

Java 面试 后端

是找茬?还是装B?阿里面试每轮必问的“Spring Boot”意义何在?

比伯

Java 编程 架构 面试 计算机

WebRTC 的现状和未来:专访 W3C WebRTC Chair Bernard Aboba

阿里云CloudImagine

阿里云 WebRTC 视频云

阿里架构师深入讲解Android开发!教你一种更清晰的Android架构!BAT大厂面试总结

欢喜学安卓

android 程序员 面试 移动开发

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