thanos通过sidecar将prometheus本地tsdb数据块异步上传至对象存储,配合store gateway、compactor和querier实现长期持久化、全局查询与智能压缩。

Prometheus 本身不支持跨实例数据同步或长期持久化,本地存储(TSDB)默认只保留短期数据(如15天),磁盘用满后会自动清理。要实现可靠、可扩展、低成本的持久化存储,必须借助 Thanos —— 它不是替代 Prometheus,而是作为其“增强层”,把历史数据安全地存到对象存储中,同时保持查询透明。
核心机制:Prometheus + Thanos Sidecar 实现持久化
Prometheus 不直接写对象存储,而是通过 Thanos Sidecar 这个伴生组件完成持久化。Sidecar 与 Prometheus 部署在同一 Pod 或同一宿主机上,持续监听 Prometheus 的本地 TSDB 数据块(block),在块“封存”(compaction 完成)后,将其上传至对象存储(如 S3、MinIO、GCS)。
关键点:
- 数据上传是异步、增量、按块进行的,不影响 Prometheus 正常抓取和查询;
- 上传的是已压缩的 TSDB block(
.tar.gz格式),非原始样本流; - 上传完成后,Prometheus 本地仍可按配置保留短期数据(如
--storage.tsdb.retention.time=2d),Sidecar 不干预本地清理逻辑。
必须配置的三项内容
✅ 1. Prometheus 启用远程写入(可选,用于接收链路冗余)
虽然持久化主路径是 Sidecar 上传 block,但部分架构(如使用 Thanos Receive)也会开启 remote_write,将实时样本流推给 Thanos Receive 组件。若仅走 Sidecar 路径,此项非必需,但建议保留以支持多写入通道:
# prometheus.yml
remote_write:
- url: "http://thanos-receive:10908/api/v1/receive"
queue_config:
capacity: 5000
max_samples_per_send: 1000
⚠️ 注意:此配置仅在使用
thanos receive模式时生效;Sidecar 模式下,它不参与持久化 block,但可用于容灾补传。
✅ 2. Thanos Sidecar 启动参数指定对象存储和 TSDB 路径
Sidecar 必须知道:
- Prometheus 的 HTTP 地址(用于健康检查、查询代理);
- 本地 TSDB 存储目录(如
/prometheus); - 对象存储配置文件路径(如
bucket.yml)。
示例启动命令:
thanos sidecar \ --prometheus.url=http://localhost:9090 \ --tsdb.path=/prometheus \ --objstore.config-file=/etc/thanos/bucket.yml \ --http-address=0.0.0.0:10902 \ --grpc-address=0.0.0.0:10901
其中 bucket.yml 内容示例(以 MinIO 为例):
type: S3 config: bucket: "thanos" endpoint: "minio.monitoring.svc.cluster.local:9000" access_key: "thanos" secret_key: "thanos123456" insecure: true
✅ 3. 对象存储准备就绪并可写入
- 创建对应 bucket(如
thanos); - 确保网络连通(Prometheus Pod → 对象存储 endpoint);
- 权限正确(Sidecar 能 PUT 对象,Store Gateway 能 LIST/GET);
- 生产环境建议启用 TLS 和 IAM 角色(云环境)或 Signed URL(私有环境)。
后续组件保障持久化可用性
上传只是第一步。要让这些存在对象存储里的数据真正“能查、能压、能去重”,还需部署:
- Thanos Store Gateway:索引对象存储中的所有 block,暴露 gRPC 接口供 Querier 查询;
-
Thanos Compactor:定期合并小 block、降采样(downsample)、删除过期数据(按
--retention.resolution-*配置),节省空间并加速查询; -
Thanos Querier:聚合本地 Prometheus(实时)+ Store Gateway(历史)的数据,对外提供统一
/api/v1/query接口。
? 提示:Compactor 是唯一能真正“删除”对象存储中过期数据的组件,务必配置
--retention.resolution-raw=30d等策略,并确保它有写权限(DELETE 对象)。
验证持久化是否生效
- 查看 Sidecar 日志,确认类似输出:
level=info msg="uploaded block" block=01JXXXXXX...
- 登录对象存储控制台,检查 bucket 中是否出现
thanos/01J.../目录结构; - 查询 Thanos Store Gateway 的 metrics:
thanos_store_series_found_total应随时间增长; - 在 Grafana 中用较老时间范围(如 7 天前)查询指标,确认结果非空且延迟合理。
持久化不是一配即成,而是一套协同工作的数据生命周期管理。Sidecar 负责“送出去”,Compactor 负责“理干净”,Store Gateway 负责“找得到”,Querier 负责“合起来”。每环缺一不可。











