伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Prometheus千節點集群的橫向擴展實踐

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-03-31 14:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Prometheus千節點集群的橫向擴展實踐

1 背景與挑戰:千節點規模下Prometheus的瓶頸

在2026年的運維環境中,千節點規模的Kubernetes集群已經稀松平常。一個典型的中大型互聯網公司,其Kubernetes集群規模通常在3000至5000個節點,單個集群中運行的Pod數量動輒數萬個。在這樣的規模下,監控系統面臨的壓力是前所未有的。

Prometheus作為云原生時代最主流的時序數據庫,憑借其強大的數據模型、靈活的查詢語言PromQL以及豐富的生態集成,幾乎成為監控領域的標準配置。然而,Prometheus的設計初衷是作為一個單機版監控解決方案,其架構在面對超大規模場景時會暴露出幾個核心瓶頸。

存儲容量瓶頸是最直觀的問題。Prometheus采用本地存儲引擎TSM(Time-Serie Storage),數據寫入本地磁盤。在默認配置下,單個Prometheus實例的存儲容量受限于宿主機的磁盤空間。按照2026年常見的采集頻率計算:一個包含5000個指標的采集任務,每15秒采集一次,每條時間序列數據點占用約200字節,那么每天產生的數據量約為5000 * 86400/15 * 200 = 5.76GB。考慮到采集的指標數量遠超5000,以及高基數標簽帶來的存儲膨脹,一個千節點集群的單日數據量輕松突破100GB。在不經過任何優化的情況下,單機Prometheus的磁盤容量在數周內就會耗盡。

查詢性能衰退是另一個致命問題。隨著數據量的增長,Prometheus的查詢延遲會急劇上升。PromQL的rate()、sum()等聚合操作在處理大時間范圍數據時,需要掃描大量的數據塊。實測表明,當單個Prometheus實例存儲超過500GB數據時,90分位查詢延遲會從毫秒級退化到數秒,這在SRE響應故障時是不可接受的。

高可用與數據持久性的矛盾同樣突出。單機Prometheus實例是單點的,一旦宿主機宕機,歷史監控數據將永久丟失。對于追求四個九以上可用性的生產環境,這是不可接受的風險。雖然可以通過雙副本復制的方式提升可用性,但復制本身會帶來存儲成本翻倍的問題。

采集端的瓶頸體現在高基數標簽(High Cardinality)問題上。2026年的服務網格環境中,Prometheus經常需要采集帶有trace_id、user_id等高基數標簽的指標。當Pod數量達到數萬個時,唯一的標簽組合數量可能達到百萬量級,這會直接導致Prometheus的內存溢出(OOM)。這一問題在引入服務網格(Istio、Linkerd)后尤為突出,sidecar代理產生的指標往往是普通應用指標的10倍以上。

基于上述挑戰,千節點規模下的Prometheus架構必須走向分布式化。本篇文章將詳細介紹如何基于Thanos構建千節點集群級別的監控平臺,涵蓋架構設計、容量規劃、故障排查和最佳實踐。

2 架構演進:從單機到聯邦集群

理解Prometheus的分布式擴展路徑,需要先梳理業界實踐中最常見的幾種架構演進模式。

第一種模式:聯邦集群(Federation)是Prometheus官方推薦的擴展方案。其核心思想是按業務域或功能域劃分多個Prometheus實例,每個子Prometheus負責采集特定范圍的目標,然后通過中心Prometheus進行跨域聚合查詢。

┌─────────────────────────────────────────────────┐
│       Federation Gateway         │
│     /federate?match[]={job="kubernetes"}  │
└─────────────┬─────────────────┬─────────────────┘
       │         │
  ┌─────────▼──────┐  ┌──────▼──────────┐
  │ Prometheus-1 │  │ Prometheus-2  │
  │ (Kubernetes) │  │ (Nginx/網關)  │
  └───────┬───────┘  └──────┬─────────┘
      │         │
  采集kubernetes組件  采集nginx metrics

聯邦架構的優點是實現簡單,無需引入額外的組件,適合節點數量在500以內的場景。但其缺點同樣明顯:中心Prometheus仍然承擔了所有查詢聚合的負載,成為性能瓶頸;數據在各子Prometheus中獨立存儲,無法跨實例做歷史數據的統一查詢;并且federate接口的PromQL匹配能力有限,無法做跨標簽的靈活關聯查詢。

第二種模式: Thanos架構是目前生產環境中最主流的千節點以上規模解決方案。Thanos是CNCF的畢業項目,它在Prometheus基礎上添加了一套完整的分布式層,包括全局查詢、長期存儲、高可用和降采樣。其核心設計理念是"Prometheus原地擴展",即不需要修改Prometheus本身的代碼,只需要通過Sidecar組件與Prometheus一同部署,即可獲得分布式能力。

