监控系统-知识梳理(基本是转帖)

写在最前面

这篇的内容是从公众号ImportNew上看到的,原网址:https://mp.weixin.qq.com/s/WtDkVpmPmlp54y5glkeLlw
我又整理一遍放在这里是为了让自己看完有个记性。欢迎讨论,推荐关注原网址的作者大佬。
思维导图工具:xmind
----正文分割线-----
使用方法:找到导图里的相应内容,作为指导思想或者checklist,检查和构建自己项目的监控系统。
先放个全文结构
在这里插入图片描述

监控系统-知识梳理

首先要明确

  • 监控系统的目标是什么?

  • 监控能发挥什么作用?

监控系统的作用

实时采集监控数据

  • 维度

    • 硬件
    • 操作系统
    • 中间件
    • 应用程序

实时反馈监控状态

  • 通过对采集的数据进行多维度统计和可视化展示,能实时体现监控对象的状态是正常还是异常

预知故障和告警

  • 能够提前预知故障风险,并及时发出告警信息

辅助定位故障

  • 提供故障发生时的各项指标数据,辅助故障分析和定位

辅助性能调优

  • 为性能调优提供数据支持,比如慢SQL,接口响应时间等

辅助容量规划

  • 为服务器、中间件以及应用集群的容量规划提供数据支撑

辅助自动化运维

  • 为自动扩容或者根据配置的SLA进行服务降级等只能运维提供数据支撑。

使用监控系统的正确姿势

一个好的监控要有这些特点

  • 有监控
  • 监控及时
  • 监控的信息有助于快速定位问题

如何使用监控

1 了解监控对象的工作原理

要做到对监控对象有基本的了解,清楚它的工作原理。比如想对JVM监控,必须清楚JVM的堆内存结构和垃圾回收机制

2 确定监控对象的指标

清楚使用哪些指标来刻画监控对象的状态。比如对某个接口监控,可以采用请求量、耗时、超时量、异常量等指标来衡量。

3 定义合理的报警阈值和等级

达到什么阈值需要告警?对应的故障等级是多少?不需要处理的告警不是好告警,定义不合理的阈值会降低运维效率或者使监控系统失效。

4 建立完善的故障处理流程

收到故障告警后,一定要有相应的处理流程和oncall机制,让故障及时被跟进处理。

常用监控对象和指标

硬件监控

  • 电源状态
  • cpu状态
  • 机器温度
  • 风扇状态
  • 物理硬盘
  • raid状态
  • 内存状态
  • 网卡状态

服务器基础监控

  • cpu:单个cpu以及整体cpu使用情况
  • 内存:已用内存、可用内存
  • 磁盘:磁盘使用率、磁盘读写的吞吐量
  • 网络:出口流量、入口流量、TCP连接状态

数据库监控

  • 数据库连接数
  • QPS/TPS
  • 并行处理的绘画数
  • 缓存命中率
  • 主从延时
  • 锁状态
  • 慢查询

中间件监控

  • Nginx

    • 活跃连接数
    • 等待连接数
    • 丢弃连接数
    • 请求量
    • 耗时
    • 5XX错误率
  • Tomcat

    • 最大线程数
    • 当前线程数
    • 请求量
    • 耗时
    • 错误量
    • 堆内存使用情况
    • GC次数和耗时
  • 缓存

    • 成功连接数
    • 阻塞连接数
    • 已使用内存
    • 内存碎片率
    • 请求量
    • 耗时
    • 缓存命中率
  • 消息队列

    • 连接数
    • 队列数
    • 生产速率
    • 消费速率
    • 消息堆积量

应用监控

  • HTTP接口

    • url存活
    • 请求量
    • 耗时
    • 异常量
  • RPC接口

    • 请求量
    • 耗时
    • 超时量
    • 拒绝量
  • JVM

    • GC次数
    • GC耗时
    • 各个内存区域的大小
    • 当前线程数
    • 死锁线程数
  • 线程池

    • 活跃线程数

    • 任务队列大小

    • 任务执行耗时

    • 拒绝任务数

      拒绝任务数是什么概念?

  • 连接池

    • 总连接数
    • 活跃连接数
  • 日志监控

    • 访问日志
    • 错误日志
  • 业务指标

    • 视业务来定,如PV,订单量等

