Thanos 架構介紹
Thanos 是 Prometheus 的水平擴展層,不替換 Prometheus,而是在它上面加元件。 核心思想:把 Prometheus 的短期資料(熱資料)和 S3 的長期資料(冷資料)統一成一個查詢界面。
為什麼需要 Thanos
Prometheus 單節點的限制:
| 問題 | 說明 |
|---|---|
| 單點故障 | 一個 Prometheus 掛掉就沒有資料 |
| 垂直擴展上限 | RAM 放不下超過約 100 萬個 active series |
| 資料保留有限 | EBS 成本隨保留期線性增長;90 天就很貴 |
| 無跨實例查詢 | 多個 Region 的 Prometheus 相互獨立,查詢無法跨越 |
Thanos 解決:高可用(多個 Prometheus 互備)+ 長期保留(S3)+ 統一查詢(Query 層聚合)。
核心元件
Thanos Sidecar
部署: 跟 Prometheus 同 Pod(sidecar container 模式)
Prometheus Pod:
┌────────────────────────────────────────────┐
│ container: prometheus ─┐ │
│ │ mount /data │
│ container: thanos-sidecar ─┘ │
│ │
│ shared volume (PVC): /data │
└────────────────────────────────────────────┘
跟 Prometheus 的關係
- 共享 PVC:兩個 container mount 同一個
/datavolume - 共享 network namespace:sidecar 可以打
localhost:9090
三大職責
1. 暴露 gRPC StoreAPI :10901 給 thanos-query 取資料
★ 取資料時 sidecar 直接讀
/data上的 TSDB 檔案,不會反向去打 Prometheus 的 HTTP API。
2. 每 2h 把 Prometheus 完成的 TSDB block 上傳 S3
★ 走 HTTPS REST + IRSA,跟 gRPC 無關。 ★ 看
/data目錄有新 block 就 upload,不問 Prometheus。
3. 充當「最近 2h 資料」的查詢端點
★ 不是 proxy 去問 Prometheus。 ★ 是自己讀
/data上還沒被 upload / 還在 WAL 的資料。
跟 Prometheus HTTP API 的關係
Sidecar 確實會打 localhost:9090,但只用在 metadata / 控制訊號:
| 時機 | 用途 |
|---|---|
| 啟動時 | call 一次拿 external_labels + 確認 flags |
| 每 30 秒 | heartbeat 確認 Prometheus 還活著 |
| Prometheus shutdown 時 | call snapshot 強制 flush |
★ 這些都不是 metric 資料。Metric 資料 100% 透過共享 PVC 拿。
用比喻記住
| 想像 | 對應 |
|---|---|
| Prometheus = 房東,每天寫日記放抽屜 | 寫 /data 上的 TSDB block |
| Sidecar = 室友,會自己開抽屜看日記 | 讀 /data 上的 block |
/data PVC = 兩人共用的抽屜 | shared volume |
localhost:9090 = 房東房間門口的對講機 | 拿 metadata 用 |
gRPC :10901 = 室友家對外的電話 | 給 querier 打進來 |
| S3 SDK = 室友自己寄日記到雲端的快遞 | upload block |
重點:室友從來不問房東「日記寫了什麼」,他自己開抽屜看。