┌────────────────────────────────────────────────────────┐
│           Thanos Query            │
│         (全局查詢入口,GRPC)          │
└──────┬───────────────┬──────────────┬──────────────────┘
   │        │       │
 ┌────▼────┐  ┌─────▼────┐  ┌────▼─────┐
 │Thanos  │  │Thanos  │  │Thanos  │
 │Sidecar-1│  │Sidecar-2 │  │Store   │
 │Prom-1  │  │Prom-2  │  │Gateway  │
 └─────────┘  └──────────┘  └──────────┘
                     │
                  ┌─────▼──────┐
                  │ 對象存儲  │
                  │ (S3/GCS)  │
                  └────────────┘

Thanos的核心組件包括:

Thanos Sidecar:以Pod形式與Prometheus共同部署,實時讀取Prometheus的 WAL(Write-Ahead-Log)并將數據上傳至對象存儲。同時響應Thanos Query的實時查詢請求。

Thanos Query:無狀態的查詢網關,接收PromQL查詢請求,委托給所有注冊的Thanos Sidecar和Store Gateway,并將結果進行去重和聚合。它通過Prometheus的GRPC API實現組件發現。

Thanos Store Gateway:從對象存儲中讀取歷史數據,為Thanos Query提供歷史數據查詢能力。它實現了 Thanos Store API,實際上是一個對象存儲的GRPC代理。

Thanos Compactor:運行于對象存儲端,負責對歷史數據進行壓縮(compaction)和降采樣(downsampling)。壓縮將8小時塊合并為更大的塊,降采樣則為不同時間范圍預計算聚合數據以加速查詢。

Thanos Ruler:用于基于PromQL的告警規則和錄制規則求值,類似于Alertmanager的告警規則引擎,但結果可寫回對象存儲或暴露給Query。

第三種模式: Cortex / Mimir是另外一條技術路線,它們是基于Prometheus存儲格式的完全托管式多租戶時序數據庫。Cortex(原來自Prometheus團隊,現已并入Grafana Mimir)更適合于需要強多租戶隔離和超大規模(百萬指標級)的場景。其架構更為復雜,需要Cassandra或DynamoDB作為索引存儲,元數據管理更為繁重。對于千節點至萬節點規模,Thanos通常是最優性價比選擇。

本文后續內容將聚焦于Thanos架構的實戰細節,因為它是目前生產落地最成熟、資料最豐富的方案。

3 核心設計:Thanos架構深度解析

3.1 數據寫入路徑

Thanos的數據寫入路徑是理解其架構的起點。在Thanos模式下,Prometheus照常采集指標,采集的數據首先寫入本地TSM文件。Thanos Sidecar組件通過持續讀取Prometheus的WAL(Write-Ahead-Log)文件,將數據以TSM塊的形式異步上傳至對象存儲。

這一設計的關鍵在于"異步性":Prometheus的數據寫入路徑完全不改變,Sidecar的上傳操作對Prometheus本身是透明的,不影響其采集性能。上傳的數據塊首先以"pending"狀態寫入對象存儲的/store腰帶路徑,經過Thanos Compactor壓縮后,才會遷移到/store/compact路徑供Store Gateway讀取。

對象存儲中選擇以TSM原始塊格式存儲,而非轉換為列式格式(如Parquet),是因為Thanos希望保持與Prometheus本地存儲的格式兼容,使得即使用戶不使用Thanos,仍然可以通過工具直接讀取歷史數據。

3.2 查詢路徑的并行化

Thanos Query是整個架構中最核心的組件,理解它的查詢路徑是掌握Thanos性能的關鍵。

當用戶發起一個PromQL查詢(如sum(rate(http_requests_total{job="api"}[5m])) by (service))時,查詢請求首先到達Thanos Query的無狀態HTTP端點。Thanos Query會根據查詢中涉及的標簽匹配器(Label Matcher),首先向所有已注冊的Sidecar和Store Gateway發送Info請求,獲取每個存儲后端所包含的時間序列元數據(塊文件索引)。

具體查詢路徑如下:

1. 查詢計劃階段(Query Planning)
 Query解析PromQL,從每個Store/Sidecar獲取該查詢
 需要掃描的數據塊列表(通過LabelMatchers過濾)

2. 階段并行查詢(Parallel Query Execution)
 Query同時向多個Store/Sidecar發送實際數據請求
 每個響應被標記來源("replica"標簽)用于去重

3. 結果去重(Deduplication)
 因為Prometheus通常以雙副本部署以保證高可用,
 同一指標會有兩個副本寫入對象存儲。
 Query通過"replica"標簽進行去重,默認保留離查詢時間點更近的數據。

4. 聚合返回(Aggregation)
 如果PromQL包含聚合操作(sum, avg等),
 Query在合并所有來源數據后執行最終聚合。

Thanos Query的橫向擴展能力體現在:可以部署多個Query實例,通過DNS或Kubernetes Service進行負載均衡。由于Query本身是無狀態的,增加實例數可以線性提升查詢吞吐量。

3.3 存儲格式與降采樣

Thanos Compactor是數據治理的核心組件。它定時掃描對象存儲中的數據塊,執行兩類關鍵操作:

壓縮(Compaction):Prometheus的原始數據塊大小為2小時,Compactor會將多個小塊合并為更大的塊。壓縮后的塊可以顯著減少對象存儲的API調用次數(讀取一個10GB塊 vs 讀取100個100MB塊),同時降低查詢時的塊數量。

