Prometheus 存储方案与优化

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【8月更文第29天】Prometheus 是一个流行的开源监控系统,它使用时间序列数据库来存储监控数据。Prometheus 的时间序列数据库是基于本地文件系统的,这种设计提供了高吞吐量的读写能力,但同时也带来了存储方面的挑战。本文将详细介绍 Prometheus 存储的工作原理,并提出一些优化策略以减少磁盘占用。

引言

Prometheus 是一个流行的开源监控系统,它使用时间序列数据库来存储监控数据。Prometheus 的时间序列数据库是基于本地文件系统的,这种设计提供了高吞吐量的读写能力,但同时也带来了存储方面的挑战。本文将详细介绍 Prometheus 存储的工作原理,并提出一些优化策略以减少磁盘占用。

Prometheus 存储原理

Prometheus 使用本地时间序列数据库来存储数据,该数据库由一系列称为块(chunks)的数据结构组成。每个块都包含一定时间段内的数据,通常是 2 小时的数据量。Prometheus 采用 WAL (Write-Ahead Log) 机制来保证数据的持久性和一致性。

数据存储流程
  1. 写入:Prometheus 接收到样本数据时,首先将其写入到一个称为 WAL 的文件中。
  2. 缓存:样本数据随后被写入内存中的缓存中。
  3. 持久化:定时将缓存中的数据持久化到磁盘上的块文件中。
  4. 过期:过期的数据会被定期清理。

存储优化策略

Prometheus 的存储优化主要集中在减少磁盘占用和提高查询效率两个方面。

1. 减少数据采样频率

减少数据采样频率可以显著降低存储需求。例如,如果应用不需要每秒的数据点,可以将采样间隔设置为 1 分钟或更长。

global:
  scrape_interval: 1m
2. 使用数据压缩

Prometheus 使用 Snappy 压缩算法对数据进行压缩,可以显著减少存储空间。默认情况下,Prometheus 已经启用了数据压缩。

3. 限制存储时间

通过配置 retention.time 参数,可以限制 Prometheus 保留数据的时间长度。一旦数据超过这个时间,就会被自动删除。

storage:
  local:
    retention_time: 15d
4. 使用外部存储

Prometheus 支持将数据存储到外部系统,如 S3、Google Cloud Storage 或 Azure Blob Storage。这样不仅可以节省本地磁盘空间,还可以实现数据的备份和归档。

remote_write:
- url: "http://your-s3-proxy:9090/api/prom/push"
  queue_config:
    capacity: 5000
    max_shards: 100
    max_samples_per_send: 1000
    batch_send_deadline: 5s
5. 调整块大小

通过调整块大小可以影响数据的写入和查询性能。较大的块可以减少查询时的 I/O 操作次数,但可能会增加写入时的延迟。

storage:
  local:
    chunk_target_size: 512Mi
6. 利用分区

Prometheus 2.19 版本引入了分区功能,可以将数据分布在不同的磁盘上,从而提高写入性能并减少单一磁盘的压力。

storage:
  local:
    wal_partitions: 2

示例:使用 Prometheus 外部存储

下面是一个使用 S3 作为外部存储的例子:

  1. 安装 Thanos:Thanos 是一个与 Prometheus 兼容的工具集,可以用来实现数据的长期存储和查询。
# 下载 Thanos 二进制文件
wget https://github.com/thanos-io/thanos/releases/download/v0.24.0/thanos-0.24.0.linux-amd64.tar.gz
tar xvf thanos-0.24.0.linux-amd64.tar.gz
cd thanos-0.24.0.linux-amd64/

# 启动 Thanos Sidecar
./thanos sidecar --grpc-address=0.0.0.0:10901 --from=prometheus --prometheus.url=http://localhost:9090
  1. 配置 Prometheus:在 Prometheus 的配置文件中添加 Thanos 的远程写入配置。
remote_write:
- url: "http://thanos-sidecar:10901/api/v1/push"
  1. 配置 Thanos Receiver:在 Thanos 的配置文件中指定 S3 存储。
receive:
  remote_write:
  - url: "http://localhost:10901/api/v1/push"

store:
  s3:
    endpoint: "s3.amazonaws.com"
    access_key: "YOUR_ACCESS_KEY"
    secret_key: "YOUR_SECRET_KEY"
    bucket_name: "prometheus-data"
  1. 启动 Thanos Receiver
./thanos receive --config-file=thanos-receiver.yml

结论

Prometheus 的本地时间序列数据库虽然简单高效,但在大规模部署时可能会遇到存储瓶颈。通过调整数据采样频率、限制存储时间、使用外部存储等方式,可以有效减轻存储压力。希望本文能够帮助你更好地理解 Prometheus 的存储机制,并掌握一些实用的优化技巧。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
6月前
|
存储 JSON Prometheus
如何精简 Prometheus 的指标和存储占用
如何精简 Prometheus 的指标和存储占用
|
存储 Prometheus 监控
高可用prometheus集群方案选型分享
高可用prometheus集群方案选型分享
6175 2
高可用prometheus集群方案选型分享
|
3月前
|
存储 Prometheus Cloud Native
[prometheus]基于influxdb2实现远端存储
[prometheus]基于influxdb2实现远端存储
201 2
|
4月前
|
弹性计算 Prometheus Cloud Native
SLS Prometheus存储问题之Union MetricStore在性能测试中是如何设置测试环境的
SLS Prometheus存储问题之Union MetricStore在性能测试中是如何设置测试环境的
|
4月前
|
存储 Prometheus Cloud Native
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
|
4月前
|
测试技术 UED 存储
SLS Prometheus存储问题之在使用内置降采样时,SLS自动选择适配的指标库该如何解决
SLS Prometheus存储问题之在使用内置降采样时,SLS自动选择适配的指标库该如何解决
|
4月前
|
存储 并行计算 开发工具
SLS Prometheus存储问题之相比客户端SDK聚合写入,SLS网关侧聚合写入有什么优势
SLS Prometheus存储问题之相比客户端SDK聚合写入,SLS网关侧聚合写入有什么优势
|
存储 Prometheus 运维
关于Prometheus在K8S中的部署方案如何选择,以及分享手工部署的YAML
关于Prometheus在K8S中的部署方案如何选择,以及分享手工部署的YAML
207 0
|
存储 Prometheus 监控
重磅!DIY的Prometheus主备方案,全网唯一。生产未上,测试先行。
重磅!DIY的Prometheus主备方案,全网唯一。生产未上,测试先行。
319 0
|
域名解析 Prometheus Kubernetes
kubernetes 部署Prometheus监控集群传统部署方案)(2)
kubernetes 部署Prometheus监控集群传统部署方案)(2)
kubernetes 部署Prometheus监控集群传统部署方案)(2)

相关产品

  • 可观测监控 Prometheus 版