![4da2257f46210f4caf344162b8f11c6f.gif](https://img0.php1.cn/3cdc5/6e5e/978/f2ae4e1ea5938402.gif)
![2058e23d3310f1af4e270b6eb11ed1b6.png](https://img0.php1.cn/3cdc5/6e5e/978/38f753e98fd72bef.jpeg)
前言
都说监控系统是运维的第三只眼睛,因此一旦线上出问题,业务方第一反应是,监控系统有没有提前告警?是不是告警太多被淹没了?为啥没有把根因报出来?上面的三个质疑,相信做过监控的同学都会深有体会。我做了10年的监控,背锅不少,在2021年的第一天,我想跟你聊一聊我的一些心得。
什么是监控
做监控前,先问自己一个问题。监控的本质是什么?我的理解是监测并实施控制,监测并告警只是第一步,有效的控制才是根本。
![0f2e17f1dc9189f6d85947ed92a1c19c.png](https://img0.php1.cn/3cdc5/6e5e/978/0452c8879b590683.png)
![42818eff2ef284223da0bca3e018ea83.png](https://img0.php1.cn/3cdc5/6e5e/978/fb37507db554c1c2.png)
数据采集:采集的方式有很多种,包括日志埋点进行采集(通过Logstash、Filebeat等进行上报和解析),JMX标准接口输出监控指标,被监控对象提供RESTAPI进行数据采集(如Hadoop、ES),系统命令行,统一的SDK进行侵入式的埋点和上报等。
数据传输:将采集的数据以TCP、UDP或者HTTP协议的形式上报给监控系统,有主动Push模式,也有被动Pull模式。
数据存储:有使用MySQL、Oracle等RDBMS存储的,也有使用时序数据库RRDTool、OpentTSDB、InfluxDB存储的,还有使用HBase存储的。
数据展示:数据指标的图形化展示。
监控告警:灵活的告警设置,以及支持邮件、短信、IM等多种通知通道。
所以做监控的最终目的是先于用户发现问题,提供有价值的告警,并闭环解决。
监控1.0
08年刚到WS的时候,CDN业务规模还很小,公司就几百台机器,监控项不到20种。当时过去的时候,阿贤已经把监控系统都搭得差不多了,基本能满足业务初期的监控需求,监测服务器的死活,服务状态异常squid/lighttpd/rsync/snmp。
![ad3b7422abc6da8ab5c93b502ef58d9d.png](https://img0.php1.cn/3cdc5/6e5e/978/b6a3c9442fa43d7e.png)
架构说明:
存在的问题:
单点策告警,容易误报
wsPoller无法根据自身的网络、负载自动踢除
机器性能监控缺失
不支持本地采集
监控2.0
随着客户对服务质量的要求变高,监控1.0的弊端开始显露。09年初,我们决定开发监控2.0。
团队在研究完Nagios、Cacti、Zabbix开源系统后,发现这些系统在扩展性方面,告警运维值班便捷性上满足不了我司的运维需求。
苗辉是当时的leader,这家伙就喜欢自己折腾个东西出来,而我当时心里挺犹豫,有开源的不用,为啥要从0到1自己搞。只是这个家伙"吹牛"还是可以的,把老板说服了,带着4~5个应届生,我们就开干了。单单设计文档我们就整了100多页,方案来回讨论了有1个月,团队苦逼的搞了大半年,alpha版本终于上线了。
![f2c2771c36b549360afd939c2dbc0c3e.png](https://img0.php1.cn/3cdc5/6e5e/978/c741baca0951408b.png)
架构说明:
wsmsagent——wsMS的数据收集接口;
MI——wsMS的数据中转加工站;
AL——wsMS的告警分析;
RRDS——wsMS的监控数据绘图引擎;
SCHEDULER——wsMS自动均衡的决策中心;
SCADA——wsMS的通用采集监测组件;
UI——展示界面。
监控3.0
这个系统线上运营了2年,2011年随着机器规模迅速增加到7K+,平台开始爆发出各种问题:
机器增加到2万的时候,监控数据单表1天超过5亿条数据,复杂的SQL告警规则查询耗时太长;
原始告警移到历史告警通过Insert和Delete,性能太低;
通过数据持久化再分析生成告警,已经满足不了实时性的要求;
复杂的告警规则通过SQL已经无法支持;
新增一种采集类型的数据,都需要二次开发,成本较高;
每天有2W+的告警,运维根本处理不过来;
监控和告警数据很多,为什么还是有不少故障监控没有发现?
这个时候苗辉跑去百度了,我一个人压力山大。当时外部对监控不是很满意,告警刷屏时有发生。
2015年底我决定搞监控3.0,以构建立体化的监控体系为目标,将告警分层,覆盖从基础设施->组件->产品服务->客户业务的四层告警。自上而下做告警定位,由下而上确定告警影响范围。建立告警间的相互关联关系,当出现一个严重级别的告警时,能展示告警的影响范围。
架构图
![c16cbefb9b5f72dcfaf855f2d3052b5f.png](https://img0.php1.cn/3cdc5/6e5e/978/54dc073f8354c425.png)
调度系统
![3a22e555ecd233ef435646e6865bd169.png](https://img0.php1.cn/3cdc5/6e5e/978/fbbccbb47641a301.png)
UI层:提供任务类型配置、任务分配结果查询,任务状态查询,组件状态查。2)由UI-master,UI-slave组成,利用LVS或NGNIX做主从。
任务调度层:根据原始任务状态,监控机状态,任务配置状态决策是否进行任务分配,通过zeroMQ向任务分配层发送分配任务2)同时定时向任务加载层发送任务加载任务3)有core-master,core-slave组成,利用zk或hzelcast做主从。
任务加载层:负责接收Core-master的加载任务,向外部系统获取原始任务,写入mysql
任务分配层:负责接收Core-master的分配任务,执行分配策略,将数据写入memcache
数据缓存层:memcahe缓存任务分配结果,cachedump定时将分配结果快照写入mysql
任务分发层:负责接收scada或其他采集客户端的请求,将任务分发给采集端
ZeroMQ:zeroMQ,消息队列,可自动实现负载均衡
Monitor:负责调度平台可视化数据维护,包含各组件的运行状态,任务加载,调度,分配,分发状态
ZK/hazelcast:分布式协调系统,用于core组件进行主备选举,机房内部署集群,设置iptable只允许同机房访问。
告警决策
![c9fa5c23e3bd0fedac0f1578005e2caf.png](https://img0.php1.cn/3cdc5/6e5e/978/fb632c8db1ccd05d.png)
NodeCluster
消息生产集群,接入不同的数据源类型,生产待计算的原始消息。如接收sdn推送的监控采集数据,以每一行为一条计算数据提交。
MessageCluster
使用kafka消息中间件,暂存计算消息。实现数据的流式输入。
JstormCluster
核心计算集群,基于storm的java版本,改进HA问题和计算性能优化。
MonitorCluster
集群状态监控,负责进行集群内部的组件状态、topology计算状态的监控报警
ThorUI
UI作为实时计算平台的运营界面,主要任务是各个组件的运行状态收集、消息任务配置、监控报警展示、系统配置等。
数据库性能调优
在监控2.0阶段,监控数据是存储在MySQL,监控数据每天达到750G+,单表每天数据量10亿条,数据查询非常慢。我们对监控表做读写分离和水平分表看下测试的效果,但测试的结果让我们大失所望。
![0e0b13a7cd8ce2e81f64de9ed03cfa4d.png](https://img0.php1.cn/3cdc5/6e5e/978/b5aaef0c0108ef18.png)
上述两个方案行不通,我们决定采用第3种方案,表分区方案。即以5分钟为一分区,根据每个监控对象实际需求创建分区数,由crontab脚本定时执行,执行时根据总时长、监控数据保留时长、当前时间,数据计算出要删除的分区,truncate分区数据。表分区方案将delete和load、select隔离在不同分区,减少delete对load、select的影响。通过一段时间的测试,发现测试效果还是不错的,比之前有一定幅度的提升。
![5562cb465e7d991580df501c038ee2fd.png](https://img0.php1.cn/3cdc5/6e5e/978/22fc167da2381589.png)
如何基于开源快速搭建一个监控系统
1.zabbix
如果你的公司机器规模少于1000台,没有用到K8S,告警逻辑也不复杂,那推荐你用zabbix,基本能满足企业内部普通的IT运维。
![6c703ad31a649e335c08b20da59ccfb9.png](https://img0.php1.cn/3cdc5/6e5e/978/1bddb2bd393fb7c8.png)
2.Prometheus+Clickhouse
如果你的公司机器规模大于5000台,并且是通过容器化编排部署,告警逻辑也较为复杂,推荐Prometheus+Clickhouse。可参考之前的文章。
![8a6b5f7a0ff2f5e3ae5467712d1890f0.png](https://img0.php1.cn/3cdc5/6e5e/978/1436b6c086b6f946.png)
3.Prometheus+Telegraf+influxdb
Telegraf是实现数据采集的工具。Telegraf 具有内存占用小的特点,通过插件系统开发人员可轻松添加支持其他服务的扩展。在平台监控系统中,可以使用 Telegraf 采集多种组件的运行信息,而不需要自己手写脚本定时采集,大大降低数据获取的难度。
![dfc3f028f5c588f4a19806b5676cbc03.png](https://img0.php1.cn/3cdc5/6e5e/978/87b3054e1f3f005f.png)
总结
最后,我总结出来做好监控很重要的4个点:
一定要建立体系化的监控告警平台,确定监控scope,避免成为“背锅侠”。
监控不只是运维的事,研发设计要把组件监控纳入进来。
监控越往前做越有效,等到组件上线运营后再补充的代价是极高的。
监控发展的必经之路,少->全->精,要避免告警风暴,做到精准。
![23ffc9c42f0795af6406775682ad0c08.png](https://img0.php1.cn/3cdc5/6e5e/978/f69384fd9616086a.png)
![50e336e9bce51aef0d908a9b634fb295.gif](https://img0.php1.cn/3cdc5/6e5e/978/b64a39e4b74fbc3b.gif)
简介
基哥,座标厦门,目前专注运维架构,DevOps的落地实践。欢迎添加我的微信号(hongdiji)一起学习交流。
![c69d3e0029ff72fc64225d1652567912.png](https://img0.php1.cn/3cdc5/6e5e/978/48f77a760f77178b.png)
长按扫码关注
一个在看,小编会开心一整天...![128895f0ae5a72dc5b13392ac235ba57.png](https://img0.php1.cn/3cdc5/6e5e/978/d9b7af53e04490ef.png)