降采樣(Downsampling):對于超過保留期限(如30天)的數據,Compactor會預計算5分鐘和1小時的粗粒度聚合數據。這一機制對查詢性能至關重要:假設要查詢過去30天的CPU使用率趨勢,如果數據精度為15秒,則需要掃描約170萬個數據點;如果使用1小時降采樣數據,則僅需掃描720個點。實測中,30天歷史查詢的響應時間可以從30秒降低到300毫秒。

降采樣規則通常配置為:

原始數據(raw):保留0-30天,精度15秒

5分鐘降采樣(5m):保留30-90天

1小時降采樣(1h):保留90天以上

3.4 塊文件結構

理解Thanos的數據塊文件結構,有助于在排障時判斷數據完整性。每隔2小時Prometheus生成一個新的數據塊,目錄結構如下:

01H2B5GXYZ123D2ZZZZZZZZZZZZZZZZ/
├── chunk      # 列式存儲的數據點序列
│  └── 000001
├── index      # 標簽索引文件(外部標簽+元數據)
├── meta.json    # 塊元數據(ULID、時間范圍、降采樣級別)
└── tombststones  # 標記刪除的數據序列

meta.json中記錄了塊的ULID、時間范圍、來源(Prometheus實例ID)、是否經過降采樣等信息。在排查數據缺失時,首先應檢查對象存儲中對應時間范圍的塊文件是否完整。

4 存儲層橫向擴展:對象存儲選型與配置

4.1 對象存儲選型對比

Thanos支持多種對象存儲后端,2026年主流的選擇如下:

存儲類型 優點 缺點 適用場景
S3兼容存儲(MinIO/AWS S3) 生態成熟,工具鏈完整 按請求計費,冷熱數據成本差異大 中大規模,多云部署
Google GCS 與GKE集成好,讀優化 跨區域訪問延遲較高 GCP原生環境
Azure Blob 冷存儲成本極低 元數據操作較慢 Azure環境
阿里云OSS 國內合規性好 專有網絡綁定 阿里云環境

對于千節點規模的生產環境,推薦使用S3兼容存儲。在國內場景下,如果基礎設施在阿里云,使用OSS是更務實的選擇。阿里云OSS的請求費用雖然比MinIO自建高,但其高可用性和免運維成本在大規模場景下更具性價比。

4.2 MinIO集群部署配置

對于私有化環境,MinIO是S3兼容存儲的首選方案。MinIO支持兩種部署模式:FS(單節點單驅動)、Erasure Code(分布式糾刪碼)。千節點Prometheus集群的數據寫入量通常在TB級,需要部署分布式MinIO集群以獲得足夠的吞吐量和可用性。

# MinIO分布式集群推薦配置:8節點,每節點4塊盤
# 糾刪碼配置:data=6, parity=2(即8+6+2配置)
# 可用容量:(8-2)*4盤/8 = 24盤/8 = 3盤容量

# 啟動腳本:minio-start.sh
#!/bin/bash
exportMINIO_ROOT_USER=prometheus
exportMINIO_ROOT_PASSWORD=ThanosSecure2026!
exportMINIO_擦識趣域=us-east-1

/opt/minio/bin/minio server 
 http://minio{1...8}.cluster.local:9000/data{1...4} 
 --console-address":9001"
 --certs-dir /opt/minio/certs 
 --address":9000"

MinIO的吞吐量規劃:單節點4盤RAID0配置的順序寫約能跑到800MB/s。8節點分布式集群的聚合寫吞吐約5GB/s,完全能夠滿足千節點Prometheus的上傳需求(通常單日數據量在100-200GB,上傳速率峰值約10MB/s)。

4.3 Thanos對象存儲配置

# thanos-storage.yaml
type: S3
config:
 bucket: thanos-data
 endpoint: minio.cluster.local:9000
 region: us-east-1
 access_key: thanos_uploader
 secret_key:Than0sSecret2026!
 s3_force_path_style:true # 必須開啟,MinIO需要
 http_config:
  idle_conn_timeout: 90s
  response_header_timeout: 120s
 part_size: 5242880     # 5MB分片上傳
 signature_version2:false

關鍵的調優點:

http_config.idle_conn_timeout:默認90秒足夠,但長距離傳輸建議增加到120秒

part_size:默認128MB,MinIO推薦5MB以獲得更好的重試友好性

response_header_timeout:當對象存儲壓力高時,適當提高此值避免超時

5 查詢層分片:Receiver組件與Store網關

5.1 Thanos Receiver的引入背景

在標準Thanos架構中,Prometheus通過Sidecar直接將數據塊上傳到對象存儲。這種方式有一個固有問題:Prometheus的本地TSM塊每2小時生成一次,在這2小時內,Thanos Query無法看到最新采集的數據——因為數據還在Prometheus的內存緩沖區中,尚未寫入TSM文件并上傳。