基本流程

1 数据采集

  • 日志埋点采集,使用插件进行上报和解析

    • logstash
    • filebeat
  • JMX标准接口输出监控指标

  • 被监控对象提供的REST API去进行数据采集,如hadoop、ES

  • 系统命令行

  • 统一的SDK进行侵入式埋点和上报

2 数据传输

  • 将采集的数据以TCP、UDP或者http协议的形式上报监控系统

    • 主动push
    • 被动pull

3 数据存储

  • RDBMS:MYSQL,Oracle
  • 时序数据库:RRDTool、OpentTSDB、InfluxDB
  • hbase

4 数据展示

  • 数据指标的图形化展示

5 监控告警

  • 灵活的告警设置,支持邮件短信im等多通知渠道

主流监控系统

老牌监控系统

  • Zabbix

    • Zabbix架构图
      在这里插入图片描述

      • Zabbix Server

        • 核心组件,C,

        • 功能

          • 负责接受Agent、Proxy发送的监控数据,支持JMX、SNMP等多种协议直接采集数据
          • 数据的汇总存储
          • 告警触发
      • Zabbix Proxy

        • 可选组件

        • 功能

          • 对于被监控机器较多的情况,可以被用来分布式监控,能代理Server收集部分监控数据,减轻Server的压力
      • Zabbix Agentd

        • 部署在被监控主机上

        • 功能

          • 用于采集本季的数据,并发送给Proxy或Server,支持用户自定义数据采集脚本。
          • 可以手动配置在Server端,也可以在自动发现机制中被识别。
          • 收集数据方式支持主动Push和被动Pull
      • Database

        • 用于存储配置信息和采集到的数据。
        • 支持Mysql、Oracle等关系行数据库,最新版开始支持时序数据库(成熟度不高)。
      • Web Server

        • Zabbix的GUI组建,PHP

        • 功能

          • 提供监控数据的战羡和报警配置
    • 优势

      • 产品成熟:文档丰富、采集插件丰富,功能强大
      • 采集方式丰富:支持Agent、SNMP、JMX、SSH等多种采集方式。主动被动数据传输方式。
      • 较强的拓展性:支持Proxy分布式监控,有agent自动发现功能,插件式架构支持用户自定义数据采集脚本。
      • 配置管理方便:web页面即可配置
    • 劣势

      • 性能瓶颈:关系型数据库写入是瓶颈,给出的单击上线是5000,还可能达不到。而时序数据库成熟度还不高
      • 应用层监控支持有限:没有对应sdk做侵入式买点和采集(比如监控线程池或者接口性能,但是可以通过插件曲线实现)
      • 数据模型不强大:不支持tag,没法按多维度进行聚合统计和告警配置,不灵活。
      • 二次开发难度大:Zabbix使用C,二次开发要熟悉它的数据表结构,而用它提供的API更多做的事展示层的定制。
  • Nagios

  • Cacti

  • Ganglia

  • Garafana

