1. 关于监控

监控就是要把一切尽在掌控

1.1. 监控的目的

通过监控可以:

  • 实时掌握系统的运行状态
  • 减少宕机时间
  • 对故障的提前预警
  • 历史状态的回放、故障排除、分析
  • 扩展和性能管理
  • 资源计划

1.2. 监控的层次

  • 硬件
  • OS、中间件(MySQL、Tomcat)
  • 应用程序
  • RUM(Real User Monitor, 用户数据监控): 是一种客户端的监控技术,它通过记录下用户访问网站的真实行为数据,来进行对网站的监控。

1.3. 监控系统(体系)的设计

一个好的监控系统需要做到以下几点: 如图, 引用自 Here

一个完整的监控体系包括以下几个组成部分:

  • 监控数据采集:时效与精确
  • 监控数据采集:存储与归档
  • 监控数据的自动化展示
  • 监控数据的自动化分析与联动处理
  • 监控告警及自动化处理
  • 监控工具自身的安全控制
  • 监控告警的响应及追踪

监控体系架构图:如图,引用自 Here

从上图可以看出,一个完整的监控系统是从监控数据的采集开始、再将数据进行存储, 处理从而产生价值。 比如,智能生成分析报告、可视化展示、通过联动完成高可用, 伸缩,限流等事件处理, 监控告警等。

1.4. 监控数据采集

目前监控数据的采集方式主要有以下几种:

  • 主动输出

    提前在应用中埋点,应用主动上报。比如一些应用系统的业务状态,可以通过在日志中主动输出状态用于采集

  • 远程接入

    通过对应用进程接口调用获取应用状态。比如使用JMX的方式连接到java进程中,对进程的状态进行采集。

  • 嵌入式

    通过在进程中运行 agent 的方式获取应用状态。如目前的 APM(App Performance Manage) 产品都是通过将监控工具嵌入到应用内部进行数据采集。

  • 旁路式

    通过外部获取的方式采集数据。比如对网站url的探测,模拟业务的报文 ,对服务器的ping,流量的监控。可以通过在交换机上将流量进行端口复制,将源始流量复制到另一个端口后再进行处理,这样这业务系统是完全没有侵入。

  • 入侵式

    不同于嵌入式,入侵式的 agent 是独立运行的进程,而不是运行在进程中。这个是目前监控工具比较常用的形式,比如:zabbix, 在主机上独立运行一个进程进行相关数据采集

  • CLI 方式

    命令行的方式是最基本的方式,比如在linux系统上使用top,vmstat,netstat写一些shell脚本进行数据的采集,再把数据存储在文本文件中进行处理。

1.4.1. 数据采集需要注意以下三点

  • 采集的时间间隔

    对应用平台的监控数据采集的频率非常重要,关系到数据的及时性,有效性。在做监控数据采集时,也是根据不同的监控对象设定不同的时间间隔。比如对日志的监控是实时的,对实例的状态也是实时的,而对于一些后期用来分析的状态性数据则采集的时间间隔会长一些,3-5分钟的样子。

  • 监控工具自身的安全控制

    有些监控工具可能是时时运行,特别是侵入式监控,如果运行不当,自身就可能造成故障,比如执行过程异常不释放资源,造成高CPU占用;比如进程结束异常,不停的重启相同的进程;比如日志级别设置过低,大量日志输出,影响进程性能和占用大量磁盘空间。所以做监控时一定要遵循有自我安全控制的能力。监控工具在拿到生产环境中运行前,一定要先在测试环境中进行一段时间的试运行 。

  • 触发式的数据采集

    需要关注异常点的现场数据采集,比如threaddump,heapdump,主机的性能数据等。这些故障点的数据重启后就会失去,有些故障不能重现时,相关的分析数据就很重要了,所以对于这些数据,需要进行触发式的数据采集。当满足某些条件时触发采集,而在平常不运行。

See Also

Thanks to the authors 🙂