本章概述
- prometheus本地存储简介
- 远端存储--victoriametrics
前言
Prometheus 有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,假设上百万条时间序列,每30秒间隔采集一次,保留60天,大概只占用200多G空间(引用官方数据)。
注意:prometheus监控数据默认每15s采集一次,默认数据保留15天(15天之前的数据会滚动删除)
11.1 prometheus本地存储简介
默认情况下,prometheus将采集到的数据存储在本地的TSDB数据库中,路径默认为prometheus安装目录的data目录,数据写入过程为先把数据写入wal(预写日志)日志并放在内存2小时后将内存数据保存至一个新的block块,同时再把新采集的数据写入内存并在2小时后再保存至一个新的block块,以此类推。
注意:可以通过--storage.tsdb.path参数修改监控数据存储目录
结构如下所示:
11.1.1 block简介
每个block为一个data目录中以01开头的存储目录,如下:
任意查看01开头的存储目录,如下:
block数据结构如下所示:
注意:每个chunk默认512M,多于512M的数据会被拆分出来生成第二个chunk,少于512M的数据会被合并压缩到一块(默认将小的数据块压缩到大的数据块中)
11.1.2 block特性
block 会压缩、合并历史数据块,以及删除过期的块,随着压缩、合并,block 的数量会减少,在压缩过程中会发生三件事:定期执行压缩、合并小的 block 到大的 block、清理过期的块。
每个块有 4 部分组成:
[root@prometheus-server01 prometheus]#tree /apps/prometheus/data/01G7JS2BJQAKW24VJPQ4P6Z7J0
/apps/prometheus/data/01G7JS2BJQAKW24VJPQ4P6Z7J0
├── chunks
│ └── 000001 #数据目录,每个大小为 512MB,超过会被切分为多个,少于会被压缩到一块
├── index #索引文件,记录存储的数据的索引信息,通过文件内的几个表来查找时序数据
├── meta.json #block 元数据信息,包含了样本数、采集数据数据的起始时间、压缩历史
└── tombstones #逻辑数据,主要记载删除记录和标记要删除的内容,删除标记,可在查询块时排除样本。
11.1.3 本地存储配置参数
常用配置参数如下:
--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 #指定chunk大小,默认512MB
--storage.tsdb.retention.time= #数据保存时长,默认 15 天
--query.timeout=2m #最大查询超时时间(一般是指grafana查询prometheus数据)
--query.max-concurrency=20 #最大查询并发数(一般是指grafana查询prometheus数据)
--web.read-timeout=5m #最大空闲超时时间(一般是指grafana查询prometheus数据)
--web.max-connections=512 #最大并发连接数(是指通过prometheus web界面查询数据)
--web.enable-lifecycle #启用API动态加载配置功能
11.2 远端存储--victoriametrics
官网链接:https://victoriametrics.com/
github链接:https://github.com/VictoriaMetrics/VictoriaMetrics
victoriametrics可通过集群部署实现高可用,为了便于后续部署,环境准备如下:
使用172.31.7.191、172.31.7.192、172.31.7.193这三个节点用于部署victoriametrics集群
架构图:
11.2.1 部署单机版victoriametrics
11.2.1.1 通过二进制部署单机版victoriametrics
注意:单机版安装包和集群版安装包不一样
首先,进行单机版部署,将单机版victoriametrics部署在172.31.7.191节点上
步骤如下:
github下载地址:https://github.com/VictoriaMetrics/VictoriaMetrics/releases
在172.31.7.191节点上:
1、下载二进制安装包并解压
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.77.2/victoria-metrics-linux-amd64-v1.79.0.tar.gz
tar -xvf victoria-metrics-amd64-v1.77.2.tar.gz
2、将二进制文件移动到/usr/local/bin,便于在全局使用该命令
mv victoria-metrics-prod /usr/local/bin/
3、创建service文件
vim /etc/systemd/system/victoria-metrics-prod.service
[Unit]
Description=For Victoria-metrics-prod Service
After=network.target
[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod -httpListenAddr=0.0.0.0:8428 -storageDataPath=/data/victoria -retentionPeriod=3
[Install]
WantedBy=multi-user.target
常用参数说明
-httpListenAddr=0.0.0.0:8428 #监听地址及端口
-storageDataPath #VictoriaMetrics 将所有数据存储在此目录中,默认为执行启动 victoria 的当前目录下的 victoria-metrics-data 目录中。
-retentionPeriod #存储数据的保留,较旧的数据会自动删除,默认保留期为 1 个月,默认单位为 m(月),支持的单位有 h (hour), d (day), w (week), y (year)。
注意:victoriametrics的读路径和写路径不一样,需要分别配置。
4、启动服务并设置为开机自启动
systemctl daemon-reload && systemctl restart victoria-metrics-prod.service
systemctl enable victoria-metrics-prod.service
5、验证
查看8428端口是否被监听
查看web界面:172.31.7.201:8428
界面说明:
vmui:web界面
targets:类似prometheus的targets界面,可以查看监控节点
metrics:可以查看监控指标数据
11.2.1.2 修改prometheus配置
victoriametrics配置完成后,需要修改prometheus配置,将prometheus监控数据写入victoriametrics。
1、在172.31.7.201上修改prometheus配置(加入prometheus远端写入配置参数)
vim /apps/prometheus/prometheus.yml #这里只贴出修改部分内容
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).
remote_write:
- url: http://172.31.7.191:8428/api/v1/write #指定写入victoriametrics服务器的数据写入路径
官网配置参考链接:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
2、重启prometheus服务
systemctl restart Prometheus
11.2.1.3 验证victoriametrics数据
1、访问victoriametrics web页面
浏览器输入172.31.7.191:8428
2、点击vmui,查看web控制台,在搜索框查找想要获取的数据
这里输入node_load1查看node负载情况,可以查询到数据,说明数据已经写入到victoriametrics,而不是存储在prometheus本地
11.2.1.4 grafana配置
由于grafana是通过查询prometheus数据来获取监控数据,而此时监控数据并没有存储到本地,而是存储在远端存储victoriametrics上,因此grafana此时不能通过prometheus获取监控数据。
我们只需要在grafana控制台添加新的数据源,设置victoriametrics作为数据源即可。grafana数据源支持victoriametrics。
1、登录grafana控制台添加新的数据源
(1)导航栏-设置-Data source
2、选择添加新的数据源
3、选择Prometheus
4、进行数据源配置,配置完成后点击现房保存并检测,连通性测试完成后导入新模板
5、导入模板:1860
由于之前导入过该模板,因此需要修改模板名称和UID用以区分,数据源选择刚添加的victoriametrics数据源
6、导入完成后查看监控数据
11.2.1.5 通过docker-compose部署单机victoriametrics
1、部署docker-compose
通过以下脚本部署docker-compose,脚本如下:
2、从github clone代码到本地(如果本地没有git命令需要进行安装)
cd /root/
git clone https://github.com/VictoriaMetrics/VictoriaMetrics.git
3、通过docker-compose拉起victoriametrics
cd /root/VictoriaMetrics/deployment/docker/
docker-compose up -d
4、验证
浏览器访问<本机ip地址>:8428
11.2.2 部署集群版victoriametrics
11.2.2.1 组件介绍
vminsert
写入组件(写),vminsert 负责接收数据写入并根据对度量名称及其所有标签的一致 hash 结果将数据分散写入不同的后端 vmstorage 节点之间 vmstorage,vminsert 默认端口 8480。
vmstorage
存储原始数据并返回给定时间范围内给定标签过滤器的查询数据,默认端口 8482。
vmselect
查询组件(读),连接 vmstorage ,默认端口 8481。
其它可选组件:
vmagent
是一个很小但功能强大的代理,它可以从 node_exporter 各种来源收集度量数据,并将它们存储在 VictoriaMetrics 或任何其他支持远程写入协议的与 prometheus 兼容的存储系统中,有替代prometheus server 的意向。
vmalert
替换 prometheus server,以 VictoriaMetrics 为数据源,基于兼容 prometheus 的告警规则,判断数据是否异常,并将产生的通知发送给 alertermanager
Vmgateway
读写 VictoriaMetrics 数据的代理网关,可实现限速和访问控制等功能,目前为企业版组件
vmctl
VictoriaMetrics 的命令行工具,目前主要用于将 prometheus、opentsdb 等数据源的数据迁移到VictoriaMetrics。
架构图如下所示:
单个victoriametrics节点结构图:
(1)vmstorage负责数据的持久化,默认服务监听端口为8482(用于提供web界面),在配置时还需指定vminsert(默认为8400)和vmselect(默认为8401)访问vmstorage的端口,否则vmstorage将不允许vminsert和vmselect访问。这两个端口并不是vminsert和vmselect的服务端口,而是用于访问vmstorage
(2)vminsert负责接收外部的写请求,默认服务监听端口为8480,在配置时需要指定vminsert访问vmstorage的端口(默认为8400),该端口要和vmstorage 配置中指定的端口保持一致
(3)vmselect负责接收外部的读请求,默认服务监听端口为8481,在配置时需要指定vmselect访问vmstorage的端口(默认为8401),该端口要和vmstorage配置中指定的端口保持一致
(4)prometheus向victoriametrics写入数据,会访问vminsert,由vminsert将数据写入vmstorage;grafana查询victoriametrics监控数据,会访问vmselect,由vmselect查询数据返回给grafana
三个victoriametrics节点结构图:
需要注意的是,部署victoriametrics集群(这里为三节点一个集群)在配置vminsert和vmselect时,会将vmstorage的地址在vminsert和vmselect配置文件中进行指定,因此vminsert和vmselect可以访问三个victoriametrics node节点上的vmstorage,可以将数据保存在集群中任意一台节点上的vmstorage中,也可以读取集群中任意一台节点上的监控数据。
上图中由于线条太多,看起来不直观,仅画出指向本地vmstorage的线条,实际上vminsert和vmselect可以访问集群中任意一台节点上的 vmstorage。
另外,由于vminsert和vmselect都依赖于vmstorage(数据的读和写都需要访问存储),因此在部署集群时先部署vmstorage
11.2.2.2 部署集群
1、准备工作
注意:集群版本的安装包和单机版安装包不一样
另外,由于已经部署单机版的victoriametrics,这里需要停止单机版的victoriametrics服务以及prometheus服务
在172.31.7.191节点上
systemctl stop victoria-metrics-prod.service
systemctl disable victoria-metrics-prod.service
在172.31.7.201节点上
systemctl stop Prometheus
注意:分别在三个节点上(172.31.7.191、172.31.7.192、172.31.7.193)执行以下命令
2、下载集群版本的安装包并解压
cd /usr/local/src
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.79.0/victoria-metrics-linux-amd64-1.77.2-cluster.tar.gz
tar -xvf victoria-metrics-amd64-v1.77.2-cluster.tar.gz
3、将这三个解压出来的二进制程序移到/usr/loca/bin目录下,便于全局执行该命令
mv vminsert-prod vmselect-prod vmstorage-prod /usr/local/bin/
主要参数说明:
-httpListenAddr string
Address to listen for http connections (default ":8482")
-vminsertAddr string
TCP address to accept connections from vminsert services (default ":8400")
-vmselectAddr string
TCP address to accept connections from vmselect services (default ":8401")
11.2.2.2.1 部署vmstorage-prod组件
该组件负责数据的持久化,监听端口:API 8482,数据写入端口:8400,数据读取端口:8401。
注意:由于vminsert和vmselect都依赖于vmstorage(数据的读和写都需要访问存储),因此先部署vmstorage
在节点172.31.7.191上执行命令
1、编写service文件,通过service文件启动
vim /etc/systemd/system/vmstorage.service
[Unit]
Description=Vmstorage Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath /data/vmstorage-data -httpListenAddr :8482 -vminsertAddr :8400 -vmselectAddr :8401
[Install]
WantedBy=multi-user.target
注意:在service文件中需指定vminsert端口(默认为8400)和vmselect的端口(默认为8401),否则vmstorage将不允许vminsert和vmselect访问。这两个端口并不是vminsert和vmselect的服务端口,仅用于访问vmstorage
2、启动服务并设置为开机自启动
systemctl restart vmstorage.service && systemctl enable vmstorage.service
3、查看服务状态
systemctl status vmstorage.service
4、查看端口监听状态
5、将service文件复制到另外两个节点(172.31.7.192、172.31.7.193)上
scp /etc/systemd/system/vmstorage.service 172.31.7.192:/etc/systemd/system/vmstorage.service
scp /etc/systemd/system/vmstorage.service 172.31.7.193:/etc/systemd/system/vmstorage.service
6、在另外两个节点上启动服务并设置为开机自启动
172.31.7.192节点:
systemctl restart vmstorage.service && systemctl enable vmstorage.service
172.31.7.193节点:
systemctl restart vmstorage.service && systemctl enable vmstorage.service
11.2.2.2.2 部署vminsert-prod组件
该组件负责接收外部的写请求,默认端口 8480
在节点172.31.7.191上执行:
1、编写service文件,通过service文件启动服务
vim /etc/systemd/system/vminsert.service
[Unit]
Description=Vminsert Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vminsert-prod -httpListenAddr :8480 -storageNode=172.31.7.191:8400,172.31.7.192:8400,172.31.7.193:8400
[Install]
WantedBy=multi-user.target
注意:service文件中需要指定vminsert访问vmstorage的端口(这里为8400),该端口要和vmstorage service文件中指定的端口保持一致。另外,还指定了集群中三台vmstorage的地址和端口,便于vminsert访问集群中任意一个vmstorage。
2、启动服务并设置开机自启动
systemctl daemon-reload && systemctl restart vminsert && systemctl enable vminsert
3、查看端口监听状态
4、将service文件复制到另外两个节点(172.31.7.192、172.31.7.193)上
scp /etc/systemd/system/vminsert.service 172.31.7.192:/etc/systemd/system/vminsert.service
scp /etc/systemd/system/vminsert.service 172.31.7.193:/etc/systemd/system/vminsert.service
5、在另外两个节点上启动服务并设置为开机自启动
172.31.7.192节点:
systemctl restart vminsert.service && systemctl enable vminsert.service
172.31.7.193节点:
systemctl restart vminsert.service && systemctl enable vminsert.service
11.2.2.2.3 部署vmselect-prod组件
该组件负责接收外部的读请求,默认端口 8481
在节点172.31.7.191上执行:
1、编写service文件,通过service文件启动服务
vim /etc/systemd/system/vmselect.service
[Unit]
Description=Vmselect Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vmselect-prod -httpListenAddr :8481 -storageNode=172.31.7.191:8401,172.31.7.192:8401,172.31.7.193:8401
[Install]
WantedBy=multi-user.target
注意:service文件中需要指定vmselect访问vmstorage的端口(这里为8401),该端口要和vmstorage service文件中指定的端口保持一致。另外,还指定了集群中三台vmstorage的地址和端口,便于vmselect访问集群中任意一个vmstorage。
2、启动服务并设置开机自启动
systemctl daemon-reload && systemctl restart vmselect && systemctl enable vmselect
3、查看端口监听状态
4、将service文件复制到另外两个节点(172.31.7.192、172.31.7.193)上
scp /etc/systemd/system/vmselect.service 172.31.7.192:/etc/systemd/system/vmselect.service
scp /etc/systemd/system/vmselect.service 172.31.7.193:/etc/systemd/system/vmselect.service
5、在另外两个节点上启动服务并设置为开机自启动
172.31.7.192节点:
systemctl restart vmselect.service && systemctl enable vmselect.service
172.31.7.193节点:
systemctl restart vmselect.service && systemctl enable vmselect.service
11.2.2.2.4 服务端口验证
1、172.31.7.191节点上执行:
curl http://172.31.7.191:8480/metrics
curl http://172.31.7.191:8481/metrics
curl http://172.31.7.191:8482/metrics
2、172.31.7.192节点上执行:
curl http://172.31.7.192:8480/metrics
curl http://172.31.7.192:8481/metrics
curl http://172.31.7.192:8482/metrics
3、172.31.7.194节点上执行:
curl http://172.31.7.193:8480/metrics
curl http://172.31.7.193:8481/metrics
curl http://172.31.7.193:8482/metrics
11.2.2.3 prometheus配置远程写入
1、在节点172.31.7.201上修改prometheus配置
vim /apps/prometheus/prometheus.yml #这里只贴出修改部分内容
# 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).
#remote_write: #将之前单机部署的配置注释
# - url: http://172.31.7.191:8428/api/v1/write
remote_write:
- url: http://172.31.7.191:8480/insert/0/prometheus
- url: http://172.31.7.192:8480/insert/0/prometheus
- url: http://172.31.7.193:8480/insert/0/Prometheus
注意:prometheus配置中写入victoriametrics的url路径可以自定义,但url中的insert后一级的目录只能指定为数字,不能指定为字母
2、重启prometheus服务
systemctl restart Prometheus
11.2.2.4 grafana配置
1、grafana配置数据源,然后保存并测试
注意:配置数据源url时,路径要和prometheus配置文件中url的路径保持一致,prometheus是向victoriametrics写入数据,因此url为:http://172.31.7.191:8480/insert/0/prometheus(注意端口号是8480)。而grafana是从victoriametrics中查询数据,因此只需将url路径中的insert改为select即可。更改后的url为:http://172.31.7.191:8481/select/0/prometheus(注意端口号是8481)
另外,由于grafana配置数据源时只能指定victoriametrics集群三个节点中其中一个节点,这样容易形成单点,我们可以在三个节点前端配置一个负载均衡,将grafana数据源中的地址指向负载均衡服务器的地址,确保victoriametrics高可用
2、导入模板
3、验证数据
11.2.3 开启数据复制
官网链接:https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety
默认情况下,数据被vminsert的组件基于hash算法分别将数据持久化到不同的vmstorage节点,整个集群只保存一份完成的数据,一旦某个节点故障会导致监控数据丢失。可以启用 vminsert组件支持的-replicationFactor=N复制功能,将数据分别在集群内各节点保存一份完整的副本以实现数据的高可用。
文章评论