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的自定義監控項是一個道理。