Thanos Receiver解決了這個問題。它提供了一個Prometheus Remote Write的接收端,Prometheus可以通過remote_write接口將數據實時推送到Receiver,Receiver再將數據寫入本地TSM塊,并通過Sidecar邏輯將塊上傳到對象存儲。同時,Receiver本身也實現了Store API,Thanos Query可以實時查詢Receiver內存中的熱數據。

數據寫入兩條路徑:

路徑A(Sidecar實時上傳):
Prometheus → Sidecar → 對象存儲 → Store Gateway

路徑B(Remote Write熱數據):
Prometheus → Remote Write → Thanos Receiver → Query(實時)
               ↓
             對象存儲(異步)

路徑B的存在使得Query可以查詢到最近2小時內產生的數據,
解決了Sidecar模式的"數據可見性延遲"問題。

5.2 Receiver集群部署

Thanos Receiver以有狀態方式部署,因為需要維護本地的TSM存儲。每個Receiver實例應該配置--tsdb.path指向本地持久存儲,并建議使用SSD以保證寫入性能。

# thanos-receiver.yml 配置片段
type: receive
http:
 listen: 10902
grpc:
 listen: 10901
remote-write:
 timeout: 30s
 queue_config:
  capacity: 100000    # 隊列容量(樣本數)
  max_shards: 50     # 最大并發發送分片
  min_shards: 10     # 最小并發發送分片
  max_samples_per_send: 10000 # 每次發送最大樣本數
replication:
 factor: 2        # 復制因子(與Prometheus副本數對應)
labels:
 - name: cluster
  value: prod-cluster

千節點集群建議部署3個Receiver實例組成有狀態集群,配置replication.factor=2實現數據雙副本。對于寫入吞吐量的評估:假設每秒采集100萬時間序列,每個時間序列每15秒一個數據點,即每秒約6.7萬個數據點。每個數據點按200字節計算,寫入速率約13MB/s。3節點Receiver集群的聚合寫入能力約為50MB/s,足夠支撐當前的采集規模。

5.3 Store Gateway的緩存優化

Thanos Store Gateway是對象存儲的GRPC代理,負責將Thanos Query的請求轉換為對象存儲的API調用。由于對象存儲的訪問延遲遠高于本地磁盤(通常為10-100ms vs 亞毫秒),Store Gateway內置了兩種緩存機制來緩解這一問題:

元數據緩存(Metadata Cache):緩存對象存儲中數據塊的元信息(ULID、時間范圍、標簽集)。由于元數據數量有限但查詢頻繁,命中率可達90%以上。建議配置4GB緩存空間。

數據塊緩存(Chunk Cache):緩存從對象存儲讀取的數據塊內容。配置建議為16-32GB,對于SSD充足的服務器可以配置到64GB。數據塊緩存命中率直接影響高頻查詢的響應時間。

# Store Gateway啟動參數優化
thanos store 
 --data-dir=/var/lib/thanos/store 
 --grpc-address=0.0.0.0:10901 
 --http-address=0.0.0.0:10902 
 --objstore.config-file=s3.yaml 
 --index-cache.json-file=/var/lib/thanos/index-cache.json 
 --store.grpc.series.max-lookback=0 
 --store.lazy-streaming=true
 --experimental.enable-streamed-snaphot-chunking

--store.lazy-streaming=true啟用懶流模式,只在確實需要數據時才從對象存儲讀取,可以減少不必要的I/O操作。--experimental.enable-streamed-snaphot-chunking是2026年的新特性,以流式方式處理大型數據塊,減少內存峰值。

6 高可用與故障恢復機制

6.1 Prometheus高可用部署

千節點集群的Prometheus高可用方案通常采用雙副本+投票機制。兩個Prometheus實例并行采集相同目標,通過Thanos Sidecar寫入同一對象存儲路徑。Thanos Query在聚合結果時,通過replica標簽進行去重,保留其中一份數據。

高可用架構中的去重配置:

thanos query 
 --query.replica-labels=prometheus 
 --query.replica-labels=prometheus_replica

但雙副本模式存在一個隱患:裂腦問題。當兩個Prometheus實例與對象存儲的網絡連接質量差異較大時,可能出現數據不一致。更穩妥的方案是在Kubernetes中使用PodDisruptionBudget限制同時重啟的副本數量,并使用preStop鉤子確保優雅終止。

6.2 Store Gateway的可用性設計

Store Gateway本身是無狀態的,可以水平擴展。部署時應確保至少2個實例,并配置Kubernetes的PodAntiAffinity規則使其調度到不同節點。在Store Gateway實例全部不可用時,Thanos Query仍然可以通過Sidecar獲取實時數據(2小時內),但無法查詢歷史數據。

建議通過健康檢查腳本監控Store Gateway的可用性:

#!/bin/bash
# check_store_gateway.sh - Store Gateway健康檢查
STORAGE_IP="10.112.0.51"
STORAGE_PORT="10901"

# 檢查GRPC端口可達性
nc -zv$STORAGE_IP$STORAGE_PORT>/dev/null 2>&1
if[ $? -ne 0 ];then
 echo"CRITICAL: Store Gateway GRPC port unreachable"
 exit2
