一、什么是Prometheus
1.1 定义:
Prometheus是一个开源监控系统,它前身是SoundCloud的警告工具包。从2012年开始,许多公司和组织开始使用Prometheus。该项目的开发人员和用户社区非常活跃,越来越多的开发人员和用户参与到该项目中。目前它是一个独立的开源项目,且不依赖与任何公司。 为了强调这点和明确该项目治理结构,Prometheus在2016年继Kurberntes之后,加入了Cloud Native Computing Foundation。
1.2 特征:
Prometheus的主要特征有:
- 多维度数据模型
- 灵活的查询语言
- 不依赖分布式存储,单个服务器节点是自主的
- 以HTTP方式,通过pull模型拉去时间序列数据
- 也通过中间网关支持push模型
- 通过服务发现或者静态配置,来发现目标服务对象
- 支持多种多样的图表和界面展示,grafana也支持它
1.3 基本架构
更多内容可以参考:https://prometheus.io/docs/introduction/overview/
二、Prometheus的存储配置
在Prometheus容器run的时候 输入命令部分加上--storage.tsdb.path
和--storage.tsdb.retention.time
的配置即可。即:
docker run -d -p 9090:9090 \
-v /home/sw/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus_test \
--net=host \
prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus/data \
--web.console.libraries=/usr/share/prometheus/console_libraries \
--web.console.templates=/usr/share/prometheus/consoles \
--storage.tsdb.retention.time=7d
其中默认:–storage.tsdb.path =/prometheus,–storage.tsdb.retention.time=15d
三、Prometheus存储的基本概念
3.1 本地存储
Prometheus包括一个本地磁盘时间序列数据库,但也可选择与远程存储系统集成。(可以通过远程读/写API使用外部存储。)
目前虚拟机的存储路径为prometheus docker的/prometheus文件夹:
Prometheus采用TSDB本地存储,核心为block和wal。摄取的样本分为两小时的块(block)。每个两小时的块包含一个目录,其中包含一个或多个块文件,其中包含该时间窗口的所有时间序列样本,以及元数据文件和索引文件(将度量标准名称和标签索引到块文件中的时间序列) )。通过API删除系列时,删除记录存储在单独的逻辑删除文件中(而不是立即从块文件中删除数据)。
当前传入样本的块保存在内存中,但尚未完全保留。通过预写日志(WAL)防止崩溃,可以在崩溃后重新启动Prometheus服务器时重放。WAL以128MB的段存储在wal目录中。这些文件包含尚未压缩的原始数据,因此它们比常规的块文件大得多。Prometheus将至少保留3个预写日志文件,但是高流量服务器可能会看到三个以上的WAL文件,因为它需要保留至少两个小时的原始数据。
最初的两小时块最终会在后台压缩成更长的块。
存储目录结构如下:
-
block的目录结构与存储数据量:
1、TSDB将存储的监控数据按照时间分成多个block存储,默认最小的block保存时间为2h(2h的block会合并成大block,之前block被删除)线上看到压缩三次,source有9个block,那么2*9=18小时
2、TSDB还会将小块合并成大块,减少内存中block的数量,便于索引查找数据(线上观察下来,每一个block目录都经过三次合并,18小时数据)
3.2 运营方面
Prometheus有几个标志,允许配置本地存储。 最重要的是:
- –storage.tsdb.path:这决定了Prometheus写入数据库的位置。 默认为data/。
- –storage.tsdb.retention.time:这决定了何时删除旧数据。 默认为15d。如果此标志设置为默认值以外的任何值,则覆盖storage.tsdb.retention.time。
- –storage.tsdb.retention.size:[EXPERIMENTAL]这确定了存储块可以使用的最大字节数(请注意,这不包括WAL大小,这可能很大)。
最早的数据将被删除。 默认为0或禁用。 此标志是实验性的,可以在将来的版本中进行更改。 支持的单位:KB,MB,GB,PB。
例如:“512MB” - –storage.tsdb.wal-compression:此标志启用压缩预写日志(WAL)。根据您的数据,可以预期WAL大小将减少一半,而额外的CPU负载却很少。请注意,如果启用此标志,然后将Prometheus降级到2.11.0以下的版本,则您将需要删除WAL,因为它将不可读。
3.3 对prometheus存储数据的大小估计:
平均而言,Prometheus每个样本仅使用大约1-2个字节。 因此,要规划Prometheus服务器的容量,可以使用粗略的公式:
needed_disk_space = retention_time_seconds * ingested_samples_per_second * bytes_per_sample
另外,官网有一句话:Again, Prometheus’s local storage is not meant as durable long-term storage.或许使用Prometheus的本地存储作为平台持久化存储的数据库不是明智的选择。
3.4 远程存储集成
prometheus提供了本地存储,即tsdb时序数据库。本地存储的优势就是运维简单,缺点就是无法海量的metrics持久化和数据存在丢失的风险,我们在实际使用过程中,出现过几次wal文件损坏,无法再写入的问题。Prometheus的本地存储在可伸缩性和持久性方面受到单个节点的限制。 Prometheus并没有尝试解决Prometheus本身中的群集存储,而是提供了一组允许与远程存储系统集成的接口。
prometheus以两种方式与远程存储系统集成:
Prometheus可以以标准格式将其提取的样本写入远程URL:
写入:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
Prometheus可以以标准格式从远程URL读取(返回)样本数据:
读取:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read