Thanos 的目標#

Thanos 是 Prometheus 長期儲存(Long-Term Storage)三大選項中的最後一位。最初由遊戲後端平台 Improbable 為應對自家大量基礎設施與服務的監控需求而開發,2017 年 11 月開源,2019 年加入 CNCF,目前為 Incubating Project。

Thanos 主要瞄準四個目標:

  • 單一資料源:整合多個 Prometheus 的資料,讓使用者透過單一資料源查詢所有 Prometheus。
  • 無限長期儲存:以 Object Storage 作為長期儲存後端,支援 AWS S3、Google Cloud Storage、Azure Blob Storage、OpenStack Swift。
  • 完全相容 Prometheus:支援 Prometheus Query API,Grafana 等既有工具都能照常使用。
  • 降取樣(Downsampling)與壓縮(Compaction):歷史資料降取樣以加速查詢、壓縮以節省儲存空間。

Improbable 自我定位為「Metaverse Technology Company」,主要產品 SpatialOS 是大型多人遊戲的雲端開發平台;他們需要對大量遊戲後端做穩定監控,這正是 Thanos 誕生的背景。

架構#

Thanos 有兩種主要部署模式:Sidecar 與 Receive。

主要元件:

  • Sidecar:跑在 Prometheus 旁邊,負責讀取 Prometheus 的資料並上傳到 Object Storage。
  • Receiver:直接接收 Prometheus 的 Remote Write,再上傳到 Object Storage(不需 Sidecar)。
  • Store Gateway:當 Sidecar 或 Receiver 已經沒有舊資料時,從 Object Storage 取出資料供查詢。
  • Compactor:對 Object Storage 中的資料做壓縮、降取樣,並清除過舊資料。
  • Rule:執行 Recording / Alerting Rule,並將結果上傳 Object Storage。
  • Querier:對外提供 Prometheus API 查詢,從 Store Gateway、Sidecar 或 Receiver 收集資料。
  • Query Frontend:在 Querier 之前再加一層,提供查詢切分與結果快取,加速大範圍查詢。

使用 Sidecar 模式時,搭配的 Prometheus 必須將 --storage.tsdb.min-block-duration--storage.tsdb.max-block-duration 設成相同值,等於關閉 Prometheus 自身的 Compaction,把這項工作交給 Thanos Compactor。實務值建議為 2h;Lab 為了快速驗證會用 5m

Downsampling 細節#

Cortex 與 Mimir 沒有的招牌功能在 Thanos 上出現了:Downsampling。

Prometheus Metrics 的採樣頻率常常是每 15 秒一次,一年下來單一條 Series 就會有 200 多萬個資料點。即便 Prometheus 的 Range Query 已經會用 Step 參數降低回傳資料量,但這種臨時抽樣有兩個問題:

  • 抽到的單點不一定能代表周圍的資料趨勢。
  • 查詢時還要花時間計算要回哪些點。

Thanos 採用的 Downsampling 策略是事前把較舊的資料用統計方式(Sum、Count、Min、Max 等)歸納成一個代表值,存成新的 Block。如此一來,長範圍查詢可以直接命中已經算好的代表值,查詢速度會明顯提升。

Downsampling 並不會節省儲存空間。Thanos 不會刪除原始資料,反而每個原始 Block 會多衍生兩個 Block,整體儲存量會略為增加。保留原始資料的好處是,當你在長範圍查詢中發現異常時,仍可回頭看原始資料做更細緻的分析。

Lab 摘要#

範例 10-thanos 提供兩種啟動方式。

Sidecar 模式#

docker-compose up -d

服務:

  • Prometheus:http://localhost:9090
  • Thanos Query Frontend:http://localhost:9091
  • Grafana:http://localhost:3000,預設 admin/admin

關閉:

docker-compose down

Receive 模式#

docker-compose -f docker-compose.receive.yaml up -d

關閉:

docker-compose -f docker-compose.receive.yaml down

Lab 達成的目標:

  • 建立 Thanos 供 Grafana 查詢。
  • Sidecar 範例:以 Sidecar 讀取 Prometheus 資料並寫入 Object Storage。
  • Receive 範例:以 Receiver 接收 Prometheus 的 Remote Write 寫入 Object Storage。
  • Grafana 把 Thanos Query Frontend 當成 Metrics Data Source。

小結#

Thanos 是專為解決 Prometheus 長期儲存與大規模查詢需求而生,除了長期儲存、多來源整合、查詢加速之外,Downsampling 是它最具識別度的特色。它在 Red Hat 等大型廠商的 Monitoring Stack(OKD / OpenShift)中都有蹤跡。

Cortex、Mimir、Thanos 三家就此介紹完畢。實務選擇要回到「需求是什麼」——觀察工具誕生背景、核心開發者目前任職方向,也是判斷工具未來走勢的有趣切入點。

原文出處#

  • 原書/iThome:https://ithelp.ithome.com.tw/articles/10326593