mimir 是独立部署的 prometheus 远程长期存储系统,go 服务只需暴露标准 /metrics,由 prometheus 抓取后通过 remote_write 推送至 mimir 的 distributor,再由 grafana 查询;需配置 remote_write url、压测 ingester 和对象存储,并将 prometheus 本地保留时间设为短周期。

Mimir 不是直接在 Go 微服务进程内“配置”的组件,它是一个独立部署的、面向 Prometheus 的远程长期存储系统。你不需要在 Go 代码里写 Mimir 配置,而是让 Prometheus 把指标远程写入到 Mimir,再由 Grafana 或 PromQL 查询它。
真正要动手改的地方,是你的监控数据流路径:Go 服务 → Prometheus(抓取)→ Mimir(远程写)→ Grafana(查询)。
remote_write 必须配对 Mimir 的 distributor 地址
Prometheus 的 remote_write 配置项决定了指标往哪发。Mimir 默认暴露一个 /api/prom/push 端点用于接收写请求,地址通常是:
http://mimir-distributor:9009/api/prom/push
对应配置片段:
remote_write:
- url: "http://mimir-distributor:9009/api/prom/push"
queue_config:
max_samples_per_send: 10000
max_shards: 20
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
min_backoff: "30ms"
注意三点:
- 不要用
https除非你明确配置了 TLS;Mimir 默认只监听http -
max_shards建议设为 10–30,太小会导致写入瓶颈,太大则增加 distributor 负载(尤其双十一期间高基数 label 场景) - 如果 Prometheus 实例多于 1 个,确保它们都指向同一个
distributor,否则数据会分片不均
Go 微服务本身只需暴露标准 /metrics,别动 Mimir 相关逻辑
你的 Go 服务只需做两件事:
- 引入
prometheus/client_golang,注册指标并暴露/metricsHTTP handler - 确保 Prometheus 的
scrape_configs正确指向该服务的:port/metrics
例如:
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
别试图在 Go 里调用 Mimir API 写数据——那既绕过 Prometheus 的采样/聚合逻辑,又破坏了 label 一致性,还会让指标丢失 timestamp 精度。
双十一前必须压测 ingester 和对象存储吞吐
Mimir 的写入瓶颈不在 distributor,而在 ingester(负责缓冲+落盘)和后端对象存储(如 MinIO)。双十一期间每秒数百万样本写入时:
- 检查
ingester的-ingester.max-series-per-user是否足够(默认 100 万,大厂常调至 500 万+) - 确认对象存储的 PUT 吞吐 ≥ 150 GiB/s(参考 MinIO 官方基准),否则 ingester 缓冲区会堆积,触发
write_dropped_samples_total上升 - 观察
mimir_ingester_memory_series指标,若持续接近-ingester.max-series-per-user,说明 series 爆炸,需收紧 label(比如去掉user_id这类高基数 label)
Mimir 的长周期能力依赖于对象存储的可靠性,而不是 Go 服务里的某段代码。最容易被忽略的是:Prometheus 的 storage.tsdb.retention.time 应设为短周期(如 6h),把长期归档完全交给 Mimir——否则本地磁盘会撑爆,且查询会跨两个存储引擎,结果不可靠。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










