今天这篇文章,我将对监控体系的基础知识、原理和架构做一次系统性梳理,同时还会对几款最常用的开源监控产品做下介绍,以便大家选型时参考。
内容包括3部分:
必知必会的监控基础知识
主流监控系统介绍
监控系统的选型建议
01 必知必会的监控基础知识
监控系统俗称「第三只眼」,几乎是我们每天都会打交道的系统,下面 4 项基础知识我认为是必须要了解的。
1. 监控系统的7大作用 正所谓「无监控,不运维」,监控系统的地位不言而喻。不管你是监控系统的开发者还是使用者,首先肯定要清楚:监控系统的目标是什么?它能发挥什么作用?
实时采集监控数据:包括硬件、操作系统、中间件、应用程序等各个维度的数据。
实时反馈监控状态:通过对采集的数据进行多维度统计和可视化展示,能实时体现监控对象的状态是正常还是异常。
预知故障和告警:能够提前预知故障风险,并及时发出告警信息。
辅助定位故障:提供故障发生时的各项指标数据,辅助故障分析和定位。
辅助性能调优:为性能调优提供数据支持,比如慢sql,接口响应时间等。
辅助容量规划:为服务器、中间件以及应用集群的容量规划提供数据支撑。
辅助自动化运维:为自动扩容或者根据配置的sla进行服务降级等智能运维提供数据支撑。
2. 使用监控系统的正确姿势
“
出任何线上事故,先不说其他地方有问题,监控部分一定是有问题的。
听着很甩锅的一句话,仔细思考好像有一定道理。我们在事故复盘时,通常会思考这3个和监控有关的问题:有没有做监控?监控是否及时?监控信息是否有助于快速定位问题?
可见光有一套好的监控系统还不够,还必须知道「如何用好它」。一个成熟的研发团队通常会定一个监控规范,用来统一监控系统的使用方法。
了解监控对象的工作原理:要做到对监控对象有基本的了解,清楚它的工作原理。比如想对jvm进行监控,你必须清楚jvm的堆内存结构和垃圾回收机制。
确定监控对象的指标:清楚使用哪些指标来刻画监控对象的状态?比如想对某个接口进行监控,可以采用请求量、耗时、超时量、异常量等指标来衡量。
定义合理的报警阈值和等级:达到什么阈值需要告警?对应的故障等级是多少?不需要处理的告警不是好告警,可见定义合理的阈值有多重要,否则只会降低运维效率或者让监控系统失去它的作用。
建立完善的故障处理流程:收到故障告警后,一定要有相应的处理流程和oncall机制,让故障及时被跟进处理。
3. 监控的对象和指标都有哪些? 监控已然成为了整个产品生命周期非常重要的一环,运维关注硬件和基础监控,研发关注各类中间件和应用层的监控,产品关注核心业务指标的监控。可见,监控的对象已经越来越立体化。 这里,我对常用的监控对象以及监控指标做了分类整理,供大家参考。
3.1 硬件监控
包括:电源状态、cpu状态、机器温度、风扇状态、物理磁盘、raid状态、内存状态、网卡状态
3.2 服务器基础监控
cpu:单个cpu以及整体的使用情况
内存:已用内存、可用内存
磁盘:磁盘使用率、磁盘读写的吞吐量
网络:出口流量、入口流量、tcp连接状态
3.3 数据库监控
包括:数据库连接数、qps、tps、并行处理的会话数、缓存命中率、主从延时、锁状态、慢查询
3.4 中间件监控
nginx:活跃连接数、等待连接数、丢弃连接数、请求量、耗时、5xx错误率
tomcat:最大线程数、当前线程数、请求量、耗时、错误量、堆内存使用情况、gc次数和耗时
缓存 :成功连接数、阻塞连接数、已使用内存、内存碎片率、请求量、耗时、缓存命中率
消息队列:连接数、队列数、生产速率、消费速率、消息堆积量
3.5 应用监控
http接口:url存活、请求量、耗时、异常量
rpc接口:请求量、耗时、超时量、拒绝量
jvm :gc次数、gc耗时、各个内存区域的大小、当前线程数、死锁线程数
线程池:活跃线程数、任务队列大小、任务执行耗时、拒绝任务数
连接池:总连接数、活跃连接数
日志监控:访问日志、错误日志
业务指标:视业务来定,比如pv、订单量等
4. 监控系统的基本流程 无论是开源的监控系统还是自研的监控系统,监控的整个流程大同小异,一般都包括以下模块:
数据采集:采集的方式有很多种,包括日志埋点进行采集(通过logstash、filebeat等进行上报和解析),jmx标准接口输出监控指标,被监控对象提供rest api进行数据采集(如hadoop、es),系统命令行,统一的sdk进行侵入式的埋点和上报等。
数据传输:将采集的数据以tcp、udp或者http协议的形式上报给监控系统,有主动push模式,也有被动pull模式。
数据存储:有使用mysql、oracle等rdbms存储的,也有使用时序数据库rrdtool、openttsdb、influxdb存储的,还有使用hbase存储的。
数据展示:数据指标的图形化展示。
监控告警:灵活的告警设置,以及支持邮件、短信、im等多种通知通道。
02 主流监控系统介绍 下面再来认识下主流的开源监控系统,由于篇幅有限,我挑选了3款使用最广泛的监控系统:zabbix、open-falcon、prometheus,会对它们的架构进行介绍,同时总结下各自的优劣势。
1. zabbix(老牌监控的优秀代表)
zabbix 1998年诞生,核心组件采用c语言开发,web端采用php开发。它属于老牌监控系统中的优秀代表,监控功能很全面,使用也很广泛,差不多有70%左右的互联网公司都曾使用过 zabbix 作为监控解决方案。
先来了解下zabbix的架构设计:
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编写,提供监控数据的展现和告警配置。
下面是 zabbix 的优势:
产品成熟:由于诞生时间长且使用广泛,拥有丰富的文档资料以及各种开源的数据采集插件,能覆盖绝大部分监控场景。
采集方式丰富:支持agent、snmp、jmx、ssh等多种采集方式,以及主动和被动的数据传输方式。
较强的扩展性:支持proxy分布式监控,有agent自动发现功能,插件式架构支持用户自定义数据采集脚本。
配置管理方便:能通过web界面进行监控和告警配置,操作方便,上手简单。
下面是 zabbix 的劣势:
性能瓶颈:机器量或者业务量大了后,关系型数据库的写入一定是瓶颈,官方给出的单机上限是5000台,个人感觉达不到,尤其现在应用层的指标越来越多。虽然最新版已经开始支持时序数据库,不过成熟度还不高。
应用层监控支持有限:如果想对应用程序做侵入式的埋点和采集(比如监控线程池或者接口性能),zabbix没有提供对应的sdk,通过插件式的脚本也能曲线实现此功能,个人感觉zabbix就不是做这个事的。
数据模型不强大:不支持tag,因此没法按多维度进行聚合统计和告警配置,使用起来不灵活。
方便二次开发难度大:zabbix采用的是c语言,二次开发往往需要熟悉它的数据表结构,基于它提供的api更多只能做展示层的定制。
2. open-falcon
open-falcon 是小米2015年开源的企业级监控工具,采用go和python语言开发,这是一款灵活、高性能且易扩展的新一代监控方案,目前小米、美团、滴滴等超过200家公司在使用它。
小米初期也使用的zabbix进行监控,但是机器量和业务量上来后,zabbix就有些力不从心了。因此,后来自主研发了open-falcon,在架构设计上吸取了zabbix的经验,同时很好地解决了zabbix的诸多痛点。
先来了解下open-falcon的架构设计:
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中查询指标数据,汇总结果后统一返回给用户,屏蔽了存储集群的分片细节。
下面是open-falcon的优势:
自动采集能力:falcon-agent 能自动采集服务器的200多个基础指标(比如cpu、内存等),无需在server上做任何配置,这一点可以秒杀zabbix.
强大的存储能力:底层采用rrdtool,并且通过一致性hash进行数据分片,构建了一个分布式的时序数据存储系统,可扩展性强。
灵活的数据模型:借鉴opentsdb,数据模型中引入了tag,这样能支持多维度的聚合统计以及告警规则设置,大大提高了使用效率。
插件统一管理:open-falcon的插件机制实现了对用户自定义脚本的统一化管理,可通过heartbeat server分发给agent,减轻了使用者自主维护脚本的成本。
个性化监控支持:基于proxy-gateway,很容易通过自主埋点实现应用层的监控(比如监控接口的访问量和耗时)和其他个性化监控需求,集成方便。
下面是open-falcon的劣势:
整体发展一般:社区活跃度不算高,同时版本更新慢,有些大厂是基于它的稳定版本直接做二次开发的,关于以后的前景其实有点担忧。
ui不够友好:对于业务线的研发来说,可能只想便捷地完成告警配置和业务监控,但是它把机器分组、策略模板、模板继承等概念全部暴露在ui上,感觉在围绕这几个概念设计ui,理解有点费劲。
安装比较复杂:个人的亲身感受,由于它是从小米内部衍生出来的,虽然去掉了对小米内部系统的依赖,但是组件还是比较多,如果对整个架构不熟悉,安装很难一蹴而就。
3. prometheus(号称下一代监控系统)
prometheus(普罗米修斯)是由前google员工2015年正式发布的开源监控系统,采用go语言开发。它不仅有一个很酷的名字,同时它有google与k8s的强力支持,开源社区异常火爆。
prometheus 2016年加入云原生基金会,是继k8s后托管的第二个项目,未来前景被相当看好。它和open-falcon最大不同在于:数据采集是基于pull模式的,而不是push模式,并且架构非常简单。
先来了解下prometheus的架构设计:
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的数据源,创建仪表盘以及查看指标。
下面是prometheus的优势:
轻量管理:架构简单,不依赖外部存储,单个服务器节点可直接工作,二进制文件启动即可,属于轻量级的server,便于迁移和维护。
较强的处理能力:监控数据直接存储在prometheus server本地的时序数据库中,单个实例可以处理数百万的metrics。
灵活的数据模型:同open-falcon,引入了tag,属于多维数据模型,聚合统计更方便。
强大的查询语句:promql允许在同一个查询语句中,对多个metrics进行加法、连接和取分位值等操作。
很好地支持云环境:能自动发现容器,同时k8s和etcd等项目都提供了对prometheus的原生支持,是目前容器监控最流行的方案。
下面是prometheus的劣势:
功能不够完善:prometheus从一开始的架构设计就是要做到简单,不提供集群化方案,长期的持久化存储和用户管理,而这些是企业变大后所必须的特性,目前要做到这些只能在prometheus之上进行扩展。
网络规划变复杂:由于prometheus采用的是pull模型拉取数据,意味着所有被监控的endpoint必须是可达的,需要合理规划网络的安全配置。
03 监控系统的选型建议
通过上面的介绍,大家对主流的监控系统应该有了一定的认识。面对选型问题,我的建议是:
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、如果非要自研,可以多研究下主流监控系统的架构方案,借鉴它们的优势。
2016年中国品牌彩电出货量达到8360万台 首超韩国跃居世界第一
韩国为可穿戴设备开发出超级电容器无线充电技术
基于智能手机的干线公路养护数据采集系统
TVS二极管和ESD二极管关键选型参数解析,超全面
135张电工接线图,够你琢磨一天了
主流监控系统技术选型
华为P40Pro镜头再升级,拍照技术全球领先
如何将声控麦克风与低功耗处理器或编解码器结合使用
智能天线,智能天线工作原理是什么?
效率可突破25%,异质结电池再次得到业界关注
模拟IQ调制器的特性
5G、MEC与机器视觉相遇擦出怎样的火花
传纬创产能不足 英伟达将AI服务器订单转交鸿海
苹果屏下指纹解锁技术2020年可实现商用
新能源充电桩在停车场的应用案例
土壤重金属快速检测仪的功能
荣耀9最新消息:6月27日柏林举行海外发布会,今日预售,售价暴走向世界证明国产荣耀
运动蓝牙耳机什么品牌好,有哪些值得入手的运动耳机
德国反对欧盟禁止销售燃油汽车的提议,称欧洲相关产业还不够成熟
算力经济下DPU芯片的发展机遇