prometheus数据存储
prometheus数据存储:
本地存储:
默认使用本地tsdb存数据,每个采样数据仅占:3.5b左右
百万条时间序列,30s的间隔,保留60天,占用200多G空间
tsdb路径: /data/
数据写入过程中,先把数据写入到wal日志(用于数据恢复),并放在内存,2小时后将内存数据存到新的block块(磁盘目录),同时把新采集的数据写入内存,2小时后再存到新block,依次循环
block特性:
自动压缩、合并历史数据块,并删除过期块
压缩过程中做定期执行压缩、合并小的block到大的block、清理过期的块
block目录的文件:
- chunks文件 数据目录,每个大小为512M,超过就被切分
- index 索引文件,记录存储的数据索引信息,通过文件内的几个表查找时序数据
- meta.json
- tombstone
远程存储:
远程写:
用户可以在Prometheus配置文件中指定Remote Write(远程写)的URL地址,一旦设置了该配置项,Prometheus将采集到的样本数据通过HTTP的形式发送给适配器(Adaptor)。而用户则可以在适配器中对接外部任意的服务。外部服务可以是真正的存储系统,公有云的存储服务,也可以是消息队列等任意形式
远程读:
Remote Read(远程读)也通过了一个适配器实现
在远程读的流程当中,当用户发起查询请求后,Promthues将向remote_read中配置的URL发起查询请求(matchers,ranges),Adaptor根据请求条件从第三方存储服务中获取响应的数据。同时将数据转换为Promthues的原始样本数据返回给Prometheus Server
当获取到样本数据后,Promthues在本地使用PromQL对样本数据进行二次处理。
注意:启用远程读设置后,只在数据查询时有效,对于规则文件的处理,以及Metadata API的处理都只基于Prometheus本地存储完成
VictoriaMetrics:
VictoriaMetrics分为单节点和集群两个方案。两种方案都提供了二进制文件、docker、helm以及operator等部署方式。对于数据采集点对于100w/s的场景,官方推荐使用单节点版,单节点版相当于一个all-in-one的包,包含了大部分的功能,但不支持告警
官方文档:https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html
参考文章:https://zhuanlan.zhihu.com/p/368912946
grafana图形(官方制作):https://grafana.com/orgs/victoriametrics/dashboards
端口: 8428
目录文件:
data数据目录
使用table来表示的数据或者索引的根目录,而实际上VictoriaMetrics中没有实际的表table级别目录
partition目录包括
- part目录
- 临时目录tmp
- 事务目录txn
- 快照
small和big:
在VictoriaMetrics中,small目录和big目录都会周期性检查,是否需要做part的合并
默认每个10ms检查一次partition目录下的part是否需要做合并。如果检查出有满足merge条件的parts,则这些parts合并为一个part。如果没有满足条件的part进行merge,无则不做操作
在写数据时,先写入在small目录下的相应partition目录下面的,small目录下的每个partition最多256个part
VictoriaMetrics在数据压缩时,默认一次最多合并15个part,且small目录下的part最多包含1000W行数据,即1000W个数据点。因此,当一次待合并的parts中包含的行数超过1000W行时,其合并的输出路径为big目录下的同名partition目录下
lock.lock文件
文件为文件锁文件,用于VictoriaMetrics进程锁住文件,不允许别的进程进行修改目录或文件
indexdb目录:
indexdb目录下有多个table目录,每个table目录代表一个完整的自治的索引
每个table目录下,又有多个不同的part目录,part命名方式比较简单,有文件包含的item数itemsCount和block数blocksCount, 以及根据系统纳秒时间戳自增生成的mergeIdx的16进制表示
VictoriaMetrics会根据用户设置的数据保留周期retention来定期滚动索引目录,当前一个索引目录的保留时间到了,就会切换一个新的目录,重新生成索引
数据存储格式:
VictoriaMetrics对于写入数据的处理过程。下图是VictoriaMetrics支持的Prometheus协议的一个写入示例。
VictoriaMetrics在接受到写入请求时,会对请求中包含的时序数据做转换处理,如下图所示。首先先根据包含metric和labels的MetricName生成一个唯一标识TSID,然后metric + labels + TSID作为索引index, TSID + timestamp + value作为数据data,最后索引index和数据data分别进行存储和检索。
因此,VictoriaMetrics的数据整体上分成索引和数据两个部分,因此文件格式整体上会有两个部分。其中,索引部分主要是用于支持按照label或者tag进行多维检索。与大多数时序数据库的数据组织方式一样,比如InfluxDB、Prometheus、OpenTSDB等,VictoriaMetrics也是按时间线来组织数据的,即数据存储时,先将数据按TSID进行分组,然后每个TSID的包含的数据点各自使用列式压缩存储
命令行选项:
victoria-metrics:
此处列出的是通用选项,集群得3个组件也支持运行
-httpListenAddr :8428 #监听地址:端口
-storageDataPath 路径 #数据存储路径,默认启动时的当前目录中的victoria-metrics-data中
-memory.allowedPercent 60 #最大内存使用百分比
-search.maxConcurrentRequests 8 #最大请求数,默认为cpu核心数
-search.maxUniqueTimeseries 100000 #限制在给定时间范围内查询可以返回的唯一时间序列的最大数量。这个参数可以帮助防止查询返回过多的数据,从而消耗过多的内存和 CPU 资源
--search.maxQueueDuration 30s #最大查询时间持续时间
-search.maxTagKeys 50000 #限制在给定时间范围内查询可以返回的最大标签键数量。这个参数可以帮助防止查询返回过多的数据,从而消耗过多的内存和 CPU 资源。请求超过5w个就终止
-loggerTimezone Asia/Shanghai #设置时区
-retentionPeriod 3 #数据保留时间,默认1m(一个月),支持:h、d、w、m、y
vmstorage:
-vminsertAddr :8400 #允许vminsert访问的端口
-vmselectAddr :8401 #允许vmselect访问的端口
vminsert:
-storageNode 2.2.2.15:8400,2.2.2.25:8400,2.2.2.35:8400 #vmstorage节点
-replicationFactor=1 #设置数据副本的数量。在生产环境中,建议设置为2或更高,以提高数据的可用性和耐久性
-maxInsertRequestSize=33554432 #参数用于限制插入请求的最大大小
-dedup.minScrapeInterval=1m #设置数据去重的最小间隔。在生产环境中,你可能需要设置这个值为1m或更高,以减少数据的冗余
vmselect:
-replicationFactor: 2 #副本数
-search.maxQueryDuration: 30s #查询最大时间
-clusternative.maxTagKeys: 1000 #最大标签键
-clusternative.maxTagValues: 1000 #最大标签值
-search.maxUniqueTimeseries: 30000 #最大唯一时间序列数量
-storageNode: "vmstorage-0.vmstorage:8400"
-loggerLevel: INFO
单机模式:
在普通场景下,单机模式已足够
部署:
1)下载
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.92.1/victoria-metrics-linux-amd64-v1.92.1.tar.gz
tar xf victoria-metrics-linux-amd64-v1.92.1.tar.gz
mv victoria-metrics-prod /bin/
mkdir -p /opt/victoria-metrics
cat > /etc/systemd/system/victoria-metrics.service <<eof
[Unit]
After=network.target remote-fs.target nss-lookup.target
[Service]
ExecStart=/usr/bin/victoria-metrics-prod \
-httpListenAddr :8428 \
-storageDataPath /opt/victoria-metrics \
-retentionPeriod 1 \
-memory.allowedPercent 40
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
eof
2)普罗米修斯配置数据存储
alerting:
...
remote_write:
- url: http://2.2.2.15:8428/api/v1/write
集群模式
集群部署模式下,各个服务可以进行独立的扩展,但部署vmstorage节点之间建议互不通信和进行数据共享,单节点模式的二进制文件或镜像已经集成了三个必选组件的功能
读写分离api:
官方文档:https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#environment-variables
-
/select 客户端读取数据api,必须是vminsert的8481端口
-
/insert 写入数据api,必须是vmselect的8481端口
请求格式:
命名空间是用于数据隔离,格式为一个任意 32 位整数。可以将其设置为 accountID:projectID
,其中 projectID
也是任意的 32 位整数。如果未设置 projectID
,则等于 0
vmselect地址:8481/select/命名空间(租户)/prometheus/[子接口]
http://
:8481/select/ /prometheus/ vminsert地址:8480/insert/命名空间(租户)/[子接口]
http://
:8480/insert/ /
http://2.2.2.15:8481/select/1/prometheus
组件
- vmstorage:它是一个有状态的组件,主要负责存储原始数据并返回指定标签过滤器在给定时间范围内的查询数据,必选组件,默认端口为8482
- vminsert:无状态的服务组件,主要负责接收数据并根据指标名称和标签做hash后存储到vmstorage,必选组件,默认端口为8480
- vmselect:无状态的服务组件,面向外部终端的查询组件,根据收到的请求去各个vmstorage节点中获取数据,必选组件,默认端口为8481
- vmagent:主要负责数据指标的抓取,并将它们存储在VictoriaMetrics或其他支持remote write协议的Prometheus兼容的存储系统中,会占用本地磁盘缓存。位于图1的Writers那层Load balancer与各个采集源之间,类似于Prometheus server。可选组件,默认占用端口8429
- vmalert:类似于Prometheus中的alertmanager,是一个告警的相关组件,如果不需要告警功能可以不使用该组件,可选组件,默认占用端口为8880
- vmgateway: 企业版组件,读写代理网关,可实现限速、访问控制等
- vmctl: cli工具,用于将普罗米修斯、opentsdb等数据源的数据迁移到victoriametrics
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.92.1/victoria-metrics-linux-amd64-v1.92.1-cluster.tar.gz
tar xf victoria-metrics-linux-amd64-v1.92.1-cluster.tar.gz
mv vm* /usr/local/bin/
scp /usr/local/bin/vm* 2.2.2.25:/usr/local/bin/
scp /usr/local/bin/vm* 2.2.2.35:/usr/local/bin/
cat > /etc/systemd/system/vmstorage.service <<eof
[Unit]
After=network.target remote-fs.target nss-lookup.target
[Service]
ExecStart=/usr/local/bin/vmstorage-prod \
-httpListenAddr :8482 \
-vminsertAddr :8400 \
-vmselectAddr :8401 \
-loggerTimezone Asia/Shanghai \
-storageDataPath /data/vmstorage-data \
-search.maxUniqueTimeseries 100000 \
-search.maxConcurrentRequests 8 \
--search.maxQueueDuration 30s \
-memory.allowedPercent 60 \
-retentionPeriod 3 \
-search.maxTagKeys 50000
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
eof
cat > /etc/systemd/system/vminsert.service <<eof
[Unit]
After=network.target remote-fs.target nss-lookup.target
[Service]
ExecStart=/usr/local/bin/vminsert-prod \
-httpListenAddr :8480 \
-memory.allowedPercent 60 \
-storageNode 2.2.2.15:8400,2.2.2.25:8400,2.2.2.35:8400 \
-replicationFactor 1 \
-maxInsertRequestSize 33554432 \
-loggerTimezone Asia/Shanghai
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
eof
cat > /etc/systemd/system/vmselect.service <<eof
[Unit]
After=network.target remote-fs.target nss-lookup.target
[Service]
ExecStart=/usr/local/bin/vmselect-prod \
-httpListenAddr :8481 \
-memory.allowedPercent 60 \
-storageNode 2.2.2.15:8401,2.2.2.25:8401,2.2.2.35:8401 \
-replicationFactor 1 \
-loggerTimezone Asia/Shanghai
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
eof
systemctl daemon-reload
systemctl restart vmstorage vminsert vmselect
curl 2.2.2.15:8480/metrics
curl 2.2.2.15:8481/metrics
curl 2.2.2.15:8482/metrics
curl 2.2.2.15:8482/health