2024-03-13
Linux
00
请注意,本文编写于 34 天前,最后修改于 34 天前,其中某些信息可能已经过时。

目录

Prometheus+Grafana
一、Prometheus基本介绍
1.1、时间序列数据库的主要优点
1.2、Prometheus主要特征
1.3、Prometheus监控原理
1.4、Prometheus配置文件六个大配置段的含义
部署prometheus监控平台
2.1、部署prometheus服务监控端
2.1.1 下载安装
2.1.2 设置prometheus系统服务
2.1.3 启动服务和设置开机自动启动
2.1.4 查看服务状态
2.1.5 Web访问
2.2、监控一个远端业务机器
2.2.1 下载安装
2.2.2 设置node_exporter系统服务
2.2.3 启动服务和设置开机自动启动
2.2.4 查看服务状态
2.1.5 Web访问
2.1.6 在prometheus添加监控信息
2.3 监控一个服务
2.3.1 部署mysql业务
2.3.2 部署监控插件
2.3.3 设置mysqld_exporter系统服务
2.3.4 启动服务和设置开机自动启动
2.3.5 在prometheus添加监控信息
三、Grafana数据展示及告警
3.1、部署grafana
3.1.1 grafana安装
3.1.2 服务启动
3.1.3 Web登录
3.2 添加prometheus数据源
3.3 绘制图形

Prometheus+Grafana

Prometheus基本介绍及监控平台部署

一、Prometheus基本介绍

Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器,支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。

https://prometheus.io/docs/introduction/overview/

时间序列数据(TimeSeries Data) : 按照时间顺序记录系统、设备状态变化的数据被称为时序数据。这种时序数据,会应用到很多场景, 如:

  • 最常见的就是我们系统中的日志
  • 无人驾驶车辆运行中要记录的经度,纬度,速度,方向,旁边物体的距离等等。每时每刻都要将数据记录下来做分析。
  • 某一个地区的各车辆的行驶轨迹数据、车流量
  • 传统证券行业实时交易数据
  • 实时运维监控数据,网卡流量图,服务的当前状态,资源的使用情况,比如说,你所监控的内容出现了直线飙升、断崖式下跌、断线,一般都意味着出现了问题,不管是什么时候发生的,都要赶紧查一下出了什么问题

1.1、时间序列数据库的主要优点

时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。

  • 性能好

关系型数据库对于大规模数据的处理性能糟糕,这一点可以从I/O上有明显的体现。使用NOSQL可以比较好的处理大规模数据,但是依然比不上时间序列数据库。

  • 存储成本低

由于采用的是metrics

=value(标签:关键字=值)的数据存储方式,又使用了高效的压缩算法,平均消耗的存储成本在3.5个字节左右 ,所以比较节省存储空间 ,并且能有效降低IO

Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列数据,每隔30秒采集一次,保留60天,大概占用200多G的空间(来自官方文件数据)

1.2、Prometheus主要特征

1、多维度数据模型,可以通过多个维度对数据建模,也可以通过多个维度对数据进行查询

2、灵活的查询语言,提供灵活的PromQL查询方式,还提供了HTTP查询接口,可以很方便地结合Grafana等组件展示数据

3、不依赖分布式存储,支持单节点的本地存储。通过Prometheus自带的时序数据库,可以完成每秒百万及的数据存储,如果需要存储大量历史数据,还可以对接第三方的时序数据库

4、以HTTP方式,通过pull模型拉取时间序列数据,并提供了开放的指标数据标准

5、也可以通过中间网关支持push模型 这种推,拉监控其实就是主动和被动监控,默认情况下是以pull(拉)的方式,也就是监控主机去找被监控主机将数据要过来,如果要实现push(推)的方式需要中间网关的支持,这只是与zabbix的叫法不同而已

6、通过服务发现或者静态配置来发现目标服务对象

7、支持多种多样的图表和界面展示,可以使用第三方的工具来展示内容,如Grafana

1.3、Prometheus监控原理

1、Prometheus Server负责定时在目标上抓取metrics(指标)数据, 2、每个抓取目标[主机、服务]都需要暴露一个HTTP服务接口用于Prometheus定时抓取。也就是说prometheus会将获取到的监控数据打包成一个可访问的web页面,通过访问指定的url来确定主机的状态

Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。简单来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题。因为如果同一时间有很多被监控主机都把数据推送给监控主机的话,就很可能导致监控主机处理不过来,所以通过Pull方式,被采集端无需感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制。

1.4、Prometheus配置文件六个大配置段的含义

  • 下面这张图展示了Prometheus的架构和各个组件是如何交互和协作的

