监控是分布式系统的必备组件,能够起到提前预警、问题排查、评估决策等功效,乃行走江湖、居家必备之良品。
一个宿主机cpu
的报警叫做监控;一个业务日志的报错叫做监控;一个APM
条件的触发,也叫做监控。分布式系统错综复杂,随便做个统计指标的集合,也属于监控的范畴。怎样做到通用化,理清其中的关系,是需要花点功夫的,否则揉成一团,就不好拆了。
我习惯性从以下两种类型对其进行划分,真正实施起来,系统还是按照数据象限分比较合理: 数据象限 从数据类型划分,大体可分为:日志(logs
)、监控(metrics
)、调用链(tracing
)。 功能象限 从业务角度划分,可分为:基础监控、中间件监控、业务监控
不管什么样的监控系统,又涉及以下几个模块过程:
❏ 数据收集。如何在广度和效率上进行数据归并。 ❏ 数据加工。数据的整理、传输和存储。 ❏ 特称提取。大数据计算,中间结果生成存储。 ❏ 数据展示。高颜值、多功能显示。
其中,特征提取只有数据量达到一定程度才会开启,因为它的开发和运维成本一般小公司是不会玩的。
不同的监控模块,侧重于不同领域,有着不同的职责。我个人是倾向于 独立设计 的,但需要做一定程度的集成,主要还是使用方式上的集成和优化。
我将从几个典型解决方案说起,来说一下为什么要分开设计,而不是揉成一团。
系统监控用来收集宿主机的监控状况(网络、内存、CPU、磁盘、内核等),包括大部分数据库和中间件的敏感指标。这些metric
的典型特点是结构固定、有限指标项,使用时序数据库进行存储是最合适的。
指标收集方面,支持多样化的组件将被优先下使用。比如telegraf
,支持所有的系统指标收集和大部分中间件和DB的指标收集。
在这里特别推荐一下其中的
jolokia2
组件,可以很容易的实现JVM监控等功能。
指标收集以后,强烈建议使用kafka
进行一次缓冲。除了其逆天的堆积能力,也可以方便的进行数据共享(比如将nginx日志
推送给安全组)。 参考本公众号:【360度测试:KAFKA会丢数据么?其高可用是否满足需求?】
指标进入消息队列后,一份拷贝将会通过logstash
的过滤和整理入库ES
等NoSQL
;另外一份拷贝,会经过流计算,统计一些指标(如QPS
、平均相应时间、TP值等)。
可以有多种途径计算触发报警的聚合计算。回查、叠加统计都是常用的手段。在数据量特别大的情况下,先对指标