fi

# 檢查元數據緩存文件
CACHE_FILE="/var/lib/thanos/index-cache.json"
if[ ! -f"$CACHE_FILE"];then
 echo"WARNING: Index cache file missing"
fi

# 檢查對象存儲連接
OBJSTORE_CHECK=$(curl -s"http://${STORAGE_IP}:10902/-/healthy"||echo"FAIL")
if[["$OBJSTORE_CHECK"=="FAIL"]];then
 echo"CRITICAL: Object storage connection failed"
 exit2
fi

echo"OK: Store Gateway healthy"
exit0

6.3 Compactor故障與數據修復

Thanos Compactor是有狀態組件,且同一時間只能有一個實例運行(通過Kubernetes分布式鎖實現)。如果Compactor崩潰,可能導致對象存儲中的數據塊處于不一致狀態(如部分塊停留在pending路徑)。

手動修復的流程:

#!/bin/bash
# thanos-compact-repair.sh - Compactor修復腳本

OBJSTORE_BUCKET="thanos-data"
OBJSTORE_ENDPOINT="minio.cluster.local:9000"

# 1. 檢查不一致的塊
thanos tools bucket inspect 
 --objstore.config-file=s3.yaml 
 --min-time=2026-01-01T0000Z 
 --max-time=2026-03-30T0000Z

# 2. 驗證塊完整性
thanos tools bucket verify 
 --objstore.config-file=s3.yaml 
 --id=01H2B5GXYZ123D2ZZZZZZZZZZZZZZZZ

# 3. 如果需要,手動觸發壓縮(慎用)
thanos compact 
 --objstore.config-file=s3.yaml 
 --data-dir=/var/lib/thanos/compact 
 --consistency-delay=5m 
 --acceptMalformedIndex

Compactor的運行頻率建議配置為每小時執行一次,每次執行時間不應超過45分鐘。如果壓縮時間過長,說明數據量已超過單機處理能力,需要考慮分區方案:按時間范圍或按業務域將對象存儲的Bucket劃分為多個前綴,在Thanos Query層配置多個Store來分別代理不同前綴的數據。

7 容量規劃與資源配置

7.1 資源評估模型

千節點Kubernetes集群的Prometheus容量規劃,需要考慮以下幾個維度的數據量:

采集規模評估

基礎指標:
 - Kubernetes組件(apiserver、etcd、kubelet等):約200指標/實例
 - 每個Node:約150指標(CPU、內存、磁盤、網絡)
 - 每個Pod(以Nginx為例):約80指標
 - 服務網格Sidecar(Istio 2026):約500指標/Pod

假設:
 - 節點數:1000
 - 每節點Pod均值:10
 - Sidecar覆蓋率:80%
 - 服務網格Pod數:8000

總指標數計算:
 Node指標:1000 * 150 = 150,000
 Pod指標:10000 * 80 = 800,000
 Sidecar指標:8000 * 500 = 4,000,000
 K8s組件:20 * 200 = 4,000

 總計:約 4,954,000 個時間序列(考慮去重后)

注意:Istio 2026版本默認已對高基數指標做了過濾,
如果不使用Istio的詳細遙測(disableProducerMetrics),
每PodSidecar指標數可降至約200。

存儲容量評估

采集頻率:15秒(高優先級)/30秒(普通)/60秒(低優先級)
壓縮后塊大小:原始約1.5GB/塊(2小時)

30天原始數據存儲量:
 5M序列 * 86400/15秒 * 200字節 * 30天 = 約 1.7TB
 加上元數據、開銷,實際約 2.5TB

90天總存儲量(含降采樣):
 原始(0-30天):2.5TB
 5分鐘降采樣(30-90天):約 0.8TB
 1小時降采樣(90天以上):約 0.3TB

 總對象存儲容量:約 4TB(按3副本計,需約12TB物理存儲)

查詢層資源評估

Thanos Query(2實例):
 - CPU:16核/實例
 - 內存:32GB/實例
 - 原因:聚合計算密集型,需要大量CPU

Thanos Store Gateway(4實例):
 - CPU:8核/實例
 - 內存:64GB/實例(含數據塊緩存)
 - 磁盤:SSD 500GB(用于緩存)

Thanos Receiver(3實例):
 - CPU:8核/實例
 - 內存:16GB/實例
 - 磁盤:SSD 200GB

7.2 Kubernetes資源配額配置

# thanos-query-deployment.yaml
apiVersion:apps/v1
kind:Deployment
metadata:
name:thanos-query
namespace:monitoring
spec:
replicas:2
template:
 spec:
  containers:
  -name:thanos
   image:quay.io/thanos/thanos:v0.36.0
   args:
   -query
   ---query.replica-labels=prometheus
   ---query.replica-labels=prometheus_replica
   ---query.timeout=2m
   ---query.max-concurrent=20
   ---http-grace-period=5m
   resources:
    requests:
     cpu:"8"
     memory:"16Gi"
    limits:
     cpu:"16"
     memory:"32Gi"
   livenessProbe:
    httpGet:
     path:/-/healthy
     port:10902
    initialDelaySeconds:30
    periodSeconds:10
   readinessProbe:
    httpGet:
     path:/-/ready
     port:10902
    initialDelaySeconds:10
    periodSeconds:5

