共计 5328 个字符,预计需要花费 14 分钟才能阅读完成。
导读 | 对于我们应用系统而言,监控系统就像我们第三只眼,如果有应用系统出现问题,我们可以通过监控系统看是哪里出现问题。 |
这篇文章,我将对监控体系的基础知识、原理和架构做一次系统性整理,同时还会对几款最常用的开源监控产品做下介绍,以便大家选型时参考。内容包括 3 部分:
我们可以理解监控系统就像我们古代打战的哨兵一样,哨兵的角色非常重要,敌人来了,哨兵会第一时间发出预警 (吹笛、打鼓、放烟),让守城的战士能够最快的时间处理,应对。
那对于我们应用系统而言,监控系统就像我们第三只眼,如果有应用系统出现问题,我们可以通过监控系统看是哪里出现问题,是 redis 挂了,还是说服务器内存满了,有监控系统我们可以很轻松、快速的定位问题。
甚至我们可以设置预警,对一些将要出现的问题进行提前预防处理,及时避免问题的发生。
帮助定位故障: 在发生故障时,我们可以通过查看监控系统的各项指标数据,辅助故障分析和定位。
预警减少故障率: 对于即将可能产生的故障能够及时发出预警信息,做好提前预防处理。
辅助容量规划: 为服务器、中间件以及应用集群的容量规划提供数据支撑。
辅助性能调优:JVM 垃圾回收次数、接口响应时间、慢 SQL 等等都可以监控优化。
服务器监控:CPU 使用率、内存使用率、磁盘使用率、磁盘读写的吞吐量、网络出入流量等等。
MySQL 监控:TPS、QPS、数据库连接数、慢 SQL、InnoDB 缓冲池命中率等等。
Redis 监控: 内存使用率、缓存命中率、key 值总数、Redis 响应请求时间、客户端连接数、持久性指标等等。
MQ 监控:连接数、队列数、生产速率、消费速率、消息堆积量等等。
应用监控:
HTTP 接口:URL 存活、请求量、耗时、异常量。
JVM:GC 次数、GC 耗时、各个内存区域的大小、当前线程数、死锁线程数。
线程池:活跃线程数、任务队列大小、任务执行耗时、拒绝任务数。
数据采集:采集的方式有很多种,包括日志埋点进行采集,JMX 标准接口输出监控指标,被监控对象提供 REST API 进行数据采集(如 Hadoop、ES),系统命令行,统一的 SDK 进行侵入式的埋点和上报等。
数据传输:将采集的数据以 TCP、UDP 或者 HTTP 协议的形式上报给监控系统,有主动 Push 模式,也有被动 Pull 模式。
数据存储:有使用 MySQL、Oracle 等关系数据库存储的,也有使用时序数据库 RRDTool、OpentTSDB、InfluxDB 存储的,还有使用 HBase 存储的。
数据展示:数据指标的图形化展示。
监控告警:灵活的告警设置,以及支持邮件、短信、IM 等多种通知通道。
下面再来认识下主流的开源监控系统,由于篇幅有限,我挑选了 3 款使用最广泛的监控系统:Zabbix、Open-Falcon、Prometheus,会对它们的架构进行介绍,同时总结下各自的优劣势。
图片 Zabbix 1998 年诞生,核心组件采用 C 语言开发,Web 端采用 PHP 开发。它属于老牌监控系统中的优秀代表,监控功能很全面,使用也很广泛,差不多有 70% 左右的互联网公司都曾使用过 Zabbix 作为监控解决方案。
先来了解下 Zabbix 的架构设计:
Zabbix Server
核心组件,C 语言编写,负责接收 Agent、Proxy 发送的监控数据。同时,它还负责数据的汇总存储以及告警触发等。
Zabbix Proxy
可选组件,对于被监控机器较多的情况下,可使用 Proxy 进行分布式监控,它能代理 Server 收集部分监控数据,以减轻 Server 的压力。
Zabbix Agentd
部署在被监控主机上,用于采集本机的数据并发送给 Proxy 或者 Server。数据收集方式同时支持主动 Push 和被动 Pull 两种模式。
Database
用于存储配置信息以及采集到的数据,支持 MySQL、Oracle 等关系型数据库。同时,最新版本的 Zabbix 已经开始支持时序数据库,不过成熟度还不高。
Web Server
Zabbix 的 GUI 组件,PHP 编写,提供监控数据的展现和告警配置。
Zabbix 的优势
产品成熟
由于诞生时间长且使用广泛,拥有丰富的文档资料以及各种开源的数据采集插件,能覆盖绝大部分监控场景。
采集方式丰富
支持 Agent、SNMP、JMX、SSH 等多种采集方式,以及主动和被动的数据传输方式。
Zabbix 的劣势
需要在被监控主机上安装 Agent,所有的数据都存在数据库里,产生的数据很大,瓶颈主要在数据库。
Open-falcon 是小米 2015 年开源的企业级监控工具,采用 Go 和 Python 语言开发,这是一款灵活、高性能且易扩展的新一代监控方案,目前小米、美团、滴滴等超过 200 家公司在使用它。
小米初期也使用的 Zabbix 进行监控,但是机器量和业务量上来后,Zabbix 就有些力不从心了。因此,后来自主研发了 Open-Falcon,在架构设计上吸取了 Zabbix 的经验,同时很好地解决了 Zabbix 的诸多痛点。
架构看去比 Zabbix 复杂多了,其实它也是基于 Server—Agent 的模式,只不过 Server 又给他划分了好几个组件,这个耦合性和扩展性都得到了明显提高。
Falcon-agent
数据采集器和收集器,Go 开发,部署在被监控的机器上。就相当于 Agent,用于采集机器负载监控指标数据如:CPU、内存、磁盘、IO、网络、端口等等大概有 200 多个这些都可以自定是否收集。
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 缺点
监控类型较少
不支持常用应用服务器如 tomcat、apache、jetty 等的监控。
整体发展一般,社区活跃度低
没有专门的运维支持,代码更新较少,没有一个较大的社区来维护,后续想要有什么新的能力基本只能指望自己扩展。
我们知道 zabbix 在监控界占有不可撼动的地位,功能强大。但是对容器监控显得力不从心。为解决监控容器的问题,引入了 Prometheus 技术。
Prometheus 是一套开源的系统监控报警框架。是由前 google 员工 2015 年正式发布的开源监控系统,采用 Go 语言开发。它不仅有一个很酷的名字,同时它有 Google 与 k8s 的强力支持,开源社区异常火爆。
先来了解下 Prometheus 的架构设计:
Exporter
主要用来采集数据,并通过 HTTP 服务的形式暴露给 Prometheus Server,Prometheus Server 通过访问该 Exporter 提供的接口,即可获取到需要采集的监控数据。常见的 Exporter 有很多,例如 node_exporter、mysqld_exporter、redis_exporter 等
Prometheus Server
核心组件,负责实现对监控数据的获取,存储以及查询。Prometheus Server 也是一个时序数据库,它将监控数据保存在本地磁盘中,并对外提供自定义的 PromQL 语言实现对数据的查询和分析。
Push gateway
由于 Prometheus 数据采集采用 pull 方式进行设置的,内置必须保证 prometheus server 和对应的 exporter 必须通信,当网络情况无法直接满足时,可以使用 pushgateway 来进行中转,可以通过 pushgateway 将内部网络数据主动 push 到 gateway 里面去,而 prometheus 采用 pull 方式拉取 pushgateway 中数据。
Alert Manager
当支持基于 PromQL 创建告警规则,如果满足定义的规则,则会产生一条告警信息,进入 AlertManager 进行处理。可以集成邮件,微信或者通过 webhook 自定义报警。
Web UI
Prometheus 内置了一个简单的 web 控制台,可以查询配置信息和指标等,而实际应用中我们通常会将 Prometheus 作为 Grafana 的数据源,创建仪表盘以及查看指标。
Prometheus 优点
社区活跃度高
github start 超过 40k,且一直在维护。
基于时序数据库,存储效率高
Prometheus 核心部分只有一个单独的二进制文件,不存在任何的第三方依赖 (数据库,缓存等等)。唯一需要的就是 本地磁盘,因此不会有潜在级联故障的风险。
很好地支持容器监控
能自动发现容器,同时 k8s 和 etcd 等项目都提供了对 Prometheus 的原生支持,是目前容器监控最流行的方案。
基于 Pull 模型的架构
Prometheus 基于 Pull 模型的架构方式,可以在任何地方(本地电脑,开发环境,测试环境)搭建我们的监控系统。
Prometheus 缺点
Prometheus 是基于 Metric 的监控,不适用于日志(Logs)、事件 (Event)、调用链 (Tracing)。
由于 Prometheus 采用的是 Pull 模型拉取数据,意味着所有被监控的 endpoint 必须是可达的,需要合理规划网络的安全配置。
指标众多,需进行适当裁剪。
通过上面的介绍,大家对主流的监控系统应该有了一定的认识。面对选型问题,我的建议是: