技术架构(9)- 监控平台
监控属于运维的范畴,对于开发出身的我来说太难了,没搞过,只能整合点资料凑合着看。
随着应用系统数量越来越多,与之配套的硬件设备、基础软件都会增多。如何管理这些节点,以便及时发现有问题的环节?这个时候需要用到监控平台。
监控分类
日志类
记录业务办理中的信息,在发生问题时定位。比如鼎鼎大名的ELK,收集日志做分析。
调用链类
分布式系统一次调用可以涉及到多个服务,服务之间的调用关系形成服务调用链。通过调用链来追踪全链路行为,分析系统瓶颈和故障点。
度量类
记录以时间为维度的数据,通过聚合运算,计算出资源使用趋势。
监控分层
-
客户端监控,用户行为信息,业务返回码,客户端性能,运营商,版本,操作系统等。
-
业务层监控,核心业务的监控,例如:登录,注册,下单,支付等等。
-
应用层监控,相关的技术参数,例如:URL 请求次数,Service 请求数量,SQL 执行的结果,Cache 的利用率,QPS 等等。
-
系统层监控,物理主机,虚拟主机以及操作系统的参数。例如:CPU 利用率,内存利用率,磁盘空间情况。
-
网络层监控,网络情况参数。例如:网关流量情况,丢包率,错包率,连接数等等。
Zabbix
Zabbix 是一款网络监视、管理系统,基于 Server-Client 架构。可用于监视各种网络服务、服务器和网络机器的状态。使用各种 Database-end 如 MySQL, PostgreSQL, SQLite, Oracle 或 IBM DB2 储存资料。Server 端基于 C语言、Web 管理端 frontend 则是基于 PHP 所制作的。Zabbix 可以使用多种方式监视。可以只使用 Simple Check 不需要安装 Client 端,亦可基于 SMTP 或 HTTP。
在客户端如 UNIX、Windows 中安装 Zabbix Agent 之后,可监视 CPU Load、网络使用状况、硬盘容量等各种状态。而就算没有安装 Agent 在监视对象中,Zabbix 也可以经由 SNMP、TCP、ICMP、利用 IPMI、SSH、telnet 对目标进行监视。
- Zabbix Server: Zabbix server 是Agent程序报告系统可用性、系统完整性和统计数据的核心组件,是所有配置信息、统计信息和操作数据的核心存储器。
- Zabbix Database: 所有配置信息和Zabbix收集到的数据都被存储在数据库中。
- Zabbix Web: 为了从任何地方和任何平台都可以轻松的访问Zabbix,Zabbix提供基于Web的管理界面。该界面是Zabbix Server的一部分,通常(但不一定)跟Zabbix Server运行在同一台物理机器上。如果使用SQLite,Zabbix Web界面必须要跟Zabbix Server运行在同一台物理机器上。
- Zabbix Proxy: Zabbix proxy 可以替Zabbix Server收集性能和可用性数据。Proxy代理服务器是Zabbix软件可选择部署的一部分;当然,Proxy代理服务器可以帮助单台Zabbix Server分担负载压力。
- Zabbix Agent: Zabbix agents监控代理 部署在监控目标上,能够主动监控本地资源和应用程序,并将收集到的数据报告给Zabbix Server,Zabbix agents可以执行被动和主动两种检查方式。在被动模式中agent应答数据请求,Zabbix server(或者proxy)询问agent数据,如CPU 的负载情况,然后Zabbix agent回送结果。主动模式处理过程将相对复杂。 Agent必须首先从Zabbix sever索取监控项列表以进行独立处理,然后周期性地发送新的值给Server,两种模式不冲突。
- 数据流: 除了上述基础组件之外,了解Zabbix内部的数据流同样很重要。监控方面,为了创建一个监控项(item)用于采集数据,必须先创建一个主机(host)。告警方面,在监控项里创建触发器(trigger),通过触发器(trigger)来触发告警动作(action)。 因此,如果你想收到Server X CPU负载过高的告警,你必须: 1.为Server X创建一个host并关联一个用于对CPU进行监控的监控项(Item)。 2. 创建一个Trigger,设置成当CPU负载过高时会触发 3. Trigger被触发,发送告警邮件 虽然看起来有很多步骤,但是使用模板的话操作起来其实很简单,Zabbix这样的设计使得配置机制非常灵活易用。
zabbix_agentd:
客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。
zabbix_get:
Zabbix get 是一种命令行应用,它可以用于与Zabbix Agent进行通信,并从Agent那里获取所需的信息,该应用通常被用于Zabbix Agent故障排除。例如在Server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。
zabbix_sender:
Zabbix sender 是一种命令行应用,它可以将性能数据发送到Zabbix Server进行处理。 该应用通常用在长时间运行的用户脚本,用于定期发送可用性和性能数据。
zabbix_server:
Zabbix server是整个Zabbix软件的核心程序。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server
*当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。
zabbix_proxy:
zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。
zabbix_java_gateway:
zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似Agent,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。
Prometheus
Prometheus 是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。Promethus有以下特点:
- 支持多维数据模型:由度量名和键值对组成的时间序列数据
- 内置时间序列数据库TSDB
- 支持PromQL查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
- 支持HTTP的Pull方式采集时间序列数据
- 支持PushGateway采集瞬时任务的数据
- 支持服务发现和静态配置两种方式发现目标
- 支持接入Grafana