資源配額的關鍵調優點

--query.max-concurrent=20:控制最大并發查詢數。默認值是20,在查詢高峰期可能導致隊列堆積。提高到50可以減少查詢排隊延遲,但會增加內存壓力。

--http-grace-period=5m:在接收SIGTERM后保持服務運行5分鐘,以便完成正在進行的查詢。這對于避免在SRE查看圖表時突然斷連非常重要。

8 典型故障案例與排障流程

8.1 故障一:Thanos Query無法發現Store實例

癥狀:Thanos Query UI中看不到任何Store實例,查詢返回"no stores"錯誤。

排查流程

# Step 1: 檢查Query的Store API端點
curl -s http://thanos-query.monitoring:10902/api/v1/stores | jq

# 正常輸出應包含所有注冊的Store/Sidecar地址
# 如果返回空數組,說明服務發現有問題

# Step 2: 檢查DNS解析(Kubernetes環境)
kubectlexec-it thanos-query-0 -- nslookup stores.monitoring.svc.cluster.local

# Step 3: 檢查GRPC端口連通性
kubectlexec-it thanos-query-0 -- 
 nc -zv thanos-store-gateway.monitoring 10901

# Step 4: 檢查Store Gateway日志中的注冊錯誤
kubectl logs -n monitoring thanos-store-gateway-0 | grep -i"register|error|fail"

根因:最常見的原因是Store Gateway的--grpc-address與Query期望的地址不匹配。在Kubernetes環境中,如果Store Gateway使用ClusterIP Service暴露GRPC端口,Query通過DNS發現時可能解析到錯誤的IP。解決方案是使用Headless Service(無ClusterIP)配合publishNotReadyAddresses=true。

8.2 故障二:歷史數據查詢返回空結果

癥狀:查詢90天前的數據時,Query返回空結果,但近期數據正常。

排查流程

# Step 1: 檢查對象存儲中是否存在對應時間范圍的數據塊
thanos tools bucket ls 
 --objstore.config-file=s3.yaml 
 --min-time=2025-12-01T0000Z 
 --max-time=2025-12-31T2359Z

# Step 2: 檢查塊文件詳情
thanos tools bucket inspect 
 --objstore.config-file=s3.yaml 
 --id=01HXXXXXXXXXXXXXXXXXXXXXXXX

# Step 3: 檢查Compactor是否正常運行
kubectl get pods -n monitoring -l app=thanos-compact
kubectl logs -n monitoring thanos-compact-0 --tail=100 | grep -i"compaction|downsample"

# Step 4: 手動驗證Store Gateway能否訪問歷史數據
thanos tools bucket verify 
 --objstore.config-file=s3.yaml 
 --objstore-backlog-config=s3.yaml

根因:歷史數據丟失通常有三種可能:

Compactor從未運行過,數據停留在pending路徑,Store Gateway默認不讀取pending狀態的數據塊。需要手動執行thanos tools bucket relabel將pending塊遷移。

降采樣過程將原始數據刪除。Compactor在完成降采樣后會自動刪除原始塊以節省空間。如果降采樣規則配置過早(如5分鐘采樣從第7天就開始),則無法查到原始精度數據。這是設計層面的數據丟失,需要重新回填。

對象存儲的生命周期策略(Lifecycle Policy)誤刪了數據塊。某些S3兼容存儲默認配置了90天自動刪除規則,需要檢查并禁用。

8.3 故障三:Prometheus OOM但內存充足

癥狀:Prometheus進程被OOM Killer殺掉,但宿主機的可用內存還有很多。

排查流程

# 檢查Prometheus進程的內存使用趨勢
curl -s localhost:9090/metrics | grep 
 prometheus_tsdb_head_series

# 高基數告警指標
curl -s localhost:9090/metrics | grep 
 prometheus_tsdb_head_series | awk'{if($2>1000000) print $0}'

# 檢查外部標簽情況
curl -s localhost:9090/api/v1/label/__name__/values | 
 jq'.data | length'

# 查看各job的指標數量
forjobin$(curl -s localhost:9090/api/v1/status/tsdb | 
 jq -r'.data.seriesCountByMetricName[] | .name');do
 count=$(curl -s"localhost:9090/api/v1/label/${job}/values"| jq'.data | length')
echo"$job:$countseries"
done

根因:這是典型的"高基數標簽"問題。Prometheus 3.x(2026年主流版本)雖然對高基數處理有優化,但仍然存在內存上限。常見的高基數來源包括:Istio的詳細遙測指標(強烈建議在生產環境關閉istio-agent的部分指標)、帶有UUID的標簽、以及錯誤配置的服務發現(將IP地址作為標簽值導致高基數)。

修復方案

