Prometheus 远端存储(Remote Storage)全景指南:破除单机限制与生产级配置实践

Prometheus 内置的本地时间序列数据库(TSDB)具有极高的读写性能,但在企业级生产环境中,随着监控规模的扩大,单机本地存储的物理局限性会逐渐暴露。

为了实现高可用(HA)长期历史数据保留以及多集群全局视图,配置远端存储成了不可或缺的架构演进步骤。

本文将为您全面拆解:为什么需要远端存储、底层工作协议、主流选型对比以及生产级的配置实战


一、 为什么单靠本地存储不够?

Prometheus 本地存储(Local Storage)的设计初衷是“轻量、高效、单机自治”。然而,这种设计带来了以下三大物理限制:

  1. 无水平扩展能力(No Horizontal Scalability)
    本地存储受限于单台服务器的磁盘容量和 I/O 吞吐。当监控指标(Active Series)达到数百万级时,单机内存(RAM)和磁盘极易过载,无法通过简单地增加节点来分担存储压力。
  2. 缺乏长期保留能力(No Long-term Retention)
    在本地存储中保存数月甚至数年的数据成本极高,且随着数据量增大,Prometheus 启动时检索 WAL(预写日志)的耗时会线性增加,极易引发启动超时或 OOM(内存溢出)。
  3. 高可用(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 和内存压力。

三、 主流远端存储解决方案对比

在企业落地时,目前有三种主流的远端存储架构:

  1. VictoriaMetrics(推荐:轻量、极简):
    • 特点:兼容 Prometheus 读写协议,单机版和集群版都极易部署,内存和磁盘压缩率极高(比 Prometheus 更省空间),通常作为企业替代 Prometheus 本地存储的首选。
  2. Thanos(灭霸)(推荐:云原生、超大规模):
    • 特点:基于对象存储(如阿里云 OSS、AWS S3、MinIO)设计。通过 Sidecar 异步上传 Block 文件,Query 组件提供全局无状态查询,适合超大规模的多集群 Kubernetes 环境。
  3. 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 # 丢弃匹配到的指标,不向远端写入

五、 生产实践避坑指南

  1. 警惕网络带宽过载
    远端写入(Remote Write)会产生持续的、高频的公网或跨 VPC 带宽消耗。在设计网络拓扑时,建议将 Prometheus Server 与远端存储部署在同一内网/同一 VPC 下,避免昂贵的公网带宽费用和网络不稳定造成的丢包。
  2. 合理控制本地保留期限(retention
    配置了远端写之后,Prometheus 本地磁盘依然会保留数据。
    • 建议:将 Prometheus 的本地保留时间大幅缩短(例如修改启动参数 --storage.tsdb.retention.time=2d,仅保留 2 天数据作为热数据缓存)。这样即使本地服务器磁盘损坏,历史监控数据在远端存储中依然安然无恙,且本地 Prometheus 启动耗时可缩短至秒级。
  3. 合理设置 max_shards(最大并发写入分片)
    如果远端存储响应变慢,Prometheus 会自动增加 shards(并发写入协程)的数量。如果 max_shards 设得太大,会导致 Prometheus 内存急剧飙升进而 OOM;如果设得太小,数据会积压在内存队列中无法发出。建议根据生产环境的监控节点规模,逐步微调并观察 prometheus_remote_storage_shards 指标。
posted on 2026-06-08 14:58  LeeHang  阅读(47)  评论(0)    收藏  举报