image5-1.png

  • prometheus配置文件各个大配置段

    • scrape_configs 采集配置段 做采集器
    • rule_files 告警、预聚合配置文件段
    • remote_read 远程查询段
    • remote_write 远程写入段
    • alerting: Alertmanager信息段
  • 优秀的开源项目大多是模块化的,能让使用者根据业务场景自行决定开启哪些配置 |配置段|用途| |:---:|:---:| |采集配置段|做采集器,数据保存在本地| |采集配置段 + 远程写入段|做采集器+传输器,数据保存在本地+远端存储| |远程查询段|做查询器,查询远端存储数据| |采集配置段 + 远程查询段|做采集器+查询器,查询本地数据+远端存储数据| |采集配置段 + Alertmanager信息段 + 告警配置文件段|做采集器+告警触发器,查询本地数据生成报警发往Alertmanager| |远程查询段 + Alertmanager信息段 + 告警配置文件段|做远程告警触发器,查询远端数据生成报警发往Alertmanager| |远程查询段+远程写入段 + 预聚合配置文件段|做预聚合指标,生成的结果集指标写入远端存储|

  • yaml具体配置格式

yaml
# 全局配置段 global: # 采集间隔 scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. # 计算报警和预聚合间隔 evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # 采集超时时间 scrape_timeout: 10s # 查询日志,包含各阶段耗时统计 query_log_file: /opt/logs/prometheus_query_log # 全局标签组 # 通过本实例采集的数据都会叠加下面的标签 external_labels: account: 'huawei-main' region: 'node1' # Alertmanager信息段 alerting: alertmanagers: - scheme: http static_configs: - targets: - "localhost:9090" # 告警、预聚合配置文件段 rule_files: - /etc/prometheus/rules/record.yml - /etc/prometheus/rules/alert.yml # 采集配置段 scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] # 远程查询段 remote_read: # prometheus - url: http://prometheus/v1/read read_recent: true # m3db - url: "http://m3coordinator-read:7201/api/v1/prom/remote/read" read_recent: true # 远程写入段 remote_write: - url: "http://m3coordinator-write:7201/api/v1/prom/remote/write" queue_config: capacity: 10000 max_samples_per_send: 60000 write_relabel_configs: - source_labels: [__name__] separator: ; # 标签key前缀匹配到的drop regex: '(kubelet_|apiserver_|container_fs_).*' replacement: $1 action: drop

部署prometheus监控平台

IP服务
192.168.10.101prometheus
192.168.10.102node_exporter
192.168.10.103mysqld_exporter
192.168.10.104grafana

下载安装包:

# prometheus 主程序包: wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz # 远端主机监控插件(类似于zabbix-agent): wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz # mysql业务监控插件: wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.0/mysqld_exporter-0.12.1.linux-amd64.tar.gz

2.1、部署prometheus服务监控端

2.1.1 下载安装

bash
# 下载prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz # 解压 tar xf prometheus-2.45.3.linux-amd64.tar.gz # 重命名并复制到/usr/local/ mv prometheus-2.45.3.linux-amd64 prometheus && cp -r prometheus /usr/local/

2.1.2 设置prometheus系统服务

执行命令创建服务文件