新一代监控系统

  • Open-Falcon

    • Open-Falcon架构图
      在这里插入图片描述

      • Falcon-agent

        • Go开发,部署在被监控的机器上

        • 功能

          • 负责数据采集,支持三种数据采集方式
          • 能自动采集单机200多个基础监控指标,无需做任何配置;
          • 支持用户自定义plugin获取监控数据
          • 用户可通过http接口自主push数据到本季的proxy-gatewat,再由gateway转发到server
      • Transfer

        • 功能

          • 数据分发组件,接收客户端发送的数据,分别发送给数据存储组件Graph和告警盘点组件Judge。 这两者均采用一致性hash做数据分片,以提高横向扩展能力。
          • 将数据分发到OpenTSDB,做历史归档
      • Graph

        • 数据存储组件
        • 底层使用RRDTool(时序数据库)做单个指标的存储,并通过缓存、分批写入磁盘等方式进行了优化。据说可以达到8w+/s的写入速率
      • Judge & Alarm

        • 告警组件
        • 对上报的数据实时计算,判断是否产生告警事件。Alarm组件对告警事件收敛处理后,将消息推送给各个消息通道。
      • API

        • 面向终端用户,收到查询请求后回去Graph中查询指标数据。汇总结果后同一返回给用户,屏蔽了存储集群的分批细节。
    • 优势

      • 自动采集能力
      • 强大的存储能力:分布式时序数据存储系统,可扩展性强
      • 灵活的数据模型:借鉴OpenTSDB,数据模型中引入tag,支持多维度的聚合统计和告警规则设置,提高了使用效率。
      • 插件统一管理:可以对用户自定义脚本做统一化管理,可通过HeartBeat Server 分发给agent,减轻使用者自主维护脚本的成本。
      • 个性化监控支持:基于Proxy-gateway,很容易通过自主买点实现应用曾的监控和其他个性化监控需求。集成方便。
    • 劣势

      • 整体发展一般:社区活跃度不高,前景堪忧
      • ui不够友好:对于业务线的研发来说,可能只想便捷的完成告警配置和监控,但是它把机器分组,策略模板,模板继承等概念都暴露在ui上,围绕这几个概念设计ui,理解有点费劲。
      • 安装复杂:组件多,安装比较难
  • Prometheus

    • 概述:Go语言开发,支持k8s,开源,社区异常火爆,数据基于pull模式,而不是push模式。架构简单

    • prometheus架构图
      在这里插入图片描述

      • Prometheus Server

        • 核心组件,用于收集、存储监控数据

        • 功能

          • 支持静态配置和通过Service Discovery动态发现来管理监控目标。并从监控目标中获取数据。
          • 同事是一个时许数据库,将监控数据保存在本地磁盘中,并对外提供自定义的PromQL语言实现对数据的查询和分析
      • Exporter

        • 用来采集数据,作用类似agent
        • 基于pull方式拉取数据。通过http服务将监控数据按照标准格式暴露给Prometheus Server,社区中由大量现成的,用户可以使用各种语言的client library自定义实现
      • Push gateway

        • 用于瞬时任务的场景,防止Prometheus Server来pull数据之前,这类短期任务就已经执行完毕了。因此这种任务可以采用push的方法主动汇报信息给push gateway缓存起来做中转。
      • Alert Manager

        • 发送报警
      • web控制台

        • 用来查询配置信息和指标等。一般这个系统配合grafana,作为数据源来使用。
    • 优势

      • 轻量管理:架构简单,不依赖外部存储,单个服务器节点可直接工作。便于迁移和维护。

      • 较强的处理能力:监控数据直接存储在Prometheus Server本地的时序数据库,单个实例可以处理数百万metrics

        metrics是什么?然后时序数据库是什么?

      • 灵活的数据类型,引入tag。属于多维度数据模型,聚合统计更方便。

      • 强大的查询语句:PromQL允许在同一个查询语句中,对多个mertics进行加法,连接和取分位值等操作。

      • 很好地支持云环境:自动服务发现。并且k8s和etcd等项目提供原生支持。

    • 劣势

      • 功能不够完善:不提供集群化方案,长期的持久化存储和用户管理。
      • 网络规划变复杂:要求所有被监控的endpoint必须可达,需要合理规划网络的安全配置。

选型建议

1 明确监控需求

  • 要监控的对象有哪些?
  • 机器数量和监控指标有哪些?
  • 需要具备什么样的报警功能?

2 初期可以跨素介入开源监控方案,后续建设

3 系统成熟度上看,Zabbix属于老牌监控系统,资料多,功能全且稳定,机器数量在几百台以内,不用太担心性能问题。采用数据库分区,ssd硬盘,proxy架构,push采集模式都可以提高监控性能。

4 Zabbix在服务器监控方面有绝对优势,但是应用层监控并不擅长。比如线程池,内部接口的监控都要做侵入式埋点。相反,新一代的监控系统这里都做得很好。

5 如果没有Zabbix这种监控的技术积累,建议使用Open-Falcon或者Prometheus

6 Open-Falcon的核心优势在于数据分片功能,能支撑更多的机器和监控项。Prometheus则在容器监控方面有优势。

7 三者都支持和Grafana的快速集成

8 用合适的监控系统解决相应的问题即可,可以多套并存。

9 在企业中后期,随着机器数据增加和个性化需求增多,往往要二次开发或集成监控系统,这么看,新一代的两个更好。

10 如果非要自研,可以多研究下主流监控系统的架构方案,借鉴优势。