Prometheus的架構及持久化

Prometheus是什麼

Prometheus是一個開源的系統監控和報警工具,特色是php

  • 多維數據模型(時序列數據由metric名和一組key/value組成)java

  • 在多維度上靈活的查詢語言(PromQl)node

  • 不依賴分佈式存儲,單主節點工做.python

  • 經過基於HTTP的pull方式採集時序數據git

  • 能夠經過push gateway進行時序列數據推送(pushing)github

  • 能夠經過服務發現或者靜態配置去獲取要採集的目標服務器docker

  • 多種可視化圖表及儀表盤支持數據庫

pull方式

Prometheus採集數據是用的pull也就是拉模型,經過HTTP協議去採集指標,只要應用系統可以提供HTTP接口就能夠接入監控系統,相比於私有協議或二進制協議來講開發、簡單。緩存

push方式

對於定時任務這種短週期的指標採集,若是採用pull模式,可能形成任務結束了,Prometheus尚未來得及採集,這個時候可使用加一箇中轉層,客戶端推數據到Push Gateway緩存一下,由Prometheus從push gateway pull指標過來。(須要額外搭建Push Gateway,同時須要新增job去從gateway採數據)ruby

組成及架構

  • Prometheus server
    主要負責數據採集和存儲,提供PromQL查詢語言的支持

  • 客戶端sdk
    官方提供的客戶端類庫有go、java、scala、python、ruby,其餘還有不少第三方開發的類庫,支持nodejs、php、erlang等

  • Push Gateway
    支持臨時性Job主動推送指標的中間網關

  • PromDash
    使用rails開發的dashboard,用於可視化指標數據

  • exporters
    支持其餘數據源的指標導入到Prometheus,支持數據庫、硬件、消息中間件、存儲系統、http服務器、jmx等

  • alertmanager
    實驗性組件、用來進行報警

  • prometheus_cli
    命令行工具

  • 其餘輔助性工具

架構圖以下:

prometheus Architecture overview

默認配置

docker exec -it a9bd827a1d18 less /etc/prometheus/prometheus.yml

獲得

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']
  • scrape_interval
    這裏是指每隔15秒鐘去抓取數據(這裏)

  • evaluation_interval
    指的是計算rule的間隔

Push Gateway

pushgateway有單獨的鏡像

docker pull prom/pushgateway

對於喜歡用push模式的應用來講,能夠專門搭建一個push gateway,來適配一下。

storage

prometheus使用了G家的LevelDB來作索引(PromSQL重度依賴LevelDB),對於大量的採樣數據有本身的存儲層,Prometheus爲每一個時序數據建立一個本地文件,以1024byte大小的chunk來組織。

磁盤文件

Prometheus在storage.local.path指定的路徑存儲文件,默認爲./data。關於chunk編碼有三種

  • type 0

第一代的編碼格式,simple delta encoding

  • type 1

目前默認的編碼格式,double-delta encoding

  • type 2

variable bit-width encoding,facebook的時間序列數據庫Beringei採用的編碼方式

內存使用

prometheus在內存裏保存了最近使用的chunks,具體chunks的最大個數能夠經過storage.local.memory-chunks來設定,默認值爲1048576,即1048576個chunk,大小爲1G。
除了採用的數據,prometheus還須要對數據進行各類運算,所以總體內存開銷確定會比配置的local.memory-chunks大小要來的大,所以官方建議要預留3倍的local.memory-chunks的內存大小。

As a rule of thumb, you should have at least three times more RAM available than needed by the memory chunks alone

能夠經過server的metrics去查看prometheus_local_storage_memory_chunks以及process_resident_memory_byte兩個指標值。

  • prometheus_local_storage_memory_chunks

The current number of chunks in memory, excluding cloned chunks
目前內存中暴露的chunks的個數

  • process_resident_memory_byte

Resident memory size in bytes
駐存在內存的數據大小

  • prometheus_local_storage_persistence_urgency_score
    介於0-1之間,當該值小於等於0.7時,prometheus離開rushed模式。

當大於0.8的時候,進入rushed模式

  • prometheus_local_storage_rushed_mode
    1表示進入了rushed mode,0表示沒有。進入了rushed模式的話,prometheus會利用storage.local.series-sync-strategy以及storage.local.checkpoint-interval的配置加速chunks的持久化。

storage參數

docker run -p 9090:9090 \
-v /tmp/prometheus-data:/prometheus-data \
prom/prometheus \
-storage.local.retention 168h0m0s \
-storage.local.max-chunks-to-persist 3024288 \
-storage.local.memory-chunks=50502740 \
-storage.local.num-fingerprint-mutexes=300960

storage.local.memory-chunks

設定prometheus內存中保留的chunks的最大個數,默認爲1048576,即爲1G大小

storage.local.retention

用來配置採用數據存儲的時間,168h0m0s即爲24*7小時,即1周

storage.local.series-file-shrink-ratio

用來控制序列文件rewrite的時機,默認是在10%的chunks被移除的時候進行rewrite,若是磁盤空間夠大,不想頻繁rewrite,能夠提高該值,好比0.3,即30%的chunks被移除的時候才觸發rewrite。

storage.local.max-chunks-to-persist

該參數控制等待寫入磁盤的chunks的最大個數,若是超過這個數,Prometheus會限制採樣的速率,直到這個數降到指定閾值的95%。建議這個值設定爲storage.local.memory-chunks的50%。Prometheus會盡力加速存儲速度,以免限流這種狀況的發送。

storage.local.num-fingerprint-mutexes

當prometheus server端在進行checkpoint操做或者處理開銷較大的查詢的時候,採集指標的操做會有短暫的停頓,這是由於prometheus給時間序列分配的mutexes可能不夠用,能夠經過這個指標來增大預分配的mutexes,有時候能夠設置到上萬個。

storage.local.series-sync-strategy

控制寫入數據以後,什麼時候同步到磁盤,有'never', 'always', 'adaptive'. 同步操做能夠下降由於操做系統崩潰帶來數據丟失,可是會下降寫入數據的性能。
默認爲adaptive的策略,即不會寫完數據就馬上同步磁盤,會利用操做系統的page cache來批量同步。

storage.local.checkpoint-interval

進行checkpoint的時間間隔,即對還沒有寫入到磁盤的內存chunks執行checkpoint操做。

doc

相關文章
相關標籤/搜索