什么是监控?
常见的开源监控都有哪些?
1、Zabbix(老牌监控的优秀代表)
zabbix是一个老牌监控系统,基于web界面的企业级开源监控软件。Zabbix服务器需要LAMP环境或LNMP环境,提供分布式系统监控与网络监视功能。其具备主机的性能监控,网络设备性能监控,数据库性能监控,多种告警方式,详细报表、图表的绘制等功能。监测对象可以是Linux或Windows服务器,也可以是路由器、交换机等网络设备,通过SNMP、zabbix Agent、PING、端口监视等方法提供对远程网络服务器等监控、数据收集等功能。
Zabbix架构图
- Zabbix Server:核心组件,C语言编写,负责接收Agent、Proxy发送的监控数据,也支持JMX、SNMP等多种协议直接采集数据。同时,它还负责数据的汇总存储以及告警触发等。
- Zabbix Proxy:可选组件,对于被监控机器较多的情况下,可使用Proxy进行分布式监控,它能代理Server收集部分监控数据,以减轻Server的压力。
- Zabbix Agentd:部署在被监控主机上,用于采集本机的数据并发送给Proxy或者Server,它的插件机制支持用户自定义数据采集脚本。Agent可在Server端手动配置,也可以通过自动发现机制被识别。数据收集方式同时支持主动Push和被动Pull 两种模式。
- Database:用于存储配置信息以及采集到的数据,支持MySQL、Oracle等关系型数据库。同时,最新版本的Zabbix已经开始支持时序数据库,不过成熟度还不高。
- Web Server:Zabbix的GUI组件,PHP编写,提供监控数据的展现和告警配置。
优点:
- 产品成熟:由于诞生时间长且使用广泛,拥有丰富的文档资料以及各种开源的数据采集插件,能覆盖绝大部分监控场景。
- 采集方式丰富:支持Agent、SNMP、JMX、SSH等多种采集方式,以及主动和被动的数据传输方式。
- 较强的扩展性:支持Proxy分布式监控,有agent自动发现功能,插件式架构支持用户自定义数据采集脚本。
- 配置管理方便:能通过Web界面进行监控和告警配置,操作方便,上手简单。
缺点:
- 性能瓶颈:机器量或者业务量大了后,关系型数据库的写入一定是瓶颈,官方给出的单机上限是5000台,个人感觉达不到,尤其现在应用层的指标越来越多。虽然最新版已经开始支持时序数据库,不过成熟度还不高。
- 应用层监控支持有限:如果想对应用程序做侵入式的埋点和采集(比如监控线程池或者接口性能),zabbix没有提供对应的sdk,通过插件式的脚本也能曲线实现此功能,个人感觉zabbix就不是做这个事的。
- 数据模型不强大:不支持tag,因此没法按多维度进行聚合统计和告警配置,使用起来不灵活。
- 方便二次开发难度大:Zabbix采用的是C语言,二次开发往往需要熟悉它的数据表结构,基于它提供的API更多只能做展示层的定制。
2、Cacti
发布于2001年, Cacti 是一款开源的基于PHP、MySQL、SNMP及RRDTool开发的网络流量监测图形分析工具。它通过snmpget来获取数据,使用 RRDtool绘画图形,它的界面非常漂亮,能让你根本无需明白rrdtool的参数能轻易的绘出漂亮的图形。而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结 构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,让你添加自己的snmp_query和script!功能非常强大完善,界面友好。
Cacyti架构图
优点:
- 开源,自由发行,开放源代码,运行高效。
- 跨平台,支持的平台redhat 、windows 、solaris、centos 、suse
- 界面友好,图形丰富、各种模板、自定义模板
- 可扩展,支持二十种的插件,丰富的插件资源,大大提高了cacti的功能。
缺点:
- 使用文本式的数据库,数据不能重复使用;
- 只能按日、周、月、年来查看数据;每图只能画两个DS(一条线、一个块);
- 每取一次数据即需要绘图一次,浪费系统资源;
- 不具备管理功能。
3、Nagios
Nagios是一款开源的企业级监控系统,能够实现对系统CPU、磁盘、网络等方面参数的基本系统监控,以及 SMTP,POP3,HTTP,NNTP等各种基本的服务类型。另外通过安装插件和编写监控脚本,用户可以实现应用监控,并针对大量的监控主机和多个对象 部署层次化监控架构。
优点:
- 出错的服务器、应用和设备会自动重启,自动日志滚动
- 配置灵活,可以自定义shell脚本,通过分布式监控模式
- 支持以冗余方式进行主机监控,报警设置多样
- 命令重新加载配置文件无需打扰Nagios的运行
缺点:
- 事件控制台功能弱,插件易用性差
- 对性能、流量等指标的处
- 无历史数据,难追查故障
- 配置复杂,初学者费时长
4、Grafana
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。它的数据可视化的展示功能非常强大,我们可以通过influxdb监控,Prometheus采集的主机信息,而且还不需要安装任何绘图插件,只需要将需要的数据加入到它的数据源中即可,然后通过内置的插件来展示你所需要的数据。
优点:
- 适合监控系统性能,通过曲线很容易见到每个节点的工作状态
- 可以自定义监控项,监控展示有表格和图像两种,支持手机版
- 部署方便,通过不同的分层管理上万台机器,无需逐个添加配置,有利于后期的大规模扩张。
缺点:
- 没有内置的消息通知系统
- 没有报警机制,出现问题不能够及时报警
5、Open-falcon(小米出品,国内流行)
Open-falcon是小米运维团队从互联网公司的需求出发,根据多年的运维经验,结合SRE、SA、DEVS的使用经验和反馈,开发的一套面向互联网的企业级开源监控产品。Open-falcon 是小米2015年开源的企业级监控工具,采用Go和Python语言开发,这是一款灵活、高性能且易扩展的新一代监控方案,目前小米、美团、滴滴等超过200家公司在使用它。小米初期也使用的Zabbix进行监控,但是机器量和业务量上来后,Zabbix就有些力不从心了。因此,后来自主研发了Open-Falcon,在架构设计上吸取了Zabbix的经验,同时很好地解决了Zabbix的诸多痛点。
Open-Falcon的架构设计:
- Falcon-agent:数据采集器和收集器,Go开发,部署在被监控的机器上,支持3种数据采集方式。首先它能自动采集单机200多个基础监控指标,无需做任何配置;同时支持用户自定义的plugin获取监控数据;此外,用户可通过http接口,自主push数据到本机的proxy-gateway,由gateway转发到server.
- Transfer:数据分发组件,接收客户端发送的数据,分别发送给数据存储组件Graph和告警判定组件Judge,Graph和Judge均采用一致性hash做数据分片,以提高横向扩展能力。同时Transfer还支持将数据分发到OpenTSDB,用于历史归档。
- Graph:数据存储组件,底层使用RRDTool(时序数据库)做单个指标的存储,并通过缓存、分批写入磁盘等方式进行了优化。据说一个graph实例能够处理8W+每秒的写入速率。
- Judge和Alarm:告警组件,Judge对Transfer组件上报的数据进行实时计算,判断是否要产生告警事件,Alarm组件对告警事件进行收敛处理后,将告警消息推送给各个消息通道。
- API:面向终端用户,收到查询请求后会去Graph中查询指标数据,汇总结果后统一返回给用户,屏蔽了存储集群的分片细节。
优点:
- 自动采集能力:Falcon-agent 能自动采集服务器的200多个基础指标(比如CPU、内存等),无需在server上做任何配置,这一点可以秒杀Zabbix.
- 强大的存储能力 :底层采用RRDTool,并且通过一致性hash进行数据分片,构建了一个分布式的时序数据存储系统,可扩展性强。
- 灵活的数据模型:借鉴OpenTSDB,数据模型中引入了tag,这样能支持多维度的聚合统计以及告警规则设置,大大提高了使用效率。
- 插件统一管理:Open-Falcon的插件机制实现了对用户自定义脚本的统一化管理,可通过HeartBeat Server分发给agent,减轻了使用者自主维护脚本的成本。
- 个性化监控支持:基于Proxy-gateway,很容易通过自主埋点实现应用层的监控(比如监控接口的访问量和耗时)和其他个性化监控需求,集成方便。
缺点:
- 整体发展一般:社区活跃度不算高,同时版本更新慢,有些大厂是基于它的稳定版本直接做二次开发的,关于以后的前景其实有点担忧。
- UI不够友好 :对于业务线的研发来说,可能只想便捷地完成告警配置和业务监控,但是它把机器分组、策略模板、模板继承等概念全部暴露在UI上,感觉在围绕这几个概念设计UI,理解有点费劲。
- 安装比较复杂:个人的亲身感受,由于它是从小米内部衍生出来的,虽然去掉了对小米内部系统的依赖,但是组件还是比较多,如果对整个架构不熟悉,安装很难一蹴而就
6、Prometheus
Prometheus(普罗米修斯)是由前google员工2015年正式发布的开源监控系统,采用Go语言开发。它不仅有一个很酷的名字,同时它有Google与k8s的强力支持,开源社区异常火爆。Prometheus 2016年加入云原生基金会,是继k8s后托管的第二个项目,未来前景被相当看好。它和Open-Falcon最大不同在于:数据采集是基于Pull模式的,而不是Push模式,并且架构非常简单。
Prometheus的架构设计:
- Prometheus Server:核心组件,用于收集、存储监控数据。它同时支持静态配置和通过Service Discovery动态发现来管理监控目标,并从监控目标中获取数据。此外,Prometheus Server 也是一个时序数据库,它将监控数据保存在本地磁盘中,并对外提供自定义的 PromQL 语言实现对数据的查询和分析。
- Exporter:用来采集数据,作用类似于agent,区别在于Prometheus是基于Pull方式拉取采集数据的,因此,Exporter通过HTTP服务的形式将监控数据按照标准格式暴露给Prometheus Server,社区中已经有大量现成的Exporter可以直接使用,用户也可以使用各种语言的client library自定义实现。
- Push gateway:主要用于瞬时任务的场景,防止Prometheus Server来pull数据之前此类Short-lived jobs就已经执行完毕了,因此job可以采用push的方式将监控数据主动汇报给Push gateway缓存起来进行中转。
- Alert Manager:当告警产生时,Prometheus Server将告警信息推送给Alert Manager,由它发送告警信息给接收方。
- Web UI:Prometheus内置了一个简单的web控制台,可以查询配置信息和指标等,而实际应用中我们通常会将Prometheus作为Grafana的数据源,创建仪表盘以及查看指标。
优点:
- 轻量管理:架构简单,不依赖外部存储,单个服务器节点可直接工作,二进制文件启动即可,属于轻量级的Server,便于迁移和维护。
- 较强的处理能力:监控数据直接存储在Prometheus Server本地的时序数据库中,单个实例可以处理数百万的metrics。
- 灵活的数据模型:同Open-Falcon,引入了tag,属于多维数据模型,聚合统计更方便。
- 强大的查询语句:PromQL允许在同一个查询语句中,对多个metrics进行加法、连接和取分位值等操作。
- 很好地支持云环境:能自动发现容器,同时k8s和etcd等项目都提供了对Prometheus的原生支持,是目前容器监控最流行的方案。
缺点:
- 功能不够完善:Prometheus从一开始的架构设计就是要做到简单,不提供集群化方案,长期的持久化存储和用户管理,而这些是企业变大后所必须的特性,目前要做到这些只能在Prometheus之上进行扩展。
- 网络规划变复杂:由于Prometheus采用的是Pull模型拉取数据,意味着所有被监控的endpoint必须是可达的,需要合理规划网络的安全配置。
监控系统的选型建议
1、先明确清楚你的监控需求:要监控的对象有哪些?机器数量和监控指标有多少?需要具备什么样的告警功能?
2、监控是一项长期建设的事情,一开始就想做一个 All In One 的监控解决方案,我觉得没有必要。从成本角度考虑,在初期直接使用开源的监控方案即可,先解决有无问题。
3、从系统成熟度上看,Zabbix属于老牌的监控系统,资料多,功能全面且稳定,如果机器数量在几百台以内,不用太担心性能问题,另外,采用数据库分区、SSD硬盘、Proxy架构、Push采集模式都可以提高监控性能。
4、Zabbix在服务器监控方面占绝对优势,可以满足90%以上的监控场景,但是应用层的监控似乎并不擅长,比如要监控线程池的状态、某个内部接口的执行时间等,这种通常都要做侵入式埋点。相反,新一代的监控系统Open-Falcon和Prometheus在这一点做得很好。
5、从整体表现上来看,新一代监控系统也有明显的优势,比如:灵活的数据模型、更成熟的时序数据库、强大的告警功能,如果之前对zabbix这种传统监控没有技术积累,建议使用Open-Falcon或者Prometheus.
6、Open-Falcon的核心优势在于数据分片功能,能支撑更多的机器和监控项;Prometheus则是容器监控方面的标配,有Google和k8s加持。
7、Zabbix、Open-Falcon和Prometheus都支持和Grafana做快速集成,想要美观且强大的可视化体验,可以和Grafana进行组合。
8、用合适的监控系统解决相应的问题即可,可以多套监控同时使用,这种在企业初期很常见。
9、到中后期,随着机器数据增加和个性化需求增多(比如希望统一监控平台、打通公司的CMDB和组织架构关系),往往需要二次开发或者通过监控系统提供的API做集成,从这点来看,Open-Falcon或者Prometheus更合适。
10、如果非要自研,可以多研究下主流监控系统的架构方案,借鉴它们的优势。