Thanos解碼:打造企業級雲原生監控解決方案

techlead_krischang發表於2024-06-19

本文深入探討了Thanos技術在雲原生監控領域的應用,詳細介紹了Thanos的基本概念、核心元件、安裝配置步驟以及一個實戰案例,幫助讀者理解如何利用Thanos解決大規模監控資料的儲存、查詢和高可用性問題。

關注作者,分享網際網路架構、雲服務技術的全維度知識。作者擁有10+年網際網路服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智慧實驗室成員,阿里雲認證的資深架構師,專案管理專業人士,上億營收AI產品研發負責人

file

一、Thanos簡介

Thanos是一個開源專案,旨在透過一種可擴充套件且可靠的方式為Prometheus提供跨叢集的監控資料聚合、查詢和長期儲存功能。它解決了Prometheus在大規模環境下遇到的一些核心問題,比如資料的長期儲存、監控資料的全域性檢視和高可用性。Thanos將雲原生監控的概念推向了新的高度,為企業提供了一種強大且靈活的監控解決方案。

Thanos的起源和目標

Thanos誕生於Prometheus社群,其核心目標是彌補Prometheus在長期資料儲存和跨叢集監控方面的不足。隨著雲原生應用的快速發展,企業越來越需要一個能夠處理大量監控資料、提供準確可靠監控資訊的系統。Thanos應運而生,它不僅保留了Prometheus的優點,如簡單的部署過程、豐富的指標和靈活的查詢語言,還透過引入新的元件和架構設計,大幅提升了系統的可擴充套件性和可靠性。

雲原生監控的挑戰

雲原生環境的動態性和分散式特性為監控系統帶來了新的挑戰,包括:

  • 資料氾濫:大規模叢集產生的監控資料量巨大,傳統監控系統難以高效處理。
  • 永續性與可靠性:監控資料需要長期儲存以供分析和審計,要求監控系統具備可靠的資料持久化能力。
  • 全域性視角:雲原生應用通常跨多個叢集和地域,需要一個統一的視角來觀察和管理這些分散的資源。
  • 高可用性:監控系統自身也需要保證高可用,以確保監控服務的持續性。

Thanos與Prometheus的關係

Thanos建立在Prometheus之上,它透過引入幾個關鍵元件擴充套件了Prometheus的能力:

  • 側車(Sidecar):部署在Prometheus伺服器旁邊,用於實現資料的實時上傳以及對歷史資料的訪問。
  • 查詢元件(Querier):提供了一個全域性查詢檢視,能夠跨多個Prometheus例項和Thanos Store進行資料查詢。
  • 儲存閘道器(Store Gateway):使Thanos能夠訪問長期儲存的歷史資料。
  • 編譯器(Compactor):最佳化儲存空間,透過壓縮和去重提高查詢效率。

透過這些元件,Thanos不僅提供了Prometheus的所有功能,還增加了多個實用的特性,如資料壓縮、去重、長期儲存、高可用性等,使得Thanos成為了處理雲原生監控資料的理想選擇。

二、Thanos元件概覽

file
Thanos設計為一個高度模組化和可擴充套件的系統,透過多個互相協作的元件提供其功能。這些元件共同工作,以解決大規模監控資料的長期儲存、高可用性和全域性查詢等問題。以下是Thanos主要元件的概覽及其詳細描述。

查詢元件(Querier)

Querier是Thanos中負責處理查詢請求的元件。它可以從多個資料來源(如Thanos Sidecars、Store Gateways、和Thanos Receivers)查詢資料,實現了對多個Prometheus例項資料的透明訪問。Querier的關鍵功能是提供一個全域性檢視,無論監控資料儲存在何處,使用者都可以透過單一的查詢介面獲取資訊。此外,Querier還支援對查詢結果進行去重,確保即使在高可用性部署場景中,相同指標的資料不會被重複計算。

儲存閘道器(Store Gateway)

Store Gateway元件使Thanos能夠接入長期儲存解決方案,如Amazon S3、Google Cloud Storage等,訪問歷史監控資料。它對外提供與Prometheus相容的API介面,讓Querier能夠透明地查詢這些長期儲存中的資料。Store Gateway透過對儲存在物件儲存中的資料塊進行索引,實現了高效的資料訪問,同時還支援對資料進行壓縮和分片,以最佳化儲存空間和查詢效能。

接收器(Receiver)

