1. Remote Write 概述
1.1 什么是 Remote Write
Remote Write 是 Prometheus 内置的一种数据推送协议,允许 Prometheus 将采集到的时序样本(Time Series Samples)实时转发到远程存储后端,而不是仅保存在本地磁盘。该协议基于 HTTP/1.1 或 HTTP/2,使用 Protocol Buffers(protobuf)对样本数据进行序列化压缩,并通过 Snappy 算法进一步压缩,从而在保证传输效率的同时降低网络带宽消耗。
核心流程:Prometheus 按照 scrape_interval 拉取目标指标后,经过 remote_write 队列异步地将样本批量发送到配置的远程端点(Endpoint)。发送行为由队列管理器控制,支持重试、背压(Backpressure)和流量整形。
关键特性:
- 异步非阻塞:采集与写入解耦,采集不等待写入确认。
- 批量发送:多个样本合并为一个请求,减少 HTTP 连接开销。
- 内置重试与指数退避:失败时自动重试,避免雪崩。
- 可配置队列参数:容量、并发数、最大重试次数等均可调优。
1.2 Remote Write 在 Prometheus 生态中的角色
在 Prometheus 单机部署中,本地 TSDB 受限于磁盘空间和单点故障风险。Remote Write 将 Prometheus 从“存储节点”转变为“采集与路由节点”,使其融入更大的可观测性基础设施。下图展示了 Remote Write 在典型生产架构中的位置:
Remote Write 使 Prometheus 能够:
- 长期存储:将数据卸载到专用存储系统,突破本地磁盘容量限制。
- 高可用与容灾:多副本写入不同后端,避免单点数据丢失。
- 全局视图:结合 Thanos / Cortex 等方案,实现跨集群指标聚合与全局查询。
- 降低本地压力:减少本地 TSDB 的写入放大和 compaction 开销。
1.3 Remote Write 与 Remote Read 的区别
Remote Write 和 Remote Read 是 Prometheus 与外部系统交互的两种独立协议,职责完全不同。下表从多个维度进行对比:
| 对比维度 | Remote Write | Remote Read |
|---|---|---|
| 数据流向 | Prometheus → 远程后端(推送) | 远程后端 → Prometheus(拉取) |
| 主要用途 | 持久化存储、数据备份、多副本分发 | 查询历史数据、全局聚合查询 |
| 触发方式 | 按 scrape_interval 采集后异步推送 |
按 PromQL 查询请求触发 |
| 数据格式 | protobuf 序列化 + Snappy 压缩 | protobuf 序列化(可含原始样本或聚合结果) |
| 可靠性要求 | 高:队列重试、背压、持久化缓冲 | 低:查询失败可降级或重试 |
| 对 Prometheus 性能影响 | 显著:占用 CPU、内存、网络 I/O | 较小:仅在查询时产生开销 |
| 典型场景 | Thanos Receiver、Cortex Distributor、VictoriaMetrics | Grafana 查询历史数据、跨集群 PromQL |
实践建议: 在调优 Remote Write 时,务必区分写入路径与查询路径。Remote Write 队列的瓶颈通常出现在网络延迟、后端写入吞吐、以及 Prometheus 自身的 CPU/内存资源上。Remote Read 的调优则更关注查询超时、数据分片和索引效率。
下图直观展示两种协议在数据流中的不同位置:
常见误区: 不要将 Remote Write 与 Remote Read 视为对称协议。Remote Write 是“推”模式,对 Prometheus 的资源消耗和稳定性影响远大于 Remote Read。在生产环境中,Remote Write 队列的阻塞可能导致采集积压、内存飙升甚至 OOM,而 Remote Read 失败通常只影响查询体验。