目录
一、Prometheus概述
Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到的数据会持久化到存储设备当中。
每个被监控的主机都可以通过专用的 exporter 程序提供输出监控指标数据的接口,它会在目标处收集监控数据,并暴露出一个 HTTP 接口供 Prometheus server 查询, Prometheus 通过基于 HTTP 的 pull 的方式来周期性的采集数据,默认时间是 15s 抓取一次。
抓取到的指标数据会被以时间序列的形式保存在内存中,并且定时刷到磁盘上,默认是两个小时回刷一次。并且为了防止 Prometheus 发生崩溃或重启时能够恢复数据, Prometheus 也提供了类似 MySQL 中 binlog 一样的 wal 预写日志,当 Prometheus 崩溃重启时,会读这个预写日志来恢复数据。
如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到 Alertmanager 完成告警的汇总和分发。
对于短时间执行的脚本任务或者不好直接 pull 指标数据的服务,Prometheus 提供了 Pushgateway 给这些任务将服务指标数据主动 push 到 Pushgateway 并临时存储,然后等待 Prometheus server 完成数据的采集。
任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让 Prometheus 通过服务发现的机制进行动态管理。
Prometheus 能够直接把K8S的 API Server 作为服务发现系统使用,进而动态发现和监控K8S集群中的所有可被监控的对象。
1.TSDB时序数据库
TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景
●存储的数据量级十分庞大
●大部分时间都是写入操作
●写入操作几乎是顺序添加,大多数时候数据都以时间排序
●很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库
●删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
●基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用
●读操作是十分典型的升序或者降序的顺序读
●高并发的读操作十分常见
2.Prometheus 的特点
多维数据模型:由度量名称和键值对标识的时间序列数据
时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器指标数据、应用程序性能监控数据、网络数据等都是时序数据
内置时间序列(Time Series)数据库:Prometheus ;外置的远端存储通常会用:InfluxDB、OpenTSDB 等
promQL:一种灵活的查询语言,可以利用多维数据完成复杂查询
基于 HTTP 的 pull(拉取)方式采集时间序列数据;同时支持 PushGateway 组件收集数据
通过静态配置或服务发现发现目标
支持作为数据源接入 Grafana
3.Prometheus 的生态组件
Prometheus Server 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由 Prometheus Server 所负责。
Prometheus 生态圈中包含了多个组件,其中部分组件可选:
(1)Prometheus server:服务核心组件,采用 pull 方式采集监控数据,通过 http 协议传输;存储时间序列数据;基于“告警规则”生成告警通知。
Prometheus server 由三个部分组成:Retrieval,Storage,PromQL
- Retrieval:负责在活跃的 target 主机上抓取监控指标数据。
- Storage:存储,主要是把采集到的数据存储到磁盘中。默认为 15 天。
- PromQL:是 Prometheus 提供的查询语言模块。
4.Prometheus 的工作模式
●Prometheus Server 基于服务发现(Service Discovery)机制或静态配置获取要监视的目标(Target),并通过每个目标上的指标 exporter 来采集(Scrape)指标数据;
●Prometheus Server 内置了一个基于文件的时间序列存储来持久存储指标数据,用户可使用 PromQL 接口来检索数据,也能够按需将告警需求发往 Alertmanager 完成告警内容发送;
●一些短期运行的作业的生命周期过短,难以有效地将必要的指标数据供给到 Server 端,它们一般会采用推送(Push)方式输出指标数据, Prometheus 借助于 Pushgateway 接收这些推送的数据,进而由 Server 端进行抓取
5.Prometheus 的工作流程
(1)Prometheus 以 Prometheus Server 为核心,用于收集和存储时间序列数据。Prometheus Server 从监控目标中通过 pull 方式拉取指标数据,或通过 pushgateway 把采集的数据拉取到 Prometheus server 中。
(2)Prometheus server 把采集到的监控指标数据通过 TSDB 存储到本地 HDD/SSD 中。
(3)Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的告警通知发送到 Alertmanager。
(4)Alertmanager 通过配置报警接收方,发送报警到邮件、钉钉或者企业微信等。
(5)Prometheus 自带的 Web UI 界面提供 PromQL 查询语言,可查询监控数据。
(6)Grafana 可接入 Prometheus 数据源,把监控数据以图形化形式展示出。
6.Prometheus 的局限性
●Prometheus 是一款指标监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;
●Prometheus 认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;
若需要存储长期的历史数据,建议基于远端存储机制将数据保存于 InfluxDB 或 OpenTSDB 等系统中;
●Prometheus 的集群机制成熟度不高,可基于 Thanos 或 Cortex 实现 Prometheus 集群的高可用及联邦集群。
二、部署Prometheus
关闭防火墙
systemctl disable --now firewalld
setenforce 0
1.Prometheust Server 端安装和相关配置
上传 prometheus-2.35.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
tar xf prometheus-2.45.0.linux-amd64.tar.gz
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus
cd /usr/local/prometheus/
vim prometheus.yml
scrape_interval: 15s #采集目标主机监控数据的时间间隔,默认为1m
evaluation_interval: 15s #触发告警生成alert的时间间隔,默认是1m
# scrape_timeout is set to the global default (10s).
scrape_timeout: 10s #数据采集超时时间,默认10s
metrics_path: '/metrics' #指标数据采集路径,默认为 /metrics
配置系统启动文件
cd /usr/lib/systemd/system
vim prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention.time=15d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep 9090
浏览器访问验证
2.部署 Exporters监控本机
上传 node_exporter-1.3.1.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
cd /usr/local/node_exporter
mv node_exporter /usr/local/bin/
配置启动文件
cd /usr/lib/systemd/system
vim node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep node_exporter
关联prometheus监控9100端口
cd /usr/local/prometheus/
vim prometheus.yml
末尾添加
- job_name: "node_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.9.113:9100
labels:
service: node_exporter
curl -X POST http://192.168.9.113:9090/-/reload 重新载入配置
浏览器查看
3.如何监控其他主机
cd /usr/local/bin/
scp node_exporter 192.168.9.210:`pwd`
cd /usr/lib/systemd/system
scp node_exporter.service 192.168.9.210:`pwd`
将本地的配置文件和启动文件复制到需要监控的主机
需监控主机操作
systemctl start node_exporter.service
systemctl enable node_exporter.service
netstat -lntp | grep 9100
普罗米修斯服务器
cd /usr/local/prometheus/
vim prometheus.yml
static_configs:
- targets:
- 192.168.9.113:9100
- 192.168.9.210:9100 #添加需要监控的服务器
labels:
service: node_exporter
curl -X POST http://192.168.9.113:9090/-/reload重载
4.监控mysql数据库
mysql服务器
cd /opt
上传mysqld_exporter-0.14.0.linux-amd64.tar.gz
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
cd mysqld_exporter-0.14.0.linux-amd64/
mv mysqld_exporter /usr/local/bin/
mysqld_exporter --help
cd /usr/lib/systemd/system
vim mysqld_exporter.service
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
修改 MySQL 配置文件
vim /etc/my.cnf
host=localhost
user=exporter
password=abc123
授权 exporter 用户
mysql -u root -pabc123
create user 'exporter'@'localhost' identified by 'abc123';
grant process, replication client, select on *.* to 'exporter'@'localhost';
flush privileges;
quit
systemctl restart mysqld_exporter.service
systemctl enable mysqld_exporter.service
netstat -lntp | grep 9104
普罗米修斯服务器
cd /usr/local/prometheus
vim prometheus.yml
- job_name: "mysqld_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.9.111:9104
labels:
service: mysqld
末尾添加
systemctl reload prometheus.service
5.监控nginx服务器
上传nginx-1.12.0.tar.gz、nginx-module-vts-0.1.18.tar.gz、 nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
useradd -M -s /sbin/nologin nginx
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
tar xf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-module-vts
make -j2 && make install
修改 nginx 配置文件,启动 nginx
cd /usr/local/nginx/conf
81 server {
82 listen 8080;
83 vhost_traffic_status off;
84 allow 127.0.0.1;
85 allow 192.168.9.113;
86
87 location /nginx-status {
88 stub_status on;
89 access_log off;
90 }
91 location /vts-status {
92 vhost_traffic_status_display;
93 vhost_traffic_status_display_format html;
94 }
95 }
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t
cd /usr/lib/systemd/system
vim nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl start nginx.service
netstat -lntp | grep nginx
解压 nginx-exporter,启动 nginx-exporter
tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
cd nginx-vts-exporter-0.10.3.linux-amd64/
mv nginx-vts-exporter /usr/local/bin/
cd /usr/lib/systemd/system
vim nginx_vts_exporter.service
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/vts-status/format/json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start nginx_vts_exporter.service
systemctl enable nginx_vts_exporter.service
nginx_vts_exporter --help
netstat -lntp | grep 9913
普罗米修斯服务器
vim prometheus.yml
- job_name: "nginx_vts_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.9.111:9913
labels:
service: nginx
最后添加
三、部署 Grafana 进行展示
上传grafana-7.4.0-1.x86_64.rpm
rpm -ivh grafana-7.4.0-1.x86_64.rpm
systemctl start grafana-server.service
systemctl enable grafana-server.service
netstat -lntp | grep 3000
浏览器访问
如何查看其他nodeport节点数据
导入 grafana 监控面板
浏览器访问:https://grafana.com/grafana/dashboards ,在页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON