1. 监控简介
1.1 监控的价值
(1)长期趋势分析
通过对监控样本数据的持续收集和统计,对监控指标进行长期趋势分析。
例如,通过对磁盘空间增长率的判断,我们可以提前预测在未来什么时间节点上需要对资源进行扩容。
(2)对照分析
两个版本的系统运行资源使用情况的差异如何?在不同容量情况下系统的并发和负载变化如何?通过监控能够方便的对系统进行跟踪和比较。
(3)告警
当系统出现或者即将出现故障时,监控系统需要迅速反应并通知管理员,从而能够对问题进行快速的处理或者提前预防问题的发生,避免出现对业务的影响。
(4)故障分析与定位
当问题发生后,需要对问题进行调查和处理。
通过对不同监控监控以及历史数据的分析,能够找到并解决根源问题。
(5)数据可视化
通过可视化仪表盘能够直接获取系统的运行状态、资源使用情况、以及服务运行状态等直观的信息。
1.2 监控的类型
通过业务监控系统,全面掌握业务环境的运行状态,通过黑盒监控能够第一时间发现业务故障并通过告警通告运维人员进行紧急恢复,通过白盒监控能够提前预知业务瓶颈,从而将业务影响降到最低。
1.2.1 黑盒监控
黑盒监控,关注的是实时的状态,一般都是正在发生的事件,比如nginx web界面打开的是界面报错503、API接口超时、磁盘IO异常等。
即黑盒监控重点在于能对当前正在发生的故障进行发现及发送通知告警。
1.2.2 白盒监控
白盒监控,关注的是现象,也就是系统内部暴露的一些指标数据,比如nginx 后端服务器的响应时长、磁盘的I/O负载值等。
1.2.3 总结
监控系统需要能够有效的支持白盒监控和黑盒监控,通过白盒能够了解其内部的实际运行状态,以及对监控指标的观察能够预判可能出现的潜在问题,从而对潜在的不确定因素进行提前优化并避免问题的发生。
而通过黑盒监控,比如常见的如HTTP探针、TCP探针等,可以在系统或者服务在发生故障时能够快速通知相关的人员进行处理。
1.3 常见的监控工具
(1)Cacti
基于基于LAMP平台展现的网络流量监测及分析工具,https://www.cacti.net。
现在估计还有一些IDC机房在用,它特别适合监控网络设备,通过snmp协议监控网络设备的流量,虽然功能没有Prometheus多,但是非常稳定。
(2)Nagios
用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,https://www.nagios.org。
可以搭配Cacti使用,Nagios专门监控系统和业务服务,Cacti专门监控网络设备。
(3)Open-falcon
小米公司开源出来的监控软件open-falcon(猎鹰),监控能力和性能较强,https://www.open-falcon.org。
但是小米已经好久没更新过了。
(4)Nightingale
夜莺,由滴滴基于open-falcon二次开发后开源出来的分布式监控系,https://n9e.github.io。
该监控还在持续更新中。
(5)Zabbix
老牌的开源监控软件,可横向扩展、自定义监控项、支持多种监控方式、可监控网络与各种服务等,https://www.zabbix.com/cn。
zabbix在自定义监控这块特别方便,就是之前的版本都不支持容器监控,不过后续的新版本已经支持了。
(6)prometheus
CNCF毕业的云原生监控系统,对k8s的容器有良好的兼容性,https://prometheus.io。
CNCF的亲儿子,专门监控容器的。
就zabbix和Prometheus来说,如果没有容器环境,监控工具还是zabbix好使,如果有容器,那就上Prometheus。
2. Prometheus介绍
2.1 Prometheus简介
Prometheus是基于go语言开发的一套开源的监控系统,集合了数据采集、数据存储、监控告警等功能。
由SoundCloud公司开发(2012年)的开源监控系统,Prometheus于2016年加入CNCF(Cloud Native Computing Foundation,云原生计算基金会),2018年8月9日prometheus成为CNCF继kubernetes 之后毕业的第二个项目,prometheus在容器和微服务领域中得到了广泛的应用。
2.2 Prometheus的特点
(1)使用key-value的多维度(多个角度,多个层面,多个方面)格式保存数据。
Prometheus的数据存储是用key:value格式保存的,key的名称不能重复。
存储的时候会用标签来区分,如cpu_load1(lable1=value1,lable2=value2) 0.1,这个标签的作用就是用来筛选数据的,后期可以通过过滤key来进行标签的匹配。
标签可以没有、可以单个或多个。
这样使用的好处就是查询快,尤其批量查询一段时间的数据时,是批量顺序读的,查询非常快。
(2)数据库不使用MySQL这样的传统数据库,而是使用时序数据库,目前是使用的TSDB。
当查询某一个时间范围的数据时,速度非常快,因为存储的时候按照时间存储,所以数据都是连续的。
(3)支持第三方dashboard实现更绚丽的图形界面,如grafana(Grafana 2.5.0版本及以上)
(4)组件模块化
server端是server端,agent端是agent端。
(5)支持服务自动化发现(基于consul等方式动态发现被监控的目标服务)。
(6)强大的数据查询语句功(PromQL,Prometheus Query Language),查出来的数据还能直接进行数据运算。
(7)易于横向伸缩。
环境比较大的时候,可以扩容server节点,支持集群联邦,通过集群联邦去收集数据,然后再汇总到核心的server端。
(8)众多官方和第三方的exporter(“数据”导出器)实现不同的指标数据收集。
官方支持的export:https://www.prometheus.io/docs/instrumenting/exporters/#exporters-and-integrations
带(official)字样的是官方的,不带的基本就是第三方的。
2.3 Prometheus架构介绍
(1)prometheus server端
主服务,接受外部http请求、收集指标数据、存储指标数据与查询指标数据等,并且还提供一个API供第三方调用查询数据。主要包含以下三个关键组件:
- Retrieval(数据获取)
Retrieval组件负责从各种数据源(例如应用程序、服务、操作系统、容器等)中获取指标数据。它可以周期性地或基于配置的规则从目标系统中拉取指标数据,并将其存储在Prometheus服务器中。Retrieval使用各种协议,如HTTP、HTTPS、SNMP等,与目标系统进行通信,并采集指标数据。它是Prometheus的核心数据获取引擎。- TSDB(时间序列数据库)
TSDB是Prometheus的核心组件,它负责存储和管理所有采集到的时间序列数据。它将数据存储在本地磁盘上,并提供高效的读写操作。TSDB使用一种称为"chunk"的数据结构来组织和压缩时间序列数据,以提高性能和减少存储空间占用。TSDB还负责执行查询操作,以响应Prometheus查询语言(PromQL)的请求,并返回请求的时间序列数据。- HTTP Server(HTTP服务器)
HTTP Server组件是Prometheus服务器的接口,它提供了HTTP接口,用于接收来自Prometheus客户端(例如Exporter)的指标数据,并处理来自查询端点的查询请求。通过HTTP接口,Prometheus客户端可以将采集到的指标数据发送到Prometheus服务器。同时,用户可以使用HTTP接口发送PromQL查询请求,并获取查询结果。HTTP Server还提供了用于配置和管理Prometheus服务器的Web界面。
(2)Prometheus tagets
Prometheus的数据采集,依赖各种各样的exports,比如mysql有mysql专用的export,redis有redis专用的export。
数据采集到了后,会提供一个http接口让Prometheus server端的Retrieval组件定期来拉取数据。
但是这里涉及到一个问题,就是一旦export节点太多,Prometheus server的压力就会变大,所以要视情况部署Prometheus联邦。
(3)Pushgateway
Pushgateway是Prometheus生态系统中的一个组件,它允许短期任务(Short-lived jobs)(如批处理任务自定义脚本啥的、定时任务等)将其指标数据推送到Pushgateway上,再由Prometheus主动拉取数据进行监控。
- 批处理任务
当任务是批处理的,耗时较短,并且在任务完成后不再生成指标时,可以使用Pushgateway将任务的指标推送到Prometheus。- 定时任务
如果任务是定时执行的,但执行时间不可预测,并且在任务执行之间没有持续的指标生成,可以使用Pushgateway将每次任务执行的指标推送到Prometheus。- 临时作业
对于临时性的作业或脚本,可以使用Pushgateway将它们的指标数据推送到Prometheus进行监控,而无需在Prometheus配置文件中静态定义这些目标。
在标准的Prometheus工作模式中,Prometheus主动拉取目标上的指标数据。然而,有些任务是短暂的或不可预测的,它们的生命周期不适合被Prometheus直接拉取。这就是Pushgateway的用途。
Pushgateway自身提供了一个HTTP API,来让客户端推送数据到它本身。
注意:pushgateway只适合处理批处理任务或者一些短期的、临时的任务。
(4)Prometheus Alerting(Prometheus告警)
Prometheus Alerting是Prometheus监控系统的一个重要功能,主要使用核心组件alertmanager来处理和路由监控系统产生的警报通知。
Prometheus server根据自身配置的一些规则,来对比获取的指标数据,凡是达到规则阈值的,都会主动推送到alertmanager,然后alertmanager根据配置进行告警通知(微信、钉钉、飞书、邮件等)。
(5)Service discovery(服务发现)
在 Prometheus 中,可以使用 Kubernetes 和 file_sd(文件服务发现)这两种机制进行服务发现。
- Kubernetes 服务发现
Prometheus 可以通过查询 Kubernetes API 获取有关服务和它们的端点的信息。
Prometheus和k8s集成的优点是:可以自动发现和监控运行在集群中的应用程序,并且随着应用程序的启动、停止或扩缩容,Kubernetes 可以自动更新服务和端点信息,并通知 Prometheus 进行相应的调整。
- 件服务发现(file_sd)
file_sd 是 Prometheus 中的一种服务发现机制,通过从文件中读取目标的配置信息进行服务发现。
可以手动编写或生成包含目标配置信息的文件,并将其配置为 Prometheus 的 file_sd_configs。Prometheus 将定期读取指定的文件,并将其中定义的目标加入监控目标列表中。
文件服务发现的优点就是灵活和独立,灵活性:可以根据需要手动编写或生成目标配置文件,以适应特定的环境和需求。
独立性:file_sd 不依赖于特定的服务发现系统或组件,是 Prometheus 自带的一种服务发现机制。
(6)data visualization and export
数据可视化与数据导出(浏览器或其它client)。
2.4 为什么容器监控不用zabbix
容器监控的实现方对比虚拟机或者物理机来说比大的区别,比如容器在k8s环境中可以任意横向扩容与缩容,那么就需要监控服务能够自动对新创建的容器进行监控,当容器删除后又能够及时的从监控服务中删除.
而传统的zabbix的监控方式需要在每一个容器中安装启动agent,并且在容器自动发现注册及模板关联方面并没有比较好的实现方式。
3. Prometheus数据采集流程和数据存储
3.1 Prometheus数据采集流程
(1)首先我们基于静态配置文件或动态发现获取监控目标,然后向目标URL发起http/https请求。
(2)目标接受并验证请求合法后,返回指标数据给Prometheus。
(3)prometheus server接收数据并对比告警规则,如果触发告警则进一步执行告警动作并存储数据,不触发告警则只进行数据存储。
(4)存储完毕后,就可以在grafana这种UI上看到相关数据。
3.2 TSDB简介及特点
3.2.1 TSDB简介
Time Series Database , 简称 TSDB,存放时间序列数据的数据库。
时间序列数据具有不变性、唯一性和按照时间排序的特性。
Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概200多G空间(引用官方资料)。
3.2.2 TSDB特点
(1)持续周期性写入数据、高并发吞吐
每间隔一段时间,就会写入成千上万的节点的指标数据。
(2)写多读少
prometheus每间隔15s就会采集数十万或更多指标数据,但通常只查看最近比较重要的指标数据。
(3)数据按照时间排列
每次收集的指标数据,写入时都是按照当前时间往后进行写入,不会覆盖历史数据。
(4)数据量大
历史数据会有数百G甚至数百T或更多。
(5)时效性
只保留最近一段时间的数据,超出时效的数据会被删除。
(6)冷热数据分明
通常只查看最近的热数据,以往的冷数据很少查看。
3.3 Prometheus数据写入流程
默认情况下,prometheus将采集到的数据存储在本地的TSDB数据库中,路径默认为prometheus安装目录的data目录,数据写入过程为先把数据写入wal日志(预写式日志)并放在内存的chunks中,然后2小时后将内存数据保存至一个新的block块,同时再把新采集的数据写入内存并在2小时后再保存至一个新的block块,以此类推。
相当于默认配置下,每个两小时持久化一次内存中的数据到磁盘中,如果Prometheus不小心宕机,那最长就会丢失2小时的数据。
chunk是prometheus存储数据的最基本单元。
每间隔两个小时,将当前内存的多个chunk统一保存至一个block中并进行数据合并、压缩、并生成元数据文件index、meta.json和tombstones。
3.3.1 TSDB-block特性
block会压缩、合并历史数据块,以及删除过期的块,随着压缩、合并,block的数量会减少,在压缩过程中会发生三事:定期执行压缩、合并小的block到大的block、清理过期的块,每个块有4部分组成,如下图:
每个block为一个data目录中以01开头的存储目录,如下图:
4. 部署Prometheus和export完成目标监控
4.1 二进制部署Prometheus
4.1.1 部署方式
(1)yum或apt安装
这种安装方式比较便捷,但是版本可能就比较旧。
(2)基于官方提供的二进制文件安装。本次也是使用二进制。
这种方式可以自定义安装最新版本。
(3)基于docker或通过docker-compose编排
https://prometheus.io/docs/prometheus/latest/installation
(4)基于operator部署在kubernetes环境部署
https://github.com/prometheus-operator/kube-prometheus
4.1.2 下载软件包
https://prometheus.io/download/
[root@prometheus-server ~]# mkdir /apps
[root@prometheus-server ~]# cd /apps
[root@prometheus-server apps]# wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz
[root@prometheus-server apps]# ll -h
总用量 93M
-rw-r--r-- 1 root root 93M 2月 21 18:39 prometheus-2.49.1.linux-amd64.tar.gz
4.1.3 配置Prometheus
4.1.3.1 解压并创建软连接
[root@prometheus-server apps]# tar xf prometheus-2.49.1.linux-amd64.tar.gz
[root@prometheus-server apps]# ln -s ./prometheus-2.49.1.linux-amd64 ./prometheus
[root@prometheus-server apps]# ll
总用量 94904
lrwxrwxrwx 1 root root 31 2月 21 18:40 prometheus -> ./prometheus-2.49.1.linux-amd64
drwxr-xr-x 4 1001 127 132 1月 16 01:35 prometheus-2.49.1.linux-amd64
-rw-r--r-- 1 root root 97181258 2月 21 18:39 prometheus-2.49.1.linux-amd64.tar.gz
[root@prometheus-server apps]# cd prometheus
[root@prometheus-server prometheus]# ll
总用量 240988
drwxr-xr-x 2 1001 127 38 1月 16 01:32 console_libraries
drwxr-xr-x 2 1001 127 173 1月 16 01:32 consoles
drwxr-xr-x 4 root root 70 2月 21 18:43 data
-rw-r--r-- 1 1001 127 11357 1月 16 01:32 LICENSE
-rw-r--r-- 1 1001 127 3773 1月 16 01:32 NOTICE
-rwxr-xr-x 1 1001 127 126534746 1月 16 01:00 prometheus
-rw-r--r-- 1 1001 127 934 1月 16 01:32 prometheus.yml # prometheus配置文件
-rwxr-xr-x 1 1001 127 120211598 1月 16 01:00 promtool # 测试工具,用于检测配置prometheus配置文件、检测metrics数据等
4.1.3.2 创建service启动管理文件
[root@prometheus-server apps]# cat /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle
[Install]
WantedBy=multi-user.target
[root@prometheus-server apps]# systemctl daemon-reload
[root@prometheus-server apps]# systemctl start prometheus.service
[root@prometheus-server apps]# systemctl enable prometheus.service
Created symlink from /etc/systemd/system/multi-user.target.wants/prometheus.service to /etc/systemd/system/prometheus.service.
[root@prometheus-server apps]# netstat -lntup|grep prometheus
tcp6 0 0 :::9090 :::* LISTEN 1804/prometheus
4.1.3.3 访问测试
4.1.4 prometheus启动可选参数
直接在启动时添加,可以加到.service文件中
–config.file=“prometheus.yml” # 指定配置文
–web.listen-address=“0.0.0.0:9090” # 指定监听地址
–storage.tsdb.path=“data/” # 指定数存储目录
–storage.tsdb.retention.size=B, KB, MB, GB, TB, PB, EB # 指定block大小,默认512MB
–storage.tsdb.retention.time= # 数据保存时长,默认15天
–query.timeout=2m # 最大查询超时时间
-query.max-concurrency=20 # 最大查询并发数
–web.read-timeout=5m # 最大空闲超时时间
–web.max-connections=512 # 最大并发连接数
–web.enable-lifecycle # 启用API动态加载配置功能
4.2 部署node_exporter监控物理机
这里新开一台node节点
4.2.1 部署方式
(1)docker或docker-compose部署
(2)二进制
(3)kubernetes中使用daemonset
4.2.2 二进制部署node_exporter
4.2.2.1 下载软件包
[root@node01 ~]# mkdir /apps
[root@node01 ~]# cd /apps
[root@node01 apps]# wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
[root@node01 apps]# ll -h
总用量 10M
-rw-r--r-- 1 root root 10M 2月 21 19:35 node_exporter-1.7.0.linux-amd64.tar.gz
4.2.3 配置export
4.2.3.1 解压并创建软连接
[root@node01 apps]# tar xf node_exporter-1.7.0.linux-amd64.tar.gz
[root@node01 apps]# ln -s node_exporter-1.7.0.linux-amd64 node_exporter
[root@node01 apps]# cd node_exporter
[root@node01 node_exporter]# ll
总用量 19476
-rw-r--r-- 1 1001 1002 11357 11月 13 08:02 LICENSE
-rwxr-xr-x 1 1001 1002 19925095 11月 13 07:54 node_exporter
-rw-r--r-- 1 1001 1002 463 11月 13 08:02 NOTICE
4.2.3.2 创建service启动管理文件
[root@node01 node_exporter]# cat /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
[root@node01 node_exporter]# systemctl daemon-reload
[root@node01 node_exporter]# systemctl start node-exporter.service
[root@node01 node_exporter]# systemctl enable node-exporter.service
[root@node01 node_exporter]# netstat -lntup |grep export
tcp6 0 0 :::9100 :::* LISTEN 11348/node_exporter
4.2.4 访问测试
4.3 配置Prometheus抓取node_exporter指标数据
4.3.1 调整Prometheus配置文件
[root@prometheus-server prometheus]# cat prometheus.yml
global: # 全局配置
scrape_interval: 15s # 数据抓取时间,每隔15s抓取一次
evaluation_interval: 15s # 规则刷新时间,每隔15s一次,默认1分钟
alerting: # 告警配置
alertmanagers:
- static_configs:
- targets:
rule_files: # 告警规则配置
scrape_configs: # 数据抓取配置
- job_name: "prometheus"
static_configs: # 静态配置
- targets: ["localhost:9090"] # 如果目标就在Prometheus本机,那么不用再末尾添加/metrics
- job_name: "prometheus-node" # 添加的监控目标
static_configs:
- targets: ["10.31.200.101:9100"]
[root@prometheus-server prometheus]# systemctl restart prometheus.service
4.3.2 查看web页面
4.3.3 数据查询测试
4.4 node节点常见指标
(1)node_boot_time:系统自启动以后的总计时间
(2)node_cpu:系统CPU使用量
(3)node_disk*:磁盘IO
(4)node_filesystem*:系统文件系统用量
(5)node_load1:系统每分钟CPU负载
(6)node_memory*:内存使用量
(7)node_network*:网络带宽指标
(8)node_time:当前系统时间
(9)go_:node exporter中go相关指标
(10)process_:node exporter自身进程相关运行指标
5. Grafana部署及使用
Grafana官网:https://grafana.com/
Grafana模版下载地址:https://grafana.com/grafana/dashboards/
5.1 Grafana简介
grafana是一个可视化组件,用于接收客户端浏览器的请求并连接到prometheus查询数据,最后经过渲染并在浏览器进行体系化显示,需要注意的是,grafana查询数据类似于zabbix一样需要自定义模板,模板可以手动制作也可以导入已有模板。
5.2 下载并安装Grafana
5.2.1 下载
5.2.2 安装并启动
# 官方提供的yum安装,国内也能直接访问
[root@prometheus-server ~]# yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.13-1.x86_64.rpm
[root@prometheus-server ~]# systemctl enable grafana-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
[root@prometheus-server ~]# systemctl start grafana-server.service
[root@prometheus-server ~]# netstat -lntup |grep grafana
tcp6 0 0 :::3000 :::* LISTEN 1674/grafana
5.2.3 访问测试
5.3 配置Prometheus数据源
一个grafana可以配置多个不同的数据源
5.4 导入模板
5.4.1 搜索模板
5.4.2 导入模板的方式
有3种可以选方式导入模板:
(1)直接上传我们在官网下载的json文件,推荐使用该方式。
(2)通过模板ID导入,依赖网络。
(3)把json文件中的内容,全部粘贴到grafana上的选择框中。不推荐该方式,容易出错。
5.4.3 通过离线文件导入模板
因为通过ID的话,依赖网络,不一定能上传成功
但是注意,导入的模板数据不一定准确,需要自己调整