# prometheus-config.yaml 中限制采集指標的示例
scrape_configs:
-job_name:'istio-proxy'
 relabel_configs:
  # 過濾掉高基數的trace_id和user_id標簽
  -source_labels:[__name__]
   regex:'istio_request_duration_.*'
   action:keep
  # 規范化job名稱,避免動態生成
  -source_labels:[kubernetes_pod_name]
   target_label:pod
   replacement:'${1}'

9 最佳實踐清單

9.1 架構設計最佳實踐

原則一:先分區,后擴展。在引入Thanos之前,首先按業務域或集群對Prometheus進行分區。千節點規模不建議用單一全局Prometheus+Thanos架構,而是將數據按cluster、namespace、job進行邏輯分區。每個Thanos Query查詢范圍應盡量控制在單一存儲Bucket前綴內,以減少跨區查詢的延遲。

原則二:讀寫路徑分離。Prometheus的寫入路徑(采集+Remote Write)和Thanos Query的讀取路徑應使用獨立的Kubernetes Service和負載均衡策略。寫入路徑追求低延遲和穩定性,讀取路徑追求高吞吐和可擴展性。

原則三:引入Remote Write限流。在Prometheus 3.x中,remote_write配置支持capacity、max_shards等限流參數。在網絡波動或后端Receiver不可用時,Prometheus會自動啟用背壓(backpressure)機制。建議配置metadata_appended_timeout以避免元數據寫入阻塞。

remote_write:
-url:http://thanos-receiver.monitoring:10901/api/v1/receive
 name:thanos-receiver
 timeout:30s
 queue_config:
  capacity:100000
  max_shards:30
  min_shards:5
  max_samples_per_send:5000
  batch_send_deadline:30s
 metadata_config:
  send:true
  send_interval:1m
  timeout:10s

9.2 運維最佳實踐

備份與恢復:Thanos對象存儲的數據應配置跨區域復制(CRR)以實現異地容災。對于S3,可配置跨可用區復制;使用MinIO時,可部署雙活數據中心。

監控Thanos本身:監控系統的監控系統本身是運維中的經典"自舉"問題。建議為Thanos組件單獨部署一套最小化的Prometheus實例,專門監控Thanos的GRPC延遲、對象存儲操作耗時、隊列深度等關鍵指標。

# thanos自身監控指標(關鍵)
-prometheus_sd_gossip_nodes_discovered
-thanos_objstore_bucket_operation_duration_seconds
-thanos_store_series_bits_per_query
-thanos_receive_write_rate
-thanos_compact_run_duration_seconds

保留策略設計:建議采用三層保留策略以平衡存儲成本與查詢精度:

0-15天:原始精度(15秒),全量保留

15-90天:5分鐘降采樣,保留核心指標

90天以上:1小時降采樣,僅保留服務可用性相關指標(如up、http_requests_total等)

9.3 性能優化最佳實踐

查詢性能優化:對于PromQL中經常使用的聚合查詢,建議在Thanos Ruler中配置預計算錄制規則(Recording Rules),將計算結果作為新的時間序列存儲。這可以將復雜聚合查詢的響應時間從秒級降低到毫秒級。

groups:
-name:recording_rules
 interval:1m
 rules:
  -record:jobsum5m
   expr:sumby(job,service)(rate(http_requests_total[5m]))
  -record:job5m
   expr:histogram_quantile(0.99,sumby(job,le)(rate(http_request_duration_seconds_bucket[5m])))

標簽管理:嚴格控制外部標簽(external_labels)的數量。建議不超過5個,每個標簽的基數不超過100。外部標簽在所有查詢結果中都會出現,過多或過高基數的外部標簽會顯著增加數據傳輸量。

10 證據鏈與結論

本文系統闡述了千節點Prometheus集群的橫向擴展架構設計。核心證據鏈如下:

存儲瓶頸證據:單機Prometheus在千節點規模下,500GB+數據量導致90分位查詢延遲從毫秒級退化到秒級,OOM頻率增加。這一現象在多個生產環境案例中得到驗證,是Prometheus分布式化的直接驅動力。

Thanos架構有效性證據:Thanos的Sidecar-Query-Store分離架構,通過異步上傳、GRPC并行查詢、對象存儲持久化三重機制,實現了采集、存儲、查詢的完全解耦。Thanos Query的線性擴展能力(每增加一個Query實例,查詢吞吐量約增加40%)已在 Grafana開源社區的生產案例中被廣泛驗證。

降采樣必要性證據:對比測試顯示,對30天歷史數據查詢,使用原始精度時平均響應時間30秒,使用1小時降采樣后降低到300毫秒,同時降采樣數據占用空間僅為原始數據的約1/1000。降采樣是平衡查詢性能與存儲成本的關鍵杠桿。

高可用設計有效性證據:雙副本Prometheus+Thanos Query去重機制,配合對象存儲的CRR異地復制,可在單數據中心完全故障時保證監控數據不丟失、RTO(恢復時間目標)小于1小時。

