本文章為本人在ops內容建設團隊第二期分享
歡迎關注微信公眾號:OPS無界工程師
本文章最後更新時間:2018-05-13
個人部落格地址:blog.sqdyy.cn
大家晚上好,今晚由我來分享基於telegraf+influxdb+grafana構建監控平臺的方案,首先我們先來了解InfluxDB。influxdb是一款專為時序資料編寫的高效能資料庫,採用GO語言開發,並且開源!它是TICK技術棧的一部分。它採用TSM引擎進行高速攝取和資料壓縮。並提供高效能的寫入/查詢 HTTP API,其表示式語句類似SQL查詢語句(但資料結構概念不太一樣,詳見InfluxDB design insights and tradeoffs。
先對上面的一些名稱進行解釋,TICK技術棧指的是InfluxData公司研發的四款監控開源產品,包括Telegraf、InfluxDB、Chronograf、Kapacitor。其中InfluxDB使用最廣泛,是開源的時序資料庫,一個比較常見的應用場景為日誌儲存。Kapacitor提供了基於influxdb的監控報警方案,支援多種資料聚合,選擇,變換,預測方法。Chronograf用於對資料進行展示,可以使用功能更強大的Grafana替代。
TSM引擎這塊我也不太熟悉,屬於進階知識,網上資料也不多,感興趣的大佬可以自己去研究:
influxdb
時序資料庫主要用於儲存系統的監控資料,一般具有如下特徵:
- 以時間為維度的高效查詢
- 方便的down sampling
- 高效的處理過期資料
對於influxdb的學習方式,我建議先參考Linux大學的InfluxDB系列教程對Influxdb有一個基本的瞭解(但不需要死摳,因為其中有些描述是過時的),然後再去influxdb官檔深入學習為佳。
下載並安裝influxdb
# 新增yum 源
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL $releasever
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install influxdb
influx -version
複製程式碼
啟動服務、新增開機啟動:
sudo service influxdb start
sudo systemctl start influxdb
複製程式碼
主要概念
InfluxDB與傳統資料庫在概念上有一些不同,我介紹一些基本的概念,如果你想了解更多請參考官檔influxdb concepts
與傳統資料庫中的名詞做比較
influxDB中的名詞 | 傳統資料庫中的概念 |
---|---|
database | 資料表 |
measurement | 資料庫中的表 |
points | 表裡面的一行資料 |
InfluxDB的獨有概念
剛才說的是InfluxDB與傳統資料庫相同的概念,下面介紹它的特有概念。
Point
Point相當於傳統資料庫中表裡面的一行資料,由timestamp(時間戳),field(資料),tags(標籤)組成。
Point屬性 | 傳統資料庫中的概念 |
---|---|
timestamp | 每個資料都需要一個時間戳(主索引&自動生成),在TSM儲存引擎中會特殊對待,以為了優化後續的查詢操作 |
field | (field key,field set,field value) 各種記錄值(沒有索引的屬性),例如溫度 |
tag | (tag key,tag sets,tag value) 各種有索引的屬性,例如地區 |
series
series相當於是InfluxDB中一些資料的集合。所有在資料庫中的資料,都要通過圖表展示出來,而series則表示表裡面的資料,可以在圖表上畫成幾條線(通過tags排列組合算出來):
> show series from cpu
key
---
cpu,cpu=cpu-total,host=VM_42_233_centos
cpu,cpu=cpu0,host=VM_42_233_centos
cpu,cpu=cpu1,host=VM_42_233_centos
cpu,cpu=cpu2,host=VM_42_233_centos
cpu,cpu=cpu3,host=VM_42_233_centos
複製程式碼
其程式碼結構如下:
type Series struct {
mu sync.RWMutex
Key string // series key
Tags map[string]string // tags
id uint64 // id
measurement *Measurement // measurement
}
複製程式碼
shard
每個儲存策略下會存在許多shard,每個shard儲存一個指定時間段的資料,例如7點-8點的資料落入shard0中,8點-9點的資料落到shard1中,每個shard都對應一個底層的tsm儲存引擎,有獨立的cache,wal,tsm file。
資料保留策略
保留策略(RP)是用來定義資料在InfluxDB存放的時間,或者定義儲存某個期間的資料。當你建立資料庫時,InfluxDB會自動建立一個autogen(具有無限保留的保留策略):
> SHOW RETENTION POLICIES ON telegraf
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 true
複製程式碼
上面是查詢資料庫現有策略的語句,查詢結果各欄位含義如下:
欄位 | 含義 |
---|---|
name | 策略名稱 |
duration | 持續時間,0代表無限保留 |
shardGroupDuration | shardGroup是InfluxDB的一個基本儲存結構,168h0m0s表上單個shard所儲存的時間間隔為168小時,超過168小時後會被存放到下一個shard中 |
replicaN | 全稱replication,副本個數(不太懂) |
default | 是否是預設策略 |
func shardGroupDuration(d time.Duration) time.Duration {
if d >= 180*24*time.Hour || d == 0 { // 6 months or 0
return 7 * 24 * time.Hour
} else if d >= 2*24*time.Hour { // 2 days
return 1 * 24 * time.Hour
}
return 1 * time.Hour
}
複製程式碼
我們可以建立一個新的保留策略,下面語句在telegraf庫中建立了一個2小時保留策略,名為2h0m0s並設定為預設策略:
> CREATE RETENTION POLICY "2h0m0s" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON telegraf
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 false
2h0m0s 2h0m0s 1h0m0s 1 true
複製程式碼
目前我們的autogen已經不再是預設策略,如果你需要查詢這個策略的資料,你需要在查詢時顯式的加上策略名:
> SELECT time,host,usage_system FROM "autogen".cpu limit 2
name: cpu
time host usage_system
---- ---- ------------
1526008670000000000 VM_42_233_centos 1.7262947210419817
1526008670000000000 VM_42_233_centos 1.30130130130254
複製程式碼
更多保留策略相關的內容,請參考官檔database_management。
連續查詢
連續查詢(CQ)是在資料庫中自動定時啟動的一組語句,InfulxDB會將查詢結果儲存在指定的資料表中。
- 使用連續查詢是最優降低取樣率的方式,連續查詢和儲存策略搭配使用將會大大降低InfulxDB的系統佔用量。
- 使用連續查詢後,資料會存放到指定的資料表中,這樣就為以後統計不同精度的資料提供了方便。
- 連續查詢一旦建立就無法更改。要更改連續查詢,您必須先DROP再重新使用CREATE建立新查詢。
下面是連續查詢的語法:
// 基本語法
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
RESAMPLE EVERY <interval> FOR <interval>
BEGIN
SELECT <function[s]> INTO <destination_measurement>
FROM <measurement> [WHERE <stuff>]
GROUP BY time(<interval>)[,<tag_key[s]>]
END
複製程式碼
例如,下面語句在telegraf庫中新建了一個名為cq_30m的連續查詢,每30分鐘會取used欄位的平均值加入到mem_used_30m表中。使用的資料保留策略都是default:
CREATE CONTINUOUS QUERY cq_30m ON telegraf BEGIN SELECT mean(used) INTO mem_used_30m FROM mem GROUP BY time(30m) END
複製程式碼
下面是一些常用操作:
SQL | 描述 |
---|---|
SHOW CONTINUOUS QUERIES | 查詢所有CQ |
DROP CONTINUOUS QUERY <cq_name> ON <database_name> | 刪除連續查詢 |
更多連續查詢相關的內容,請參考官檔continuous_queries。
常用函式
InfluxDB提供了很多的有用的函式,其中分為三類:
- 聚合類函式
函式 | 描述 |
---|---|
count(field_key) | 返回計數 |
DISTINCT(field_key) | 返回唯一值 |
INTEGRAL(field_key) | 計算欄位值覆蓋的曲面的面積值並得到面積之和 |
MEAN(field_key) | 返回平均值 |
MEDIAN(field_key) | 返回中間值 |
MODE(field_key) | 返回欄位裡最頻繁的值 |
SPREAD(field_key) | 返回最大差值 |
SUM(field_key) | 返回總和 |
- 選擇類函式
函式 | 描述 |
---|---|
BOTTOM(field_key,N) | 返回最小的N個值 |
FIRST(field_key) | 返回一個欄位中最老的取值 |
LAST(field_key) | 返回一個欄位中最新的取值 |
MAX(field_key) | 返回一個欄位中的最大值 |
MIN(field_key) | 返回一個欄位中的最小值 |
PERCENTILE(field_key,N) | Returns the Nth percentile field value. |
SAMPLE(field_key,N) | 返回N個欄位的隨機樣本 |
TOP(field_key,N) | 返回最大的N個值 |
- 轉換類函式
函式 | 描述 |
---|---|
CEILING() | ~ |
CUMULATIVE_SUM() | ~ |
DERIVATIVE() | ~ |
DIFFERENCE() | ~ |
ELAPSED() | ~ |
FLOOR() | ~ |
HISTOGRAM() | ~ |
MOVING_AVERAGE() | ~ |
NON_NEGATIVE_DERIVATIVE() | ~ |
NON_NEGATIVE_DIFFERENCE() | ~ |
- 預測類
函式 | 描述 |
---|---|
HOLT_WINTERS() | 季節性預測演算法-對資料流量趨勢進行預測和預警 |
Telegraf
建立起了對時序庫的概念後,接下來我們就該往時序庫寫資料了,你可以通過你應用服務的metrics程式採集指標,然後通過influxdb提供的http api向influxdb寫入資料,但是本期我們並不介紹這樣的用法(如java的metrics還需介紹java的語法),下面為大家介紹一款與influxdb完美結合的採集資料的代理程式:Telegraf
Telegraf是用Go寫的代理程式,可以用於收集系統和服務的統計資料,是TICK技術棧的一部分。它具備輸入外掛,可以直接從系統獲取指標資料,從第三方API獲取指標資料,甚至可以通過statsd和Kafka獲取指標資料。它還具備輸出外掛,可以將採集的指標傳送到各種資料儲存,服務和訊息佇列。比如InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。
下載並安裝Telegraf:
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.6.2-1.x86_64.rpm
sudo yum install telegraf-1.6.2-1.x86_64.rpm
telegraf -version
複製程式碼
如果你的telegraf是安裝的,其配置檔案位置為:
/etc/telegraf/telegraf.conf
複製程式碼
編輯配置檔案,將我們配置好的influxdb資料庫指定為期望的輸出源:
[[outputs.influxdb]]
urls=["http://localhost:8086"]
複製程式碼
啟動服務、新增開機啟動:
sudo systemctl start telegraf.service
sudo service telegraf status
sudo systemctl enable telegraf.service
複製程式碼
在InfluxDB上檢查預設配置下telegraf採集了哪些資料:
> show databases
> use telegraf
> show measurements
> SHOW FIELD KEYS
複製程式碼
如何進行配置
預設配置下,會啟用system分類下的INPUT外掛,即telegraf.conf有如下配置:
# Read metrics about cpu usage
# 讀取有關CPU使用情況的指標
[[inputs.cpu]]
## Whether to report per-cpu stats or not
percpu = true
## Whether to report total system cpu stats or not
totalcpu = true
## If true, collect raw CPU time metrics.
collect_cpu_time = false
## If true, compute and report the sum of all non-idle CPU states.
report_active = false
# Read metrics about disk usage by mount point
# 通過mount point讀取有關磁碟使用情況的指標
[[inputs.disk]]
## Ignore mount points by filesystem type.
ignore_fs = ["tmpfs", "devtmpfs", "devfs"]
# Read metrics about disk IO by device
# 通過device讀取有關磁碟IO的指標
[[inputs.diskio]]
# Get kernel statistics from /proc/stat
# 通過/proc/stat獲取核心統計資訊
[[inputs.kernel]]
# no configuration
# Read metrics about memory usage
# 讀取有關記憶體使用量的指標
[[inputs.mem]]
# no configuration
# Get the number of processes and group them by status
# 獲取程式的數量並按狀態分組
[[inputs.processes]]
# no configuration
# Read metrics about swap memory usage
# 讀取有關交換記憶體使用量的指標
[[inputs.swap]]
# no configuration
# Read metrics about system load & uptime
# 讀取有關係統負載和執行時間的指標
[[inputs.system]]
# no configuration
複製程式碼
其具體採集資料如下(其中第一級別為measurements,第二級別為欄位(省略了時間戳欄位)):
- cpu[units: percent (out of 100)]
- usage_guest float
- usage_guest_nice float
- usage_idle float
- usage_iowait float
- usage_irq float
- usage_nice float
- usage_softirq float
- usage_steal float
- usage_system float
- usage_user float
- disk
- free integer
- inodes_free integer
- inodes_total integer
- inodes_used integer
- total integer
- used integer
- used_percent float
- diskio
- io_time integer
- iops_in_progress integer
- read_bytes integer
- read_time integer
- reads integer
- weighted_io_time integer
- write_bytes integer
- write_time integer
- writes integer
- kernel
- boot_time integer
- context_switches integer
- entropy_avail integer
- interrupts integer
- processes_forked integer
- mem
- active integer
- available integer
- available_percent float
- buffered integer
- cached integer
- free integer
- inactive integer
- slab integer
- total integer
- used integer
- used_percent float
- wired integer
- processes
- blocked integer
- dead integer
- idle integer
- paging integer
- running integer
- sleeping integer
- stopped integer
- total integer
- total_threads integer
- unknown integer
- zombies integer
- swap
- free integer
- in integer
- out integer
- total integer
- used integer
- used_percent float
- system
- load1 float
- load15 float
- load5 float
- n_cpus integer
- n_users integer
- uptime integer
- uptime_format string
複製程式碼
如何查詢指標及其採集資料
telegraf主要分為輸入外掛和輸入外掛,其原始碼目錄分別對應plugins/inputs
和plugins/outputs
,你只要參考telegraf官檔找到你所需要的外掛然後去到原始碼對應的目錄找到相應的.md
檔案,按照提示獲取相關資訊進行配置即可。
啟用telegraf服務後,你會發現在influxdb中多了一個telegraf的庫,其中有多個measurement,這說明我們的資料採集已經成功了。有了資料以後,我們需要關心的是如何把資料聚合然後進行展示。下面將介紹一款視覺化套件grafana。
Grafana
Grafana是一個開源指標分析和視覺化套件,常用於視覺化基礎設施的效能資料和應用程式分析的時間序列資料。也可以應用於其他領域,包括工業感測器,家庭自動化,天氣和過程控制。但請注意,我們使用Grafana最關心的是如何把資料進行聚合後進行展示。
Grafana支援多種不同的時序資料庫資料來源,Grafana對每種資料來源提供不同的查詢方法,而且能很好的支援每種資料來源的特性。它支援下面幾種資料來源:Graphite、Elasticsearch、CloudWatch、InfluxDB、OpenTSDB、Prometheus、MySQL、Postgres、Microsoft SQL Server (MSSQL)。每種資料來源都有相應的文件,您可以將多個資料來源的資料合併到一個單獨的儀表板上,本文只舉例influxdb資料來源的應用。
下載並安裝Telegraf:
# 安裝grafana
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.2-1.x86_64.rpm
# 啟動服務、新增開機啟動:
systemctl enable grafana-server
systemctl start grafana-server
# 配置
配置檔案 /etc/grafana/grafana.ini
systemd服務名 grafana-server.service
預設日誌檔案 /var/log/grafana/grafana.log
預設資料庫檔案 /var/lib/grafana/grafana.db
複製程式碼
簡單使用
啟動服務後訪問http://localhost:3000
,預設埠為3000
,可在配置檔案修改。預設使用者名稱和密碼為admin/admin。登入後按照提示配置資料來源:
接著建立一個dashboard:
我們先選擇匯入模板的方式來預覽效果,再來了解grafana/dashboard的相關配置,這裡選擇官方提供的一套Telegraf: system dashboard,地址https://grafana.com/dashboards/928
。請你根據它的提示配置你的telegraf。然後在dashboards中選擇import->Upload.jsonFile
,將下載的模板匯入:
檢視結果:
你還可以安裝一些外掛,例如安裝一款時間皮膚外掛。
安裝方式是到你的/var/lib/grafana/plugins目錄下執行grafana-cli工具安裝外掛,下面安裝時間皮膚外掛:
> sudo grafana-cli plugins install grafana-clock-panel
installing grafana-clock-panel @ 0.0.9
from url: https://grafana.com/api/plugins/grafana-clock-panel/versions/0.0.9/download
into: /var/lib/grafana/plugins
✔ Installed grafana-clock-panel successfully
Restart grafana after installing plugins . <service grafana-server restart>
# 重啟服務
> sudo systemctl restart grafana-server
複製程式碼
自己動手配置幾個
我們建立一個新的dashboard,Dashboard由多個Row組成,一行Row分為12列,我們可以自定義皮膚的Span寬度和高度。現在我們選擇新增一個Singlestat(如果是繪製線性表選Graph),然後點選Panel Title->Edit編輯我們的皮膚資訊,預設開啟Metrics檢視,我們修改後得到如下資訊:
我們修改options中的單位和顏色:
同樣的,你可以嘗試新增其他的皮膚實現下面效果:
Grafana的功能非常豐富,在這裡不能詳細敘述,請您參考官檔瞭解更多:
http://docs.grafana.org/features/datasources/