Grafana Mimir — 架構
metrics · TSDB blocks · 水平擴展
寫入路徑
Mimir distributor
remote_write 的無狀態入口。驗證、套用每 tenant 限制,並透過 hash ring 把 series 分片到 ingesters。
- 對複製的 Prometheus/Alloy 配對做 HA 去重
- 每 tenant 的速率與 series 限制
- 每個 series 複製到 3 個 ingesters(RF=3)
| protocol | in :8080 /api/v1/push · out gRPC :9095 → ingesters |
| tenancy | 讀取 X-Scope-OrgID;套用每 tenant 寫入限制 |
Mimir ingester
有狀態;近期 series 放在 WAL 保護的記憶體 TSDB head,之後把 2 小時的 blocks 送到物件儲存。
- StatefulSet 搭配持久卷(WAL)
- 向 queriers 提供最近約 12h 的資料
- 每 2h 將 TSDB blocks 寫出/上傳到 mimir-blocks bucket
| protocol | gRPC :9095 · uploads blocks → S3/GCS |
| tenancy | 記憶體中每個 tenant 一個 TSDB |
讀取路徑
Mimir query-frontend
所有 PromQL 讀取的前端:把長區間查詢按天切分、快取結果,並在 tenants 之間公平排隊。
- 查詢切分 + 結果快取(memcached)
- 重試並分片重的查詢
- Grafana 的 Prometheus 資料來源指向這裡
| protocol | in :8080 /prometheus/api/v1/* · out → queriers |
| tenancy | 每 tenant 的查詢佇列公平性 |
Mimir querier
無狀態 PromQL 引擎。從 ingesters 取近期資料、經 store-gateways 取歷史 blocks,然後合併。
- 向 ingesters 扇出取得 head block
- 更舊的資料一律走 store-gateways
- 水平擴展以提高讀取吞吐
| protocol | gRPC → ingesters + store-gateways |
Mimir store-gateway
把物件儲存中的 blocks 提供給 queriers。下載並 mmap block index;透過 ring 把 blocks 分片到各實例。
- 延遲載入 index headers;快取 chunks(memcached)
- Blocks 在 store-gateways 之間分片 + 複製
- 查詢時唯一會讀冷 blocks 的元件
| protocol | gRPC :9095 · reads mimir-blocks bucket |
背景工作
Mimir compactor
把 ingesters 上傳的小 2h blocks 合併成更大、已去重的 blocks,並套用保留期。
- 把 3 份 RF 複本去重成一個 block
- 壓實 2h → 12h → 24h blocks
- 刪除超過每 tenant 保留期的資料
| protocol | reads/writes mimir-blocks bucket |
| tenancy | 每 tenant 的保留期限制 |
Mimir ruler
對 Mimir 自身評估 recording 與 alerting rules,並把告警送到 Alertmanager。
- Rules 依 tenant 存在物件儲存
- Recording rules 經寫入路徑把 series 寫回
- 告警 → Alertmanager API
| protocol | PromQL eval → alert notify :9093 |
| tenancy | rule groups 依 tenant 分命名空間 |