Prometheus學習筆記(1)Prometheus架構簡介


Prometheus簡介和架構

Prometheus 是由 SoundCloud 開源監控告警解決方案。架構圖如下:

如上圖,Prometheus主要由以下部分組成:

  • Prometheus Server:用於抓取和存儲時間序列化數據
  • Exporters:主動拉取數據的插件
  • Pushgateway:被動拉取數據的插件
  • Altermanager:告警發送模塊
  • Prometheus web UI:界面化,也包含結合Grafana進行數據展示或告警發送

prometheus本身是一個以進程方式啟動,之后以多進程和多線程實現監控數據收集、計算、查詢、更新、存儲的這樣一個C/S模型運行模式。了解以下疑問信息

1、Prometheus是如何存儲數據的???

prometheus采用time-series(時間序列)方式,存儲在本地硬盤

  • prometheus本地T-S數據庫以每2小時間隔來分block(塊)存儲,每個塊又分為多個chunk文件,chunk文件用來存放采集的數據的T-S(time-series)數據,metadata和索引文件;

  • index文件是對metrics和labels進行索引之后存儲在chunk中,chunk是作為基本存儲單位,index和metadata作為子集;

  • prometheus平時采集到的數據先存放在內存之中,對內存消耗大,以緩存的方式可以加快搜索和訪問;

  • 在prometheus宕機時,prometheus有一種保護機制WAL,可以將數據定期存入硬盤中以chunk來表示,在重新啟動時,可以恢復進內存當中。

  • 當通過API刪除序列時,刪除的記錄存儲在單獨的tombstone文件中(而不是立即從塊文件中刪除數據)。

如下,是在進行數據收集后,在Prometheus中的data目錄的數據

[root@prometheus prometheus]# tree data/
data/
├── 01DVRSS47GBRWVCH50GEXXHBQ5
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── 01DVS0MVFHDN6ZS0R0Z3YR94VM
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── 01DVS0MVMFEAAYQSNYHPV86E5T
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── 01DVS7GJQT4GQBHBMX20V9JW4H
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── lock
├── queries.active
└── wal
    ├── 00000012
    ├── 00000013
    ├── 00000014
    ├── 00000015
    └── checkpoint.000011
        └── 00000000

這里需要注意的是,本地存儲的一個限制是它不是集群的或可復制的。因此,在磁盤或節點宕機時,它也不是任意可伸縮或持久的,對於磁盤可用性,建議使用RAID、備份快照、容量規划等,以提高持久性。應該通過適當的存儲持久性和計划在本地存儲中存儲多年的數據。

2、prometheus集成的服務發現功能???

prometheus是通過Consul做的服務發現,和其他開源軟件類似,prometheus也是通過配置文件來指定需要監控的項目和被監控的節點。如下面的配置模板:

[root@prometheus ~]# cat /usr/local/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).

  external_labels:
    monitor: 'codelab-monitor'

# Alertmanager configuration

alerting:
  alertmanagers:

- static_configs:

  - targets:

    # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.

rule_files:

# - "first_rules.yml"

# - "second_rules.yml"

# 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'
  scrape_interval: 5s

  # metrics_path defaults to '/metrics'

  # scheme defaults to 'http'.

  static_configs:

  - targets: ['localhost:9090']

3、Prometheus數據采集的方式???

prometheus客戶端主要由2種數據采集的方式:

  • pull:主動拉取形式
  • push:被動推送的形式

pull:指的是客戶端(被監控主機)先安裝各類已有的exporters在系統上,exporters以守護進程的模式運行,並開始采集數據,exporters本身也是一個http_server,可以對http請求作出響應,並返回K/V數據,也就是metrics。prometheus通過用pull的方式(HTTP_GET)去訪問每個節點上的exporter並采集回需要的數據。

push:指的是客戶端(或服務端)安裝官方的pushgateway插件,然后通過我們自行編寫的各種腳本,將監控數據組織成K/V的形式(metrics形式)發送給pushgateway,而后pushgateway再推送給prometheus,這里需要注意的是pushgateway不一定要安裝在被監控端,也可以安裝在服務端,甚至是一台不相關的主機上,換句話來說,它只是一個中間轉發的媒介。

4、Prometheus如何實現告警???

Prometheus有自帶的altermanager模塊,配合商業化的pageduty可以實現告警和郵件的發送功能,但是由於該功能模塊在國內結合pageduty使用是一件很頭疼的事,你懂的。所以一般是將Prometheus的數據集成在Grafana進行展示並進行告警配置。

5、什么是metrics???

一組K/V數據就是metrics,總體上來說metrics是對采集過來的數據的一種統稱,並非一個具體的數值或指標。

6、metrics的類型???

  • Gauges:最簡單的度量指標,只有一個簡單的返回值,或者叫做瞬時狀態,比如要采集硬盤容量或內存使用率,就可以用gauges的metrics格式來度量。因為硬盤和內存是隨着時間推移不斷地變化,沒有規則的變化,當前是多少,采集回來的就是多少,既不能肯定是一直持續增長,也不能肯定是一直降低,是多少就是多少,這種就是Gauges使用類型的代表。

  • Counters:Counters就是計數器,從數據量0開始累積計算,理想狀態下,只能是永遠的增長,絕不會出現降低,比如用戶的訪問量采樣數據,我們的產品被用戶訪問了一次就是1,過了10分鍾后積累到100,過了1天就累積到20000。

  • Histograms:柱狀圖,用於觀察結果采樣,分組及統計,如:請求持續時間,響應大小。其主要用於表示一段時間內對數據的采樣,並能夠對其指定區間及總數進行統計。根據統計區間計算。

  • Summary:類似Histogram,用於表示一段時間內數據采樣結果,其直接存儲quantile數據,而不是根據統計區間計算出來的。不需要計算,直接存儲結果。

7、什么是node-exporter???

Prometheus為了支持各種中間件以及第三方的監控提供了exporter,大家可以把它理解成監控適配器,將不同指標類型和格式的數據統一轉化為Prometheus能夠識別的指標類型。

譬如Node exporter主要通過讀取Linux的/proc以及/sys目錄下的系統文件獲取操作系統運行狀態,reids exporter通過Reids命令行獲取指標,mysql exporter通過讀取數據庫監控表獲取MySQL的性能數據。他們將這些異構的數據轉化為標准的Prometheus格式,並提供HTTP查詢接口。

8、什么是pushgateway???

通過node-exporter可以收集到各種服務器的相關性指標,但是並沒有辦法滿足我們的定制化需求,比如需要監控某個進程數,某個進程打開的文件數,某個進程消耗的內存等等,這就需要一個定制化的監控項,類似於zabbix的自定義監控項是一個道理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM