Prometheus 远端存储(Remote Storage)全景指南:破除单机限制与生产级配置实践
Prometheus 内置的本地时间序列数据库(TSDB)具有极高的读写性能,但在企业级生产环境中,随着监控规模的扩大,单机本地存储的物理局限性会逐渐暴露。
为了实现高可用(HA)、长期历史数据保留以及多集群全局视图,配置远端存储成了不可或缺的架构演进步骤。
本文将为您全面拆解:为什么需要远端存储、底层工作协议、主流选型对比以及生产级的配置实战。
一、 为什么单靠本地存储不够?
Prometheus 本地存储(Local Storage)的设计初衷是“轻量、高效、单机自治”。然而,这种设计带来了以下三大物理限制:
- 无水平扩展能力(No Horizontal Scalability):
本地存储受限于单台服务器的磁盘容量和 I/O 吞吐。当监控指标(Active Series)达到数百万级时,单机内存(RAM)和磁盘极易过载,无法通过简单地增加节点来分担存储压力。 - 缺乏长期保留能力(No Long-term Retention):
在本地存储中保存数月甚至数年的数据成本极高,且随着数据量增大,Prometheus 启动时检索 WAL(预写日志)的耗时会线性增加,极易引发启动超时或 OOM(内存溢出)。 - 高可用(HA)数据不一致:
为了防单点故障,通常会部署两台完全相同的 Prometheus 实例同时抓取相同目标。但由于网络抖动、启动时间差异,两台实例本地 TSDB 记录的数据会存在微小差异,导致查询大盘时出现数据不一致。
本地存储 vs. 远端存储
| 维度 | 本地存储(TSDB) | 远端存储(如 VictoriaMetrics/Thanos) |
|---|---|---|
| 存储介质 | 本地 SSD / 云盘 | 分布式存储 / 对象存储(S3/MinIO) |
| 数据保留期限 | 短期(通常 15 天内) | 长期(数月、数年) |
| 扩展性 | 垂直扩展(受单机物理限制) | 水平扩展(分布式集群) |
| 高可用性 | 弱(单点故障即丢失历史) | 强(多副本、分布式容灾) |
二、 底层运行原理:远端写与远端读协议
Prometheus 通过定义两套标准的 HTTP REST API,实现了与第三方存储系统的对接:
+-------------------+ +-----------------------+
| Prometheus Server | ---- 1. Remote Write (Protobuf) ->| |
| | <--- 2. Remote Read (Optional) ---| Remote Storage |
| +-------------+ | | (VictoriaMetrics / |
| | Local TSDB | | | Thanos / Mimir) |
| +-------------+ | +-----------------------+
+-------------------+ ^
^ |
| (PromQL Query) | (Direct Query)
| |
+-----+-----+ +-----+-----+
| Grafana | =========================================> | Grafana |
| (Normal) | | (Optimal) |
+-----------+ +-----------+
2.1 远端写(Remote Write)
- 机制:当 Prometheus 抓取到最新的时间序列数据后,会同时做两件事:写入本地 TSDB,以及写入内存中的发送队列(Queue)。
- 协议:后台线程从队列中打包样本,使用 Snappy 算法压缩,通过 Protocol Buffers 格式,以 HTTP POST 请求的方式异步推送到远端存储的接收端点。
- 可靠性(吞吐调优):如果远端存储短暂不可用,Prometheus 会将数据缓存在内存队列中,并自动进行指数级退避重试(Backoff),防止数据丢失。
2.2 远端读(Remote Read)
- 机制:当用户在 Grafana 中执行 PromQL 查询时,如果查询的时间范围超出了本地保留期限,Prometheus 会向远端存储发起读取请求,拉取历史时序数据,合并后返回给用户。
- 优化建议:在实际生产中,通常不建议配置 Remote Read。更推荐的做法是:让 Grafana 直接将远端存储(如 VictoriaMetrics)配置为数据源,直接绕过 Prometheus 进行历史数据查询,以减轻 Prometheus Server 的 CPU 和内存压力。
三、 主流远端存储解决方案对比
在企业落地时,目前有三种主流的远端存储架构:
- VictoriaMetrics(推荐:轻量、极简):
- 特点:兼容 Prometheus 读写协议,单机版和集群版都极易部署,内存和磁盘压缩率极高(比 Prometheus 更省空间),通常作为企业替代 Prometheus 本地存储的首选。
- Thanos(灭霸)(推荐:云原生、超大规模):
- 特点:基于对象存储(如阿里云 OSS、AWS S3、MinIO)设计。通过 Sidecar 异步上传 Block 文件,Query 组件提供全局无状态查询,适合超大规模的多集群 Kubernetes 环境。
- Cortex / Grafana Mimir:
- 特点:微服务架构,由 Grafana 官方主导。功能极其强大,但组件繁多(包含 Ingester, Querier, Distributer 等),维护成本较高。
四、 生产级配置实战:Prometheus 对接 VictoriaMetrics
下面我们以 VictoriaMetrics(单机版) 为远端存储目标,展示如何在 Prometheus 中进行配置,并对写入队列进行生产级调优。
4.1 运行 VictoriaMetrics
假设 VictoriaMetrics 部署在内网 192.168.1.50,其默认的 Prometheus 接收端点为:
http://192.168.1.50:8428/api/v1/write
4.2 配置 prometheus.yml 中的 remote_write
如果直接使用默认配置,在指标高并发写入时,Prometheus 经常会出现 Remote write desired shards 报警或数据积压。我们需要对 queue_config 写入队列进行调优:
global:
scrape_interval: 15s
evaluation_interval: 15s
# 远端写入配置
remote_write:
- url: "http://192.168.1.50:8428/api/v1/write" # 远端存储的写入接口
name: "victoria-metrics-prod"
# 临时本地磁盘缓存(防止远端网络彻底崩溃时内存撑爆)
# 可以在本地 WAL 目录下保留未发送成功的段
# 生产级队列调优参数(根据自身吞吐量微调)
queue_config:
# 初始分片数(并发写入的协程数)
min_shards: 4
# 最大分片数(写入洪峰时,允许的最大并发协程数,避免内存溢出)
max_shards: 200
# 每个分片在内存中缓存的最大样本数
capacity: 10000
# 每次向远端批量发送的最大样本数(打包发送,降低 HTTP 请求次数)
max_samples_per_send: 2000
# 缓冲区满时,数据发送的最大等待时间
batch_send_deadline: 5s
# 客户端连接与重试策略
metadata_config:
send: true # 是否向远端发送指标的 Metadata(HELP、TYPE等说明信息)
# 超时与重试控制
write_relabel_configs:
# 可选:利用 Relabel 过滤掉不需要持久化的低价值高基数指标,节省网络带宽和存储空间
- source_labels: [__name__]
regex: "(node_cpu_guest_seconds_total|container_tasks_state)"
action: drop # 丢弃匹配到的指标,不向远端写入
五、 生产实践避坑指南
- 警惕网络带宽过载:
远端写入(Remote Write)会产生持续的、高频的公网或跨 VPC 带宽消耗。在设计网络拓扑时,建议将 Prometheus Server 与远端存储部署在同一内网/同一 VPC 下,避免昂贵的公网带宽费用和网络不稳定造成的丢包。 - 合理控制本地保留期限(
retention):
配置了远端写之后,Prometheus 本地磁盘依然会保留数据。- 建议:将 Prometheus 的本地保留时间大幅缩短(例如修改启动参数
--storage.tsdb.retention.time=2d,仅保留 2 天数据作为热数据缓存)。这样即使本地服务器磁盘损坏,历史监控数据在远端存储中依然安然无恙,且本地 Prometheus 启动耗时可缩短至秒级。
- 建议:将 Prometheus 的本地保留时间大幅缩短(例如修改启动参数
- 合理设置
max_shards(最大并发写入分片):
如果远端存储响应变慢,Prometheus 会自动增加shards(并发写入协程)的数量。如果max_shards设得太大,会导致 Prometheus 内存急剧飙升进而 OOM;如果设得太小,数据会积压在内存队列中无法发出。建议根据生产环境的监控节点规模,逐步微调并观察prometheus_remote_storage_shards指标。
浙公网安备 33010602011771号