Receiver元件主要負責接收來自Prometheus的監控資料,並將其寫入到長期儲存中。它支援接收Prometheus遠端寫入協議的資料,可以作為一個集中式的資料接收點,彙總來自多個叢集的監控資料。Receiver透過實現資料的多副本儲存,增強了監控資料的可靠性。此外,Receiver還可以與Thanos Querier結合使用,提供實時監控資料的查詢功能。

編譯器(Compactor)

Compactor是Thanos中負責處理監控資料壓縮和最佳化的元件。它定期對儲存在物件儲存中的資料塊進行壓縮,合併重複的時間序列資料,減少儲存佔用並提高查詢效率。Compactor還負責清理過期的監控資料,實現監控資料的生命週期管理。透過資料去重和壓縮,Compactor顯著降低了長期儲存成本,同時保持了查詢效能。

側車(Sidecar)

Sidecar元件部署在每個Prometheus伺服器旁邊,負責實時同步監控資料到物件儲存,以實現資料的長期儲存。同時,Sidecar還提供了一個查詢代理功能,使Querier能夠透過它查詢Prometheus的實時資料。Sidecar確保了資料的即時可用性和完整性,同時降低了對Prometheus伺服器的直接訪問需求。

規則器(Ruler)

Ruler元件提供了基於時間序列資料的警報規則和資料聚合規則的評估功能。它允許使用者定義複雜的查詢並在滿足特定條件時觸發警報。Ruler與Prometheus的規則引擎非常相似,但它可以跨多個Prometheus例項和Thanos元件工作,提供全域性的規則評估能力。

透過這些元件的配合使用,Thanos解決了監控資料的長期儲存、全域性查詢、高可用性和規模擴充套件等多個方面的挑戰,為構建大規模、可靠的監控系統提供了強有力的支援。

三、Thanos的安裝與配置

Thanos的安裝和配置是一個靈活的過程,依賴於特定的執行環境和需求。以下是一個通用的步驟指南,旨在幫助您開始使用Thanos。本指南假設您已經有一個或多個執行Prometheus的環境,並希望透過Thanos擴充套件其功能。

環境準備

  1. Prometheus環境:確保您有一個或多個執行中的Prometheus例項。Thanos將與這些例項配合工作,提供長期儲存和全域性查詢能力。
  2. 物件儲存:選擇一個物件儲存解決方案(如Amazon S3、Google Cloud Storage、或其他相容S3的儲存)。Thanos將使用這個儲存作為長期資料儲存。
  3. Kubernetes叢集(可選):如果您打算在Kubernetes環境中部署Thanos,需要準備一個Kubernetes叢集。

使用Docker部署Thanos

以下是使用Docker快速部署Thanos的基本步驟,這適用於想要進行快速試驗和開發的場景。

  1. 部署Thanos Sidecar:對於每個Prometheus例項,部署一個Thanos Sidecar。這可以透過在Prometheus例項旁邊執行Thanos Sidecar容器實現。

    docker run -d --net=host --name thanos-sidecar \
      -v /path/to/prometheus/data:/prometheus \
      -v /path/to/thanos/config.yaml:/etc/thanos/config.yaml \
      quay.io/thanos/thanos:v0.23.0 \
      sidecar \
        --prometheus.url=http://localhost:9090 \
        --objstore.config-file=/etc/thanos/config.yaml
    
  2. 部署Thanos Querier:Thanos Querier負責查詢資料。您可以執行一個Querier例項來提供全域性查詢檢視。

    docker run -d --net=host --name thanos-querier \
      quay.io/thanos/thanos:v0.23.0 \
      query \
        --http-address=0.0.0.0:9090 \
        --query.replica-label=prometheus_replica \
        --store=<Sidecar-IP>:<gRPC-Port>
    

在這兩個命令中,您需要根據實際環境替換/path/to/prometheus/data/path/to/thanos/config.yamllocalhost:9090<Sidecar-IP><gRPC-Port>等佔位符。

Kubernetes環境下的Thanos部署

在Kubernetes環境中,您可以使用Helm或者直接使用YAML檔案部署Thanos。

  1. 部署Thanos Sidecar:將Thanos Sidecar配置為Prometheus的sidecar容器。這通常透過修改Prometheus的Deployment或StatefulSet配置實現。

    示例YAML配置片段:

    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:v2.22.0
        # Prometheus配置省略...
      - name: thanos-sidecar
        image: quay.io/thanos/thanos:v0.23.0
        args:
        - sidecar
        - --prometheus.url=http://localhost:9090
        - --objstore.config-file=/etc/thanos/config.yaml
        volumeMounts:
        - name: thanos-config
          mountPath: /etc/thanos
        - name: prometheus-data
          mountPath: /prometheus
    volumes:
    - name: thanos-config
      configMap:
        name: thanos-config
    - name: prometheus-data
      emptyDir: {}
    
  2. 配置物件儲存:建立一個ConfigMap包含您的物件儲存配置。

    示例ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: thanos-config
    data:
      config.yaml: |
        type: S3
        config:
          bucket: my-thanos-bucket
         
    
    

