• Linux监控系统概览


    自从Linux系统诞生之始,监控系统就随之出现。

    当然说到监控系统,我们就必须聊到SNMP协议,SNMP分为管理端(NMP)和被管理端。

    管理端周期性的到被监控端采集数据,被监控端还需要有权限收集数据,然后将数据回馈给NMS。

    SNMP是一种常见的协议,众多网络工具和众多操作系统都支持。

    比如常见的路由交换都内置SNMP的agent,既可以作为管理端又可以作为被管理端。

    linux有net-snmp这个包。SNMP大致有三个版本,比较通行v2c,无论是v1还是v2安全性都很差,数据传输是明文的,认证机制也很薄弱,但尽管如此,v3仍不通行。

    但好在支持网络管理的功能。很多开源的监控软件都有自己开发的agent,这样安全性就会好了很多。

    如果想简单的获取数据,使用SNMP会比较快捷。SNMP只负责数据采集,数据采集之后如何存储、如何分析是个问题。

    早期的cacti监控系统,就是调用SNMP的功能,然后进行一些其它操作。使用PHP编写。不需要安装agent。支持模板,使用rrd(轮转数据库)。

    cacti利用SNMP采集数据,利用rrd保存数据并绘图。cacti本身没有报警功能,可以安装插件来进行报警。

    cacti只是比较原始的、功能比较单一的监控系统,后面陆续有Nagios、Zabbix、Prometheus等监控系统出现。

    监控对象也从原来的对服务器、程序、web页面等方面衍生到了对容器等多方面的监控。

    下面会简要说明常见的一些监控系统:

    1.Nagios

     Nagios原名为NetSaint,由Ethan Galstad开发并维护。Nagios是一个老牌监控工具,由C语言编写而成。
    主要针对于主机监控(CPU、内存、磁盘等)和网络监控(SMTP、POP3、HTTP和NNTP等),也支持用户自定义监控脚本。

    Nagios的整体架构非常清晰,它通过Plugin采集各种监控数据。
    Nagios数据被保存在RRD环形数据库中,特别适合存储时序数据。

    总体来说,Nagios的报警功能还是非常强大,支持软状态切换、支持依赖关系定义。
    但是Nagios只关心正常与否的问题,不适合实时监控,你无法的获取某个监控项时间段的状态。
    与Zabbix一样,在大规模集群、高性能服务要求等场景下,Nagios会显得有点力不从心。

    2.Zabbix

    Zabbix基本上可以满足中小型公司对于监控的需求,其支持多种采集方式、支持多种协议。
    基本上可以做到监控一切需要监控的监控项,其发展已经非常成熟,有非常完善的内置监控项,
    同时组件较少,上手难度不高,管理也特别方便,是很多创业公司的首选。

    zabbix的组件并不是非常多,虽然清晰明确,但是制约了其性能。主要组件有以下部分:
    (1)Zabbix Server
    Zabbix的核心组件,由C语言编写而成,主要负责接收Agent发送的监控信息,并进行汇总存储。主要工作内容有以下三点:
    设备注册:将需要监控的对象纳入监控系统中,有手动配置和自动发现两种方式。
    数据收集:包括主动收集和被动收集,然后将数据保存到数据库中。
    数据清理和告警触发:通过触发器与采集的数据匹配,满足条件则会进行告警。

    Zabbix Server把基本能做的事情都做了,这样非常制约其性能,在其后出现的监控系统中都会将其功能进行拆分。

    (2)Zabbix Database
    用于存储配置信息及Zabbix收集到的监控数据,支持多种类型的数据库,包括MySQL、Oracle、PostgreSQL等。
    由于Zabbix诞生的时间比较久远,采用的都是关系型数据库,
    因此在监控大规模集群或者监控项繁多的情况下可能会存在问题。

    (3)Zabbix Web
    Zabbix的GUI组件,由PHP编写而成,通常与Server运行在同一台机器上,
    提供监控数据的展现和系统配置,主要配置包括监控模板、告警等。

    (4)Proxy
    可选组件,常用于分布式监控环境中,代理Server收集部分被监控的监控数据,
    并按照一定的频率统一发往Server端。Proxy有自己的数据库,主要为了解决以下两个问题。
    Server和Agent之间网络不连通。
    减轻Server的压力。

    Proxy并不能完全解决Server组件负载的过重的麻烦。

    (5)Agent
    主要用来采集被监控端的数据。

    3.Open-Flacon

    Open-Falcon是小米开源的企业级监控工具,由Go语言开发而成,包括小米、滴滴、美团在内的互联网公司都在使用。
    Open-Falcon是一款灵活、可扩展并且高性能的监控方案。

    它的主要组件有以下部分:
    (1)Falcon-agent
    用Go语言开发的Daemon程序,运行在每台Linux服务器上,用于采集主机上的各种指标数据。
    主要包括CPU、内存、磁盘、文件系统、内核参数、Socket连接等,目前已经支持200多项监控指标。
    并且,Agent支持用户自定义的监控脚本,脚本必须返回Agent指定的数组格式。Agent采集的数据会通过RPC方式上报到Tranfer。
    为了避免单个Transfer发生故障,Agent支持配置多个Transfer地址,还可以忽略多余的监控指标。
    Agent本身也可以成为一个Proxy-gateway代理网关,接收第三方HTTP请求并将其转发到Transfer中。

    类似zabbix的agent,Kubernetes自带监控体系中的cAdvisor,Nagios中的Plugin,
    本质就是一个被封装的SNMP协议的客户端,都是用来进行数据采集的,也是监控系统中必备的组件了。

    (2)Hearthbeat server
    简称HBS(心跳服务),每个Agent都会周期性地通过RPC方式将自己地状态上报给HBS,
    主要包括主机名、主机IP、Agent版本和插件版本,Agent还会从HBS获取自己需要执行的采集任务和自定义插件。

    (3)Transfer
    负责监控agent发送的监控数据,并对数据进行处理,在过滤后通过一致性Hash算法将数据发送到Judge或者Graph。
    为了支持存储大量的历史数据,Transfer还支持OpenTSDB。Transfer本身没有状态,可以随意扩展。

    数据的处理和汇总也是每个监控系统必须的流程,类似的组件由Heapster、Logstash。

    (4)Jedge
    告警模块,Transfer转发到Judge的数据会触发用户设定的告警规则,如果满足,则会触发邮件、微信或者回调接口。
    这里为了避免重复告警,引入了Redis暂存告警,从而完成告警合并和抑制。

    (5)Graph
    RRD数据上报、归档、存储的组件。Graph在收到数据以后,会以RRDtool的数据归档方式存储数据,同时提供RPC方式的监控查询接口。

    在Nagios和catia中,也是将数据保存在RDD环形数据库中,Zabbix的存储数据相对多样,可以是MySQL、Oracle等
    而在kubernetes自带的监控体系中,也是可以保存到多种存储系统中,例如InfluxDB、Kafka等
    灵活的存储的体系是开源软件的一种必要的设计原则。

    (6)API
    主要提供查询接口,不但可以从Grapg里面读取数据,还可以对接MySQL,用于保存告警、用户等信息。

    (7)Dashboard
    由Python开发而成,提供Open-Falcon的数据和告警展示,监控数据来自Grash,Dashboard允许用户自定义监控面板。

    (8)Aggregator
    聚合组件,聚合某集群下所有机器的某个指标的值,提供一种集群视角的监控体验。
    通过定时从Graph获取数据,按照集群聚合产生新的监控数据并将监控数据发送到Transfer。

    总的说来,小米的这套Open-Falcon监控系统设计的还是特别合理,功能也特别丰富。
    但是这类系统相比于Zabbix来说,管理起来还是相对复杂,同时对于二次开发还是有一定要求。
    其相对于其它一些常见的开源监控杆系统来说,其监控的业务场景更大,不像Zabbix免费版本只适合中小型企业。
    它能够支持中大型公司复杂业务监控场景的高可用的需求。

    4.Prometheus

    Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态,
    任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式,就可以接入Prometheus监控。

    Prometheus Server负责定时在目标上抓取metrics(指标)数据,
    每个抓取目标都需要暴露一个HTTP服务接口用于Prometheus定时抓取。

    TSDB通过一定的规则清理和整理数据,并把得到的结果存储到新的时间序列中。一般有以下两种存储方式:
    一种是本地存储。通过Prometheus自带的时序数据库将数据保存到本地磁盘,为了性能考虑,建议使用SSD。
    另一种是远端存储,适用于存储大量监控数据。通过中间层的适配器的转化,
    目前Prometheus支持OpenTSDB、InfluxDB、Elasticsearch等后端存储,
    通过适配器实现Prometheus存储remote write和remote read接口,便可以接入Prometheus作为远端存储使用。
    HDD代表硬盘,SSD是固态硬盘。

    Prometheus通过PromQL和其它API可视化地展示收集地数据。
    Prometheus支持多种方式地图标可视化,例如Grafana、自带的PromDash及自生提供的模板引擎。
    Prometheus还提供HTTP API拆查询方式、自定义所需的输出。

    Prometheus提供了PushGateway的支持,这些系统主动推送metrics到PushGateway,而后Prometheus定时去gateway上抓取数据。

    AlertManager是独立于Prometheus的一个组件,在触发了预先设置在Prometheus中的高级规则后,Prometheus会推送告警信息到AlertManager。
    AlertManager提供了非常灵活的告警方式,可以通过邮件、slack等途径推送。
    AlertManager支持高可用部署,为了解决多个AlertManager重复告警的问题,引入Gossip,在多个AlerManager之间通过Gossip同步告警信息。

    5.Heapster+InfuxDB+Grafana

    Heapster是Google专门面向Kubernetes开发的性能数据集中监控系统,可以与多种系统对接,构成完整的监控平台。

      主要组件如下所示:
    (1)cAdvisor

    是Google开发的容器监控组件,部署在每一个Kubernetes Node节点上,
    负责收集所在主机及该主机上所有容器的性能数据,包括CPU、Memory、FileSystem、Network I/O等
    Heapster:负责汇总各Node节点上cAdvisor的数据,并可以保存多种后端存储系统(例如InfluxDB、Kafka等)。
    Heapster的工作流程:访问master节点,获取当前集群节点的信息,然后访问各节点的Kubelet组件API,再通过调用cAdvisor的API来收集该节点上所有容器的性能数据。
    Heapster对采集到的数据进行聚合,将结果保存(sink)到多种后端存储,例如InfluxDB、Elasticsearch等,为容器集群的监控和性能分析提供了强大的支持。

    (2)InfluxDB

    是用一种Go语言编写的分布式时序数据库,能够存储监控数据、应用数据、IoT传感数据等各种场景中大规模带时间戳的数据,
    支持使用类SQL语句进行实时查询,提供可定制的数据存储保留策略,还提供RESTful API进行数据的存储和访问。

    (3)Grafana

    是一款页面展示工具,提供多种分析插件,可以支持多种主流数据库(InfluxDB、Elasticsearch、Graphite、CloudWatch等)的数据展示。
    它可将保持在InfluxDB中的数据以图表、曲线等形式进行展示,方便运维人员实时监控整个集群的运行状态。

    总的来说,Heapster只是针对kubernetes来设计的监控平台。
    因为其是通过调用kubelet的API接口,kubelet再调用cAdvisor的API接口来进行数据的收集。
    随后通过Heapster将数据存储到数据库,最后通过其它的组件展示出来。

      下面针对Prometheus、Zabbix、Nagios和Open-Falcon这几种监控系统的对比:

    从开发语言上看,为了应对高并发和快速迭代的需求,监控系统的开发语言已经慢慢从C转移到了Go。
    不得不说,Go凭借简洁的语法和优雅的并发,在Java占据业务开发领域,C占领底层开发领域的情况下,
    准确定义中间件开发需求,在当前的开源中间件产品中被广泛应用。

    从系统成熟方面来看,Zabbix和Nagios都是老牌监控系统:Zabbix诞生于1998年,Nagios诞生于1999年,系统功能都比较稳定,成熟度较高。
    而Prometheus和Open-Falcon都是最近几年才诞生,虽然功能还在不断迭代、更新,但是毕竟还很年轻,
    而Heapster则完全要依赖于kubernetes,因此更加年轻。

    从系统扩展性能来看,Zabbix和Open-Falcon都可以自定义各种监控脚本,Zabbix不仅可以做到主动推送,还可以做到被动拉取。
    Prometheus则定义了一套监控数据规范,并通过各种exporter扩展系统采集能力。

    从数据存储方面来看,Zabbix采用关系型数据库存储数据,这极大限制了Zabbix的数据采集能力。
    Nagios和Open-Falcon都采用了RDD数据存储方式。Open-Falcon还加入了一致性Hash算法进行数据分片,
    并且可以对接到OpenTSDB,而且Prometheus自己开发了一套高性能时序数据库,
    在V3版本时可以达到每秒千万级别的数据存储,可通过对接第三方时序数据库扩展对历史数据的存储性能。

    从社区活跃度方面来看,目前Zabbix和Nagios的社区活跃度比较低,
    尤其是Nagios和Open-Falcon的社区虽然也比较活跃,但基本都是国内的公司在参与。
    Prometheus的社区活跃度很高,并且得到CNCF的支持,后期的发展值得期待。

    从容器支持方面来看,由于Zabbix和Nagios出现的比较早,当时容器还没有诞生,所以它们对容器的支持自然比较差。
    Open-Falcon虽然提供了容器监控的功能,但支持力度有限。
    Prometheus的动态发现机制,不仅支持Swarm原生集群,还支持Kubernetes容器集群监控,是目前容器集群监控的最佳方案。
    总的来说,Nagios在网络监控方面有广泛应用,zabbix在传统的服务器监控相关方面占绝对优势。
    Prometheus则是容器领域的标配,Heapster在kubernetes1.11版本之后,逐渐被废弃。

  • 相关阅读:
    为什么接口类型可以直接new?
    Eclipse查看JDK源码
    模板模式与策略模式/template模式与strategy模式/行为型模式
    [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal(根据二叉树的前序和中序遍历构建二叉树)
    [LeetCode] 114. Flattern Binary Tree to Linked List(将二叉树扁平化成单链表)
    [LeetCode] 208. Implement Trie (Prefix Tree)(实现字典树)
    [LeetCode] 337. House Robber Ⅲ(偷家贼之三)
    [LeetCode] 621. Task Scheduler(任务调度器)
    [LeetCode] 394. Decode String(解码字符串)
    [LeetCode] 11. Container with Most Water(盛水量最多的容器)
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/11208224.html
Copyright © 2020-2023  润新知