vi /usr/lib/systemd/system/prometheus.service [Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=root WorkingDirectory=/usr/local/prometheus ExecStart=/usr/local/prometheus/prometheus --config.file=prometheus.yml Restart=on-failure [Install] WantedBy=multi-user.target

2.1.3 启动服务和设置开机自动启动

systemctl daemon-reload systemctl enable prometheus.service systemctl start prometheus.service

2.1.4 查看服务状态

[root@localhost prometheus]# systemctl status prometheus.service ● prometheus.service - Prometheus Loaded: loaded (/usr/lib/systemd/system/prometheus.service; enabled; vendor preset: disabled) Active: active (running) since 三 2024-03-13 11:00:00 CST; 7s ago Docs: https://prometheus.io/ Main PID: 1325 (prometheus) CGroup: /system.slice/prometheus.service └─1325 /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.093Z caller=head.go:676 level=info component=tsdb msg="On-disk memory mappable chunks replay completed" duration=3.649µs 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.093Z caller=head.go:684 level=info component=tsdb msg="Replaying WAL, this may take a while" 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.138Z caller=head.go:755 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.138Z caller=head.go:792 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=14.…on=44.408287ms 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.140Z caller=main.go:1040 level=info fs_type=XFS_SUPER_MAGIC 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.141Z caller=main.go:1043 level=info msg="TSDB started" 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.141Z caller=main.go:1224 level=info msg="Loading configuration file" filename=/usr/local/prometheus/prometheus.yml 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.143Z caller=main.go:1261 level=info msg="Completed loading of configuration file" filename=/usr/local/prometheus/promet…µs 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.143Z caller=main.go:1004 level=info msg="Server is ready to receive web requests." 3月 13 11:00:01 localhost.localdomain prometheus[1325]: ts=2024-03-13T03:00:01.143Z caller=manager.go:995 level=info component="rule manager" msg="Starting rule manager..." Hint: Some lines were ellipsized, use -l to show in full.

2.1.5 Web访问

image5-2.png 看到这个页面说明prometheus启动成功了,默认监控了自己,我们来看一下本机的监控状态

image5-3.png

2.2、监控一个远端业务机器

2.2.1 下载安装

wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xf node_exporter-1.7.0.linux-amd64.tar.gz mv node_exporter-1.7.0.linux-amd64 node_exporter && cp -r node_exporter /usr/local/

2.2.2 设置node_exporter系统服务

执行命令创建服务文件

vi /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_exporter After=network.target [Service] Type=simple User=root ExecStart=/usr/local/node_exporter/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target

2.2.3 启动服务和设置开机自动启动

systemctl daemon-reload systemctl enable node_exporter systemctl start node_exporter

2.2.4 查看服务状态

[root@localhost node_exporter]# systemctl status node_exporter ● node_exporter.service - node_exporter Loaded: loaded (/usr/lib/systemd/system/node_exporter.service; enabled; vendor preset: disabled) Active: active (running) since 三 2024-03-13 11:19:51 CST; 6s ago Main PID: 1718 (node_exporter) CGroup: /system.slice/node_exporter.service └─1718 /usr/local/node_exporter/node_exporter 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=thermal_zone 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=time 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=timex 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=udp_queues 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=uname 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=vmstat 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=xfs 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.025Z caller=node_exporter.go:117 level=info collector=zfs 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.027Z caller=tls_config.go:274 level=info msg="Listening on" address=[::]:9100 3月 13 11:19:52 localhost.localdomain node_exporter[1718]: ts=2024-03-13T03:19:52.027Z caller=tls_config.go:277 level=info msg="TLS is disabled." http2=false address=[::]:9100

2.1.5 Web访问

image5-4.png

2.1.6 在prometheus添加监控信息

  1. 被监控主机设置完成之后,需要在prometeus主配置文件中添加被监控机信息
yaml
- job_name: "node_exporter" static_configs: - targets: ["192.168.10.102:9100"]

完整配置如下:

yaml
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: "node_exporter" static_configs: - targets: ["192.168.10.102:9100"]
  1. 重启服务
systemctl restart prometheus
  1. 测试验证 设置完查看prometheus页面 image5-5.png

2.3 监控一个服务

要监控mysql需要两个条件,一个是系统中有mysql,另一个是要有监控插件,现在监控插件已经下载好了,所以我们要先安装mysql,然后进行相应的授权,让插件可以获取到所需要的信息,然后再设置相关插件,修改prometheus配置文件

2.3.1 部署mysql业务

yum -y install mariadb-server mariadb systemctl enable mariadb systemctl start mariadb # 创建监控用户 [root@localhost ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> grant select,replication client,process on *.* to 'hello'@'localhost' identified by '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit; Bye

2.3.2 部署监控插件

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz tar xf mysqld_exporter-0.15.1.linux-amd64.tar.gz mv mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter && cp -r mysqld_exporter /usr/local/ # 配置MySQL账号密码 vim /usr/local/mysqld_exporter/.my.cnf cat /usr/local/mysqld_exporter/.my.cnf [client] user=hello password=123456

2.3.3 设置mysqld_exporter系统服务

执行命令创建服务文件

vi /usr/lib/systemd/system/mysqld_exporter.service [Unit] Description=mysqld_exporter After=network.target [Service] Type=simple User=root ExecStart=/usr/local/mysqld_exporter/mysqld_exporter Restart=on-failure [Install] WantedBy=multi-user.target

2.3.4 启动服务和设置开机自动启动

systemctl daemon-reload systemctl enable mysqld_exporter systemctl start mysqld_exporter

2.3.5 在prometheus添加监控信息

  1. 被监控主机设置完成之后,需要在prometeus主配置文件中添加被监控机信息
- job_name: 'mariadb' static_configs: - targets: ['192.168.10.103:9104']

完整配置如下:

# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: "node_exporter" static_configs: - targets: ["192.168.10.102:9100"] - job_name: 'mariadb' static_configs: - targets: ['192.168.10.103:9104']
  1. 重启服务
systemctl restart prometheus
  1. 测试验证 设置完查看prometheus页面

image5-6.png

三、Grafana数据展示及告警

prometheus这个监控软件的展示界面实在是有些难看,所以换一个展示方式:Grafana,Grafana是一个开源的度量分析和可视化工具(没有监控功能),可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。

3.1、部署grafana

3.1.1 grafana安装

软件包获得 官方网站: grafana:https://grafana.com/

软件包安装

yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-10.4.0-1.x86_64.rpm

3.1.2 服务启动

systemctl enable grafana-server systemctl start grafana-server

3.1.3 Web登录

在浏览器中输入http://IP或者域名:3000
账号:admin
密码:admin

image5-7.png

修改密码

image5-8.png

3.2 添加prometheus数据源

image5-9.png

image5-10.png

image5-11.gif

3.3 绘制图形

image5-12.png

image5-14.png

image5-13.png

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:XiaoWang0777

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本网站由 又拍云Logo 提供CDN加速/云存储服务 萌ICP备20240377号