endpoint: s3.amazonaws.com
access_key:
secret_key:


3. **部署Thanos Querier**:部署Querier以提供全域性查詢能力。

示例Deployment YAML配置:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: thanos-querier
spec:
  replicas: 1
  selector:
    matchLabels:
      app: thanos-querier
  template:
    metadata:
      labels:
        app: thanos-querier
    spec:
      containers:
      - name: thanos-querier
        image: quay.io/thanos/thanos:v0.23.0
        args:
        - query
        - --http-address=0.0.0.0:9090
        - --store=<Sidecar-Service-Name>:<gRPC-Port>

確保在配置時根據您的環境替換相應的引數。以上步驟提供了一個Thanos基礎部署的大致框架,但在實際部署時可能需要根據具體環境進行調整。

四、Thanos實戰案例

本案例將詳細描述在一家大型電子商務公司中,如何使用Thanos來解決其監控系統在面對大規模資料、多叢集環境下的挑戰。該公司擁有多個Kubernetes叢集分佈在全球不同地區,每個叢集都部署了Prometheus來收集監控資料,但隨著業務的快速發展,原有監控系統面臨以下挑戰:

  • 資料孤島:不同叢集的監控資料相互隔離,無法實現全域性檢視。
  • 資料永續性:Prometheus的本地儲存能力受限,難以滿足長期儲存需求。
  • 高可用性:需要確保監控資料的可靠性和服務的穩定性。

為了解決上述問題,公司決定引入Thanos來增強其監控系統。以下是具體實施步驟和細節。

步驟1:規劃Thanos架構

首先,公司進行了詳細的架構規劃,決定採用Thanos Sidecar、Thanos Querier、Thanos Store Gateway和Thanos Compactor等元件,結合Amazon S3作為長期儲存解決方案。規劃結果如下:

  • 在每個Prometheus例項旁部署Thanos Sidecar,實現實時資料的上傳和查詢。
  • 部署一個全域性Thanos Querier來提供跨叢集的資料查詢能力。
  • 利用Amazon S3作為長期資料儲存,透過Thanos Store Gateway對歷史資料進行訪問。
  • 部署Thanos Compactor對儲存在S3中的資料進行壓縮和最佳化。

步驟2:部署Thanos元件

部署Thanos Sidecar

在每個叢集的Prometheus旁部署Thanos Sidecar。Sidecar配置了對Amazon S3的訪問,實現資料的實時同步。

# Prometheus部署配置檔案示例片段
containers:
- name: prometheus
  image: prom/prometheus:v2.22.0
  # Prometheus配置省略...
- name: thanos-sidecar
  image: quay.io/thanos/thanos:v0.23.0
  args:
  - sidecar
  - --objstore.config=type: S3
    config:
      bucket: <bucket-name>
      endpoint: s3.amazonaws.com
      access_key: <access-key>
      secret_key: <secret-key>

部署Thanos Querier

公司在一箇中心區域部署了Thanos Querier,配置了所有Sidecar的地址,提供全域性查詢能力。

部署Thanos Store Gateway

Thanos Store Gateway部署在同一中心區域,配置了對Amazon S3的訪問,提供對歷史資料的查詢。

部署Thanos Compactor

Thanos Compactor也部署在中心區域,對儲存在Amazon S3中的資料進行定期壓縮和最佳化。

步驟3:驗證和最佳化

部署完成後,公司進行了一系列的測試和驗證,確保資料的準確性、查詢的響應時間以及系統的穩定性都達到預期。隨後,根據測試結果對查詢效能進行了最佳化,包括調整查詢快取策略、最佳化PromQL查詢語句等。

成果

透過引入Thanos,公司成功解決了監控系統面臨的挑戰,實現了以下成果:

  • 全域性檢視:實現了跨叢集、跨地域的全域性監控資料查詢。
  • 長期資料儲存:透過Amazon S3實現了監控資料的長期儲存,滿足歷史資料分析的需求。
  • 高可用性:確保了監控系統的高可用性和資料的可靠性。

如有幫助,請多關注
TeahLead KrisChang,10+年的網際網路和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿里雲認證雲服務資深架構師,上億營收AI產品業務負責人。

相關文章