千節點Prometheus集群的橫向擴展不是單一組件的優化,而是一套涵蓋數據采集、傳輸、存儲、查詢全鏈路的系統工程。正確評估數據規模、合理規劃分區策略、配置與業務匹配的數據保留規則,是這一工程成功的三個支柱。Thanos生態的成熟使得2026年的運維團隊可以在不修改應用代碼的前提下,實現與商業APM產品相當的監控能力,同時保持對底層數據的完全所有權和可控性。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4853

    瀏覽量

    90208
  • 集群
    +關注

    關注

    0

    文章

    149

    瀏覽量

    17681
  • kubernetes
    +關注

    關注

    0

    文章

    270

    瀏覽量

    9521

原文標題:Prometheus千節點集群的橫向擴展實踐

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    IEEE-14節點網絡。。。。

    請問IEEE-14節點網絡里,支路的額定電壓和額定電流的單位是什么?謝謝謝謝!
    發表于 05-17 10:48

    NI儀器WSN-3214節點的作用??!!

    請問有哪位大哥大姐大神知道NI儀器WSN-3214節點如何接線和各借口代表什么意思(各接口的作用)??!!
    發表于 03-29 13:57

    請問24l01節點會自動連接主機嗎?

    24l01節點會自動連接主機
    發表于 06-01 15:53

    prometheus做監控服務的整個流程介紹

    最近有個新項目需要搞一套完整的監控告警系統,我們使用了開源監控告警系統Prometheus;其功能強大,可以很方便對其進行擴展,并且可以安裝和使用簡單;本文首先介紹Prometheus的整個監控流程
    發表于 12-23 17:34

    典型系統IEEE3機9節點電力系統

    典型系統IEEE3機9節點電力系統
    發表于 01-23 14:24 ?54次下載

    確保數據零丟失!阿里云數據庫RDS for MySQL 三節點企業版正式商用

    認為已經達成集群一致,數據狀態機也只會應用已達成多數派的日志,故三節點能夠保證數據強一致,任何一個節點的不可用不會影響到集群達成一致性的決定。另外,在技術上將第三
    發表于 11-14 23:06 ?759次閱讀

    prometheus下載安裝教程

    Prometheus 是一個開放性的監控解決方案,用戶可以非常方便的安裝和使用 Prometheus 并且能夠非常方便的對其進行擴展。 在Prometheus的架構設計中,
    的頭像 發表于 01-13 16:07 ?9946次閱讀
    <b class='flag-5'>prometheus</b>下載安裝教程

    SMT 4節點智能家居自動化PCB

    電子發燒友網站提供《SMT 4節點智能家居自動化PCB.zip》資料免費下載
    發表于 06-26 10:49 ?1次下載
    SMT 4<b class='flag-5'>節點</b>智能家居自動化PCB

    Kubernetes集群中如何選擇工作節點

    簡要概述: 本文討論了在Kubernetes集群中選擇較少數量的較大節點和選擇較多數量的較小節點之間的利弊。
    的頭像 發表于 08-28 15:46 ?1392次閱讀
    Kubernetes<b class='flag-5'>集群</b>中如何選擇工作<b class='flag-5'>節點</b>

    浪潮信息推出全球首個單存儲即可支持16節點的SAP HANA集群方案

    近日,浪潮信息成功實現并推出全球首個單存儲即可支持16節點的SAP HANA集群方案,全閃存儲HF5000系列作為該方案的數據存儲底座,助力以最優的性能和成本為企業創建大規模、易擴展、高穩定的業務數據處理能力。
    的頭像 發表于 04-01 10:03 ?1109次閱讀

    摩爾線程、無問芯穹合作完成國產全功能GPU集群

    據介紹,此項訓練歷時13.2天,過程穩定而有序,集群整體運行穩定性達到了100%。相較于單機訓練,集群擴展效率提升了超過90%。
    的頭像 發表于 05-27 14:40 ?1441次閱讀

    從零入門Prometheus:構建企業級監控與報警系統的最佳實踐指南

    測試環境 prometheus-2.26.0.linux-amd64.tar.gz下載地址:https://github.com/prometheus/prometheus/releases
    的頭像 發表于 02-10 11:28 ?1369次閱讀
    從零入門<b class='flag-5'>Prometheus</b>:構建企業級監控與報警系統的最佳<b class='flag-5'>實踐</b>指南

    詳解Prometheus的數據類型

    對于 Prometheus 生態的監控系統,PromQL 是必備技能,本文著重點講解這個查詢語言,摻雜一些生產實踐場景,希望對你有所幫助。
    的頭像 發表于 05-13 09:50 ?1553次閱讀
    詳解<b class='flag-5'>Prometheus</b>的數據類型

    Redis集群部署配置詳解

    Redis集群是一種分布式Redis解決方案,通過數據分片和主從復制實現高可用性和橫向擴展集群將整個數據集分割成16384個哈希槽(hash slots),每個
    的頭像 發表于 07-17 11:04 ?1114次閱讀

    使用VictoriaMetrics的Prometheus遠程存儲方案

    Prometheus單機存儲在生產環境跑到一定規模就會碰壁——單節點磁盤容量有限,TSDB默認保留15天數據,想存半年以上的監控數據基本不現實。更麻煩的是Prometheus沒有原生的高可用方案
    的頭像 發表于 02-26 16:30 ?292次閱讀