InfluxDB
簡介
什么是 InfluxDB ?
-
InfluxDB 是一個由 InfluxData 開發的,開源的時序型數據庫。它由 Go 語言寫成,着力於高性能地查詢與存儲時序型數據。
-
InfluxDB 被廣泛應用於存儲系統的監控數據、IoT 行業的實時數據等場景。
-
可配合 Telegraf 服務(Telegraf 可以監控系統 CPU、內存、網絡等數據)。
-
可配合 Grafana 服務(數據展現的圖像界面,將 InfluxDB 中的數據可視化)。
什么是時序數據?
時間序列數據(TimeSeries Data):按照時間順序記錄系統、設備狀態變化的數據被稱為時序數據。其應用場景很多,如:
- 無人駕駛車輛運行中要記錄的經度、緯度、速度、方向、旁邊的距離等。
- 某一地區的各車輛的行駛軌跡數據。
- 傳統證券行業實時交易數據。
- 實時運維監控數據等。
時序數據特點:
- 性能好:關系型數據庫對於大規模數據的處理性能糟糕,而 NoSQL 可以比較好地處理大規模數據,但依然比不上時間序列數據庫。
- 存儲成本低:高效的壓縮算法,節省存儲空間,有效降低 I/O 。
數據存儲結構
與 MySQL 的基礎概念對比:
概念 | MySQL | InfluxDB |
---|---|---|
數據庫(同) | database | database |
表(不同) | table | measurement |
列(不同) | column | tag(帶索引的,非必須)、field(不帶索引)、timestemp(唯一主鍵) |
-
tag set:不同的每組 tag key 和 tag value 的集合。
-
field set:每組 field key 和 field value 的集合。
-
retention policy:數據存儲策略(默認策略為 autogen)InfluxDB 沒有刪除數據操作,規定數據的保留時間達到清除數據的目的。
-
series:共同 retention policy、measurement 和 tag set 的集合。
示例數據:
- census 是 measurement
- butterflies 和 honeybees 是 field key
- location 和 scientist 是 tag key
name: census
————————————
time butterflies honeybees location scientist
2015-08-18T00:00:00Z 12 23 1 langstroth
2015-08-18T00:00:00Z 1 30 1 perpetua
2015-08-18T00:06:00Z 11 28 1 langstroth
2015-08-18T00:06:00Z 11 28 2 langstroth
注意點:
- tag 只能為字符串類型。
- field 類型無限制。
- 不支持 join。
- 支持連續查詢操作(匯總統計數據):CONTINUOUS QUERY。
部署
新建容器網絡:
docker network create grafana
運行容器:
docker run -d --name=influxdb --network grafana -p 8086:8086 -v ${PWD}/influxdb/:/var/lib/influxdb influxdb:1.7.10
創建數據庫:
- 第一種方式:
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE jmeter"
- 第二種方式:
docker exec -it influxdb influx
簡單使用:
create database jmeters;
use jmeter;
show measurements;
select * from jmeter limit 3;
常用 InfluxQL
-- 查看所有的數據庫
show databases;
-- 使用特定的數據庫
use database_name;
-- 查看所有的 measurement
show measurements;
-- 查詢 10 條數據
select * from measurement_name limit 10;
-- 數據中的時間字段默認顯示的是一個納秒時間戳,改成可讀格式
precision rfc3339; -- 之后再查詢,時間就是 rfc3339 標准格式
-- 或可以在連接數據庫的時候,直接帶該參數
influx -precision rfc3339
-- 查看一個 measurement 中所有的 tag key
show tag keys
-- 查看一個 measurement 中所有的 field key
show field keys
-- 查看一個 measurement 中所有的保存策略(可以有多個,一個標識為 default)
show retention policies;
Grafana
簡介
Grafana(官網)是一個跨平台的、開源的度量分析和可視化工具,可以通過將采集的數據查詢然后可視化的展示,並及時通知。
它主要有以下六大特點:
- 展示方式:快速靈活的客戶端圖表,面板插件有許多不同方式的可視化指標和日志,官方庫中具有豐富的儀表盤插件,比如熱圖、折線圖、圖表等多種展示方式;
- 支持多種數據源:Graphite、InfluxDB、OpenTSDB、Prometheus、Elasticsearch、CloudWatch 和 KairosDB 等;
- 通知提醒:以可視方式定義最重要指標的警報規則,Grafana 將不斷計算並發送通知,在數據達到閾值時通過 Slack、PagerDuty 等獲得通知;
- 混合展示:在同一圖表中混合使用不同的數據源,可以基於每個查詢指定數據源,甚至自定義數據源;
- 注釋:使用來自不同數據源的豐富事件注釋圖表,將鼠標懸停在事件上會顯示完整的事件元數據和標記;
- 過濾器:Ad-hoc 過濾器允許動態創建新的鍵/值過濾器,這些過濾器會自動應用於使用該數據源的所有查詢。
基礎概念
Data Source
- Grafana 確切的說是一個前端展示工具,將數據以非常美觀直接的圖形展示出來。那么這些數據必須有一個來源吧,那么 Grafana 獲取數據的地方就稱為 Data Source。
- 官方文檔上說 Grafana 支持以下數據源:Graphite、InfluxDB、OpenTSDB、Prometheus、Elasticsearch、CloudWatch。
- 在 Grafana 3.0+ 之后,不僅支持上面說的這些數據源,還支持一些其它的數據源,這些就稱為 Grafana Plugins。Grafana 支持的插件非常多,只要做一些簡單的插件安裝配置,就能獲取豐富的數據源。
- 如下所示,添加數據源:
DashBoard
- 就像汽車儀表盤一樣可以展示很多信息,包括車速、水箱溫度等。Grafana 的 DashBoard 就是以各種圖形的方式來展示從 Datasource 拿到的數據。
- 添加儀表盤的示例步驟:
- 如搜索 jmeter 儀表盤:
- 選擇對應的儀表盤 ID :
- 復制ID,填入導入界面(導入時需要選擇用戶組以及對應的數據庫):
- 展示儀表盤(右上角可以選擇數據展示的時間段和刷新頻次):
- 如搜索 jmeter 儀表盤:
Row
- Row 是 DashBoard 的基本組成單元,一個 DashBoard 可以包含很多個 Row 。
- 一個 Row 可以展示一種信息或者多種信息的組合,比如系統內存使用率,CPU 五分鍾及十分鍾平均負載等。所以在一個 DashBoard 上可以集中展示很多內容。
Panel
- Panel(面板)實際上就是 Row 展示信息的方式,支持表格(table)、列表(alert list)、熱圖(Heatmap)等多種方式,具體可以去官網上查閱。
Query Editor
- 用來指定獲取哪一部分數據,類似於 SQL 查詢語句。比如要在某個 row 里面展示 test 這張表的數據,那么 Query Editor 里面就可以寫成 select * from test。
- 這只是一種比方,實際上每個 DataSource 獲取數據的方式都不一樣,所以寫法也不一樣,比如像 zabbix 數據則是以指定某個監控項的方式來獲取的。
Organization
- org 是一個很大的概念,每個用戶可以擁有多個 org,grafana 有一個默認的 main org 。
- 用戶登錄后可以在不同的 org 之間切換,前提是該用戶擁有多個 org 。
- 不同的 org 之間完全不一樣,包括 datasource、dashboard 等都不一樣。
- 創建一個 org 就相當於開了一個全新的視圖,所有的 datasource、dashboard 等都要再重新開始創建。
User
- Grafana 里面用戶有三種角色:admin、editor、viewer。
- admin 權限最高,可以執行任何操作,包括創建用戶、新增 Datasource、創建 DashBoard 等。
- editor 角色不可以創建用戶、不可以新增 Datasource、可以創建 DashBoard 。
- viewer 角色僅可以查看 DashBoard 。
- 在 2.1 版本及之后新增了一種角色 read only editor(只讀編輯模式),這種模式允許用戶修改 DashBoard,但是不允許保存。
- 每個 user 可以擁有多個 organization 。
部署
運行容器:
docker run -d --name grafana --network grafana -p 3000:3000 grafana/grafana:6.6.2
默認登錄賬號密碼為 admin/admin 。
壓測結果采集:Jmeter + InfluxDB + Grafana
Jmeter 自帶的監視器在 Windows 使用 GUI 模式運行時,其渲染和效果都不是太好,而在 linux 環境下又無法實時可視化。
因此如果有一個性能測試結果實時展示的頁面,就可以提升我們對系統性能表現的掌握程度,另一方面也可以提升我們的測試效率。
Grafana 添加 InfluxDB 數據源
配置項:
URL:http://influxdb:8086
:由於 grafana 和 influxdb 在在同個容器網絡中,因此可直接填寫【influxdb容器名:端口號】。Database:jmeter
:在 influxdb 中創建的數據庫名。Min time interval:5
:每 5 秒刷新一次數據源(這里是與 jmeter backend listener 每 5 秒寫入一次數據到 influxdb 保持同步)。
Grafana 創建 Jmeter 儀表盤
導入 Grafana 官方 Jmeter 儀表盤:https://grafana.com/grafana/dashboards/5496
填寫自定義配置:
儀表盤創建成功:
Jmeter 配置 Influxdb 監聽器
配置項說明:
influxdbUrl:http://192.168.3.222:8086/write?db=jmeter
:influxdb 服務器地址以及寫入的數據庫。application:app_1
自定義應用名稱,可在 grafana 儀表盤中篩選區分。measurement:jmeter
:influxdb 表名,默認為 jmeter(寫入數據時會自動創建該表)。summaryOnly:false
:在 grafana 儀表盤中顯示詳細 Error 信息。testTitle:test_demo_1
:在 influxdb 表數據中作區分。
查看寫入的 Influxdb 表數據:
[root@localhost ~]# docker exec -it influxdb influx
Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> show measurements;
name: measurements
name
----
events
jmeter
>
> select * from jmeter limit 3;
name: jmeter
time application avg count countError endedT hit max maxAT meanAT min minAT pct90.0 pct95.0 pct99.0 rb responseCode responseMessage sb startedT statut transaction
---- ----------- --- ----- ---------- ------ --- --- ----- ------ --- ----- ------- ------- ------- -- ------------ --------------- -- -------- ------ -----------
1658844069082000000 app_1 0 0 0 0 1 internal
1658844074048000000 app_1 34.9375 16 42 30 41.3 42 42 39952 1872 all Single Request
1658844074050000000 app_1 34.9375 16 42 30 41.3 42 42 ok Single Request
>
> select * from events;
name: events
time application text title
---- ----------- ---- -----
1658844069036000000 app_1 test_demo_1 started ApacheJMeter
1658844215777000000 app_1 test_demo_1 ended ApacheJMeter
查看儀表盤展示:
Prometheus(普羅米修斯)
簡介
什么是 Prometheus ?
-
Prometheus(官網)是一套開源的監控&報警&時序數據庫的組合,適合監控 Docker 容器。因為 Kubernetes 的流行帶動了 Prometheus 的發展
-
Prometheus 是最初在 SoundCloud 上構建的開源系統監視和警報工具包,該項目擁有非常活躍的開發人員和用戶社區。現在,它是一個獨立的開源項目,並且獨立於任何公司進行維護。為了強調這一點並闡明項目的治理結構,Prometheus 於 2016 年加入了 Cloud Native Computing Foundation,這是繼 Kubernetes 之后的第二個托管項目。
Prometheus 優點:
- 非常少的外部依賴,安裝使用超簡單。
- 已經有非常多的系統集成,例如:docker、HAProxy、Nginx、JMX 等等。
- 服務自動化發現。
- 直接集成到代碼。
- 設計思想是按照分布式、微服務架構來實現的。
Prometheus 特性:
- 多維度數據模型。
- 提供靈活的查詢語言(PromQL)。
- 不依賴分布式存儲,單個服務器節點是自主的。
- 以 HTTP 方式,通過 Pull 模型拉取時間序列數據。
- 也可以通過中間網關支持 Push 模型。
- 通過服務發現或者靜態配置,來發現目標服務對象。
- 支持多種多樣的圖標和界面展示。
Prometheus 生態系統:
Prometheus 生態系統包含多個組件,其中許多是可選的。且大多數 Prometheus 組件都是用 Go 編寫的,因此易於構建和部署為靜態二進制文件。
- Prometheus server:它會抓取並存儲時間序列數據。
- client libraries:用於檢測應用程序代碼。
- push gateway:一個支持短期工作的推送網關。
- 諸如 HAProxy、StatsD、Graphite 等服務的專用輸出端。
- 一個 alertmanager 處理警報。
- 各種支持工具。
Prometheus 原理架構圖:
下圖說明了 Prometheus 的體系結構及其某些生態系統組件。
Prometheus 直接或通過中介推送網關從已檢測作業中刪除指標,以處理短暫的作業。它在本地存儲所有報廢的樣本,並對這些數據運行規則,以匯總和記錄現有數據中的新時間序列,或生成警報。Grafana 或其他 API 使用者可以用來可視化收集的數據。
Prometheus 應用場景:
-
什么時候適合?
- Prometheus 可以很好地記錄任何純數字時間序列。它既適用於以機器為中心的監視,也適用於高度動態的面向服務的體系結構的監視。在微服務世界中,它對多維數據收集和查詢的支持是一種特別的優勢。
- Prometheus 的設計旨在提高可靠性,使其成為中斷期間要使用的系統,以使你能夠快速診斷問題。每個 Prometheus 服務器都是獨立的,而不依賴於網絡存儲或其他遠程服務。當基礎結構的其他部分損壞時,你可以依靠它,並且無需設置廣泛的基礎結構即可使用它。
-
什么時候不適合?
- 普羅米修斯重視可靠性。即使在故障情況下也始終可以查看有關系統的可用統計信息。如果你需要 100% 的准確性(例如按請求計費),則 Prometheus 並不是一個好的選擇,因為所收集的數據可能不夠詳細和完整。在這種情況下,最好使用其他系統來收集和分析數據以進行計費,並使用 Prometheus 進行其余的監視。
部署
配置文件:
https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yml
運行容器:
docker run -d --name prometheus --network grafana -p 9090:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml
Web 訪問 Prometheus:查看默認監控目標
實時抓取監控數據,並存儲在 Prometheus 數據庫中:
主機性能采集:Prometheus + Grafana
node_exporter
Prometheus 提供了各種監控 Agent,這里以主機性能監控【node_exporter】為例。
下載解壓 node_exporter:
# 根據系統選擇對應的下載包
[root@localhost prometheus]# wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
[root@localhost prometheus]# tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz
node_exporter-1.3.1.linux-amd64/
node_exporter-1.3.1.linux-amd64/LICENSE
node_exporter-1.3.1.linux-amd64/NOTICE
node_exporter-1.3.1.linux-amd64/node_exporter
gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
[root@localhost prometheus]# ls
node_exporter-1.3.1.linux-amd64 node_exporter-1.3.1.linux-amd64.tar.gz prometheus.yml
[root@localhost prometheus]# cd node_exporter-1.3.1.linux-amd64/
[root@localhost node_exporter-1.3.1.linux-amd64]# ls
LICENSE node_exporter NOTICE
啟動 node_exporter:
# 查看啟動參數
[root@localhost prometheus]# ./node_exporter --help
# 自定義啟動端口,且限定訪問IP
[root@localhost prometheus]# nohup ./node_exporter --web.listen-address="192.168.3.222:9102" &
# 不限定訪問IP
[root@localhost prometheus]# nohup ./node_exporter --web.listen-address=":9102" &
修改 Prometheus 配置文件,添加 node_exporter 配置:
重啟容器:
docker restart prometheus
監控添加成功:
Grafana 添加 Prometheus 數據源
Grafana 導入 node_exporter 儀表盤
導入 Grafana 官方 node_exporter 儀表盤:https://grafana.com/grafana/dashboards/8919
儀表盤導入成功: