1、什麼是InfluxDB?python
InfluxDB是一款用Go語言編寫的開源分佈式時序、事件和指標數據庫,無需外部依賴。該數據庫如今主要用於存儲涉及大量的時間戳數據,如DevOps監控數據,APP metrics, loT傳感器數據和實時分析數據。git
InfluxDB特徵:github
– 無結構(無模式):能夠是任意數量的列(tags)。web
– 能夠設置metric的保存時間。redis
– 支持與時間有關的相關函數(如min、max、sum、count、mean、median等),方便統計。算法
– 支持存儲策略:能夠用於數據的刪改(influxDB沒有提供數據的刪除與修改方法)。shell
– 支持連續查詢:是數據庫中自動定時啓動的一組語句,和存儲策略搭配能夠下降InfluxDB的系統佔用量。數據庫
– 原生的HTTP支持,內置HTTP API。json
– 支持相似SQL語法。後端
– 支持設置數據在集羣中的副本數。
– 支持按期採樣數據,寫入另外的measurement,方便分粒度存儲數據。
– 自帶web管理界面,方便使用(登入方式:http://< InfluxDB-IP >:8083)。
– 最關鍵的一點,也是我採用的緣由,支持Grafana畫圖展現。
PS:有了InfluxDB+Grafana後,你就能夠寫一些簡單的程序了,能夠只負責寫後端邏輯部分,數據均可以存入InfluxDB,而後經過Grafana展現出來。
在具體的講解influxdb的相關操做以前先說說influxdb的一些專有名詞,這些名詞表明什麼。先看下面一段Influxdb中的表信息。
1
2
3
4
5
6
|
> select * from disk;
name: disk
time count device free hostname used used_percent
---- ----- ------ ---- -------- ---- ------------
1502089306183159978 1 /data 80 server01 100 60.33
1502089342879496791 1 /data 90 server02 110 68.33
|
InfluxDB是時序數據庫,因此怎麼都繞不開時間,第一縱列time存儲着時間戳,而時間戳是與數據進行關聯,這樣才能將時間和數據進行展現。
InfluxDB名詞
database:數據庫,根關係型數據庫一個概念。
measurement:數據庫中的表,就是關係型數據庫中的表。
points:表裏面的一行數據,就是關係型數據庫中的記錄。
InfluxDB中獨有的一些概念
Point由時間戳(time)、標籤(tags)和值(field)組成。
time:每條數據記錄的時間,也是數據庫自動生成的主索引。
tags:各類有索引的屬性。
fields:各類記錄的值。
tag set:tag在InfluxDB中會按照字典序排序,不論是tag-key仍是tag-value,只要不一致就分別屬於兩個tag set,例如hostname=server01,device=/data和hostname=server02,device=/data就是兩個不一樣的tag set。
還有三個重要的名詞:Series、Retention policy和Shard
Series:至關因而InfluxDB中一些數據的集合,在同一個database中,retention policy、measurement、tag sets徹底相同的數據同屬於一個series,同一個series的數據在物理上會按照時間順序排列存儲在一塊兒。
Retention policy:存儲策略,用於設置數據保留的時間,每一個數據庫剛開始會自動建立一個默認的存儲策略autogen,數據保留時間爲永久,以後用戶能夠本身設置,例如保留最近2小時的數據。插入和查詢數據時若是不指定存儲策略,則使用默認存儲策略,且默認存儲策略能夠修改。InfluxDB會按期清除過時的數據。
Shard:在InfluxDB中是一個比較重要的概念,它和Retention policy相關聯。每個存儲策略下會存在許多shard,每個shard存儲一個指定時間段內的數據,而且不重複,例如7點-8點的數據落入shard0中,8點-9點的數據則落入shard1中。每個shard都對應一個底層的tsm存儲引擎,有獨立的 cache、wal、tsm file。
TSM存儲引擎主要由幾個部分組成:cache、wal、tsm file、compactor。
Cache:至關因而LSM Tree中的memtabl。插入數據時,其實是同時往cache與wal中寫入數據,能夠認爲cache是wal文件中的數據在內存中的緩存。當InfluxDB啓動時,會遍歷全部的wal文件,從新構造cache,這樣即便系統出現故障,也不會致使數據的丟失。cache中的數據並非無限增加的,有一個maxSize參數用於控制當cache中的數據佔用多少內存後就會將數據寫入tsm文件。若是不配置的話,默認上限爲25MB,每當cache中的數據達到閥值後,會將當前的cache進行一次快照,以後清空當前cache中的內容,再建立一個新的wal文件用於寫入,剩下的wal文件最後會被刪除,快照中的數據會通過排序寫入一個新的tsm文件中。
WAL:WAL文件的內容與內存中的cache相同,其做用就是爲了持久化數據,當系統崩潰後能夠經過wal文件恢復尚未寫入到tsm文件中的數據。
TSM File:單個tsm file大小最大爲 2GB,用於存放數據。
Compactor:Compactor組件在後臺持續運行,每隔1秒會檢查一次是否有須要壓縮合並的數據。
主要進行兩種操做,一種是cache中的數據大小達到閥值後,進行快照,以後轉存到一個新的tsm文件中。另一種就是合併當前的tsm文件,將多個小的tsm文件合併成一個,使每個文件儘可能達到單個文件的最大大小,減小文件的數量,而且一些數據的刪除操做也是在這個時候完成。
InfluxDB的數據存儲主要有三個目錄,默認狀況下是meta, wal以及data三個目錄。
meta用於存儲數據庫的一些元數據,meta目錄下有一個meta.db文件。
1
2
|
/var/lib/influxdb/meta/
└──
meta.db
|
wal目錄存放預寫日誌文件,以.wal結尾。
1
2
3
4
5
|
/var/lib/influxdb/wal/
└──
test
└── autogen
└── 22
└── _00002.wal
|
data目錄存放實際存儲的數據文件,以.tsm結尾。
1
2
3
4
5
|
/var/lib/influxdb/data/
└──
test
└── autogen
└── 22
└── 000000001-000000001.tsm
|
上面幾張圖中,test爲數據庫名,autogen爲存儲策略名稱,再下一層目錄中的以數字命名的目錄是shard的ID值。
存儲策略下有一個shard,ID爲22,shard存儲了某一個時間段範圍內的數據。再下一級的目錄則爲具體的文件,分別是.wal和.tsm結尾的文件。
1)安裝配置
1
2
3
4
5
6
7
8
|
# 安裝influxdb;
$ yum install influxdb
# 啓動influxdb;
$ systemctl start influxdb
# 鏈接influxdb;
$ influx -database 'test' -host 'localhost' -port '8086'
|
2)相關文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
$ rpm -ql influxdb
# 配置文件;
/etc/influxdb/influxdb.conf
# 日誌輪轉;
/etc/logrotate.d/influxdb
# 命令行客戶端;
/usr/bin/influx
# 查看工具;
/usr/bin/influx_inspect
# 壓力測試工具;
/usr/bin/influx_stress
# 數據庫轉換工具(將數據庫從b1或bz1格式轉換爲tsm1格式);
/usr/bin/influx_tsm
# 服務端;
/usr/bin/influxd
# Systemctl服務管理;
/usr/lib/influxdb/scripts/influxdb.service
/usr/lib/influxdb/scripts/init.sh
................
# 數據目錄;
/var/lib/influxdb
# 日誌目錄;
/var/log/influxdb
|
3)開啓Web
influxdb提供的簡單web管理頁面,能夠用來操做influxdb,默認沒有開啓,若是想開啓須要修改配置文件中[admin]部分,以下:
1
2
3
4
5
6
|
[admin]
# Determines whether the admin service is enabled.
enabled = true
# The default bind address used by the admin service.
bind-address = ":8083"
|
4)配置文件
[meta] – meta相關配置
dir:meta數據存放目錄,默認值:/var/lib/influxdb/meta。
retention-autocreate:用於控制默認存儲策略,數據庫建立時,會自動生成autogen的存儲策略,默認值:true。
logging-enabled:是否開啓meta日誌,默認值:true。
[data] – tsm1引擎配置
dir:最終數據(TSM文件)存儲目錄,默認值:/var/lib/influxdb/data。
wal-dir:預寫日誌存儲目錄,默認值:/var/lib/influxdb/wal。
query-log-enabled:是否開啓tsm引擎查詢日誌,默認值:true。
cache-max-memory-size:用於限定shard最大值,大於該值時會拒絕寫入,默認值:DefaultCacheMaxMemorySize = 1024 * 1024 * 1024 // 1GB。
cache-snapshot-memory-size:用於設置快照大小,大於該值時數據會刷新到tsm文件,默認值:DefaultCacheSnapshotMemorySize = 25 * 1024 * 1024 // 25MB。
cache-snapshot-write-cold-duration:tsm1引擎snapshot寫盤延遲,默認值:DefaultCacheSnapshotWriteColdDuration = time.Duration(10 * time.Minute)。
compact-full-write-cold-duration:tsm文件在壓縮前能夠存儲的最大時間,默認值:DefaultCompactFullWriteColdDuration = time.Duration(4 * time.Hour)。
max-series-per-database:限制數據庫的級數,該值爲0時取消限制,默認值:DefaultMaxSeriesPerDatabase = 1000000,measurement, tag set, retention policy相同的數據集合算作一個serie,級數算法示例以下:假設monitor1這個measurement有兩個tags:id 和 name id 的數量爲10,name的數量爲 100,則 series 基數爲 10 * 100 = 1000。
max-values-per-tag:一個tag最大的value數,0取消限制,默認值:DefaultMaxValuesPerTag = 100000。
trace-logging-enabled:是否開啓trace日誌,默認值:false。
[coordinator] – 查詢管理的配置選項
write-timeout:寫操做超時時間,默認值: 10s。
max-concurrent-queries:最大併發查詢數,0無限制,默認值: 0。
query-timeout:查詢操做超時時間,0無限制,默認值:0s。
log-queries-after:慢查詢超時時間,0無限制,默認值:0s。
max-select-point = 0:SELECT語句能夠處理的最大點數(points),0無限制,默認值:0。
max-select-series = 0:SELECT語句能夠處理的最大級數(series),0無限制,默認值:0。
max-select-buckets = 0:SELECT語句能夠處理的最大」GROUP BY time()」的時間週期,0無限制,默認值:0。
[retention] – 舊數據的保留策略
enabled:是否啓用該模塊,默認值 :true。
check-interval:檢查時間間隔,默認值 :」30m0s」。
[shard-precreation] – 分區預建立
enabled:是否啓用該模塊,默認值 : true。
check-interval:檢查時間間隔,默認值 :」10m0s」。
advance-period:預建立分區的最大提早時間,默認值 :」30m0s」。
[admin] – influxdb提供的簡單web管理頁面
enabled:是否啓用該模塊,默認值:false。
bind-address:綁定地址,默認值:」:8083″。
https-enabled:是否開啓https ,默認值:false。
https-certificate:https證書路徑,默認值:」/etc/ssl/influxdb.pem」。
[monitor] – 這一部分控制InfluxDB自有的監控系統。 默認狀況下,InfluxDB把這些數據寫入_internal數據庫,若是這個庫不存在則自動建立。 _internal 庫默認的retention策略是7天,若是你想使用一個本身的retention策略,須要本身建立。
store-enabled:是否啓用該模塊,默認值 :true。
store-database:默認數據庫:」_internal」。
store-interval:統計間隔,默認值:」10s」。
[subscriber] – 控制Kapacitor接受數據的配置
enabled:是否啓用該模塊,默認值 :true。
http-timeout:http超時時間,默認值:」30s」。
insecure-skip-verify:是否容許不安全的證書,當測試本身簽發的證書時比較有用。默認值:false。
ca-certs:設置CA證書,無默認值。
write-concurrency:設置併發數目,默認值:40。
write-buffer-size:設置buffer大小,默認值:1000。
[http] – influxdb的http接口配置
enabled:是否啓用該模塊,默認值 :true。
bind-address:綁定地址,默認值:」:8086″。
auth-enabled:是否開啓認證,默認值:false。
log-enabled:是否開啓日誌,默認值:true。
write-tracing:是否開啓寫操做日誌,若是置成true,每一次寫操做都會打日誌,默認值:false。
pprof-enabled:是否開啓pprof,默認值:true。
https-enabled:是否開啓https,默認值:false。
https-certificate:設置https證書路徑,默認值:」/etc/ssl/influxdb.pem」。
https-private-key:設置https私鑰,無默認值。
max-row-limit:配置查詢返回最大行數,默認值:10000。
max-connection-limit:配置最大鏈接數,0無限制,默認值:0。
shared-secret:用於JWT簽名的共享密鑰,無默認值。
realm:配置JWT realm,默認值: 「InfluxDB」。
unix-socket-enabled:是否使用unix-socket,默認值:false。
bind-socket:unix-socket路徑,默認值:」/var/run/influxdb.sock」。
[[graphite]] – graphite相關配置,具體參考:https://github.com/influxdata/influxdb/blob/master/services/graphite/README.md
enabled:是否啓用該模塊,默認值 :false。
bind-address:綁定地址,默認值:」:2003″。
database:數據庫名稱,默認值:」graphite」。
retention-policy:存儲策略,無默認值。
protocol:協議,默認值:」tcp」。
batch-size:批量size,默認值:5000。
batch-pending:配置在內存中等待的batch數,默認值:10。
batch-timeout:超時時間,默認值:」1s」。
consistency-level:一致性級別,默認值:」one」。
separator:多個measurement間的鏈接符,默認值: 「.」。
udp-read-buffer = 0:udp讀取buffer的大小,0表示使用操做系統提供的值,若是超過操做系統的默認配置則會出錯。 該配置的默認值:0。
[[collectd]] – collectd相關配置,具體參考:https://github.com/influxdata/influxdb/tree/master/services/collectd
enabled:是否啓用該模塊,默認值 :false。
bind-address:綁定地址,默認值: 「:25826″。
database:數據庫名稱,默認值:」collectd」。
retention-policy = 「」:存儲策略,無默認值。
batch-size:默認值:5000。
batch-pending:默認值:10。
batch-timeout:默認值:」10s」。
read-buffer:udp讀取buffer的大小,0表示使用操做系統提供的值,若是超過操做系統的默認配置則會出錯。默認值:0。
typesdb:路徑,默認值:」/usr/share/collectd/types.db」。
[[opentsdb]] – opentsdb配置
enabled:是否啓用該模塊,默認值:false。
bind-address:綁定地址,默認值:」:4242″。
database:默認數據庫:」opentsdb」。
retention-policy:存儲策略,無默認值。
consistency-level:一致性級別,默認值:」one」。
tls-enabled = false:是否開啓tls,默認值:false。
certificate:證書路徑,默認值:」/etc/ssl/influxdb.pem」。
batch-size:默認值:1000。
batch-pending:默認值:5。
batch-timeout:超時時間,默認值:」1s」。
log-point-errors:出錯時是否記錄日誌,默認值:true。
[[udp]] – udp配置
enabled:是否啓用該模塊,默認值:false。
bind-address:綁定地址,默認值:」:8089″。
database:數據庫名稱,默認值:」udp」。
retention-policy:存儲策略,無默認值。
batch-size:默認值:5000。
batch-pending:默認值:10。
read-buffer:udp讀取buffer的大小,0表示使用操做系統提供的值,若是超過操做系統的默認配置則會出錯。 該配置的默認值:0。
batch-timeout:超時時間,默認值:」1s」。
precision:時間精度,無默認值。
[continuous_queries]
log-enabled:是否開啓日誌,默認值:true。
enabled:是否開啓CQs,默認值:true。
run-interval:時間間隔,默認值:」1s」。
1)用戶管理
能夠直接在web管理頁面作操做,也能夠命令行。
1
2
3
4
5
6
7
8
9
10
11
|
# 顯示用戶;
show users
# 建立用戶;
create user "username" with password 'password'
# 建立管理員權限用戶;
create user "username" with password 'password' with all privileges
# 刪除用戶;
drop user "username"
|
3)數據庫與表的操做
能夠直接在web管理頁面作操做,固然也能夠命令行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 建立數據庫;
create database "db_name"
# 顯示全部的數據庫;
show databases
# 刪除數據庫;
drop database "db_name"
# 使用數據庫;
use db_name
# 顯示該數據庫中全部的表;
show measurements
# 建立表,直接在插入數據的時候指定表名(key-value);
insert disk,hostname=server02,device=/data free=90,used=110,used_percent=98.33,count=1
# 刪除表;
drop measurement "measurement_name"
|
4)普通查詢
那麼話說,InfluxDB的查詢語法是很給力的,很像SQL語句。下面一一介紹下,經常使用的InfluxDB裏面經常使用的SQL語句。 話說InfluxDB給與的搜索條件仍是很豐富的,有時間分析下他落地在leveldb的數據結構。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# 表名均可以正則;
select * from /.*/ limit 1
# 輸出Json格式;
$ influx -database 'test' -execute 'select * from disk' -format 'json' -pretty
# 查詢數據大於200的;
select * from disk where free > 80
# 查詢數據裏面含有下面字符串的;
select * from user_events where url_base = ‘friends#show’
# 約等於;
select line from log_lines where line =~ /paul@influx.com/
# 按照30m分鐘進行聚合,時間範圍是大於昨天的主機名是server1的;
select mean(value) from cpu_idle group by time(30m) where time > now() – 1d and hostName = 'server1'
select column_one from foo where time > now() – 1h limit 1000;
select reqtime, url from web9999.httpd where reqtime > 2.5;
select reqtime, url from web9999.httpd where time > now() – 1h limit 1000;
# url搜索裏面含有login的字眼,還以login開頭;
select reqtime, url from web9999.httpd where url =~ /^\/login\//;
# 數據的merge;
select reqtime, url from web9999.httpd merge web0001.httpd;
|
下面再說下數據的匯聚,聚合啥的。
1
2
3
4
5
6
7
8
9
10
11
|
# count();
SELECT COUNT(column_name) FROM series_name group by time(10m) …
# min();
SELECT MIN(column_name) FROM series_name group by time(10m) …
# MAX();
SELECT MAX(column_name) FROM series_name group by time(10m) …
# mean();
SELECT MEAN(column_name) FROM series_name group by time(10m) …
|
5)連續查詢(Continuous Queries)
InfluxDB的連續查詢是在數據庫中自動定時啓動的一組語句,語句中必須包含SELECT關鍵詞和GROUP BY time()關鍵詞。
InfluxDB會將查詢結果放在指定的數據表中。目的:使用連續查詢是最優的下降採樣率的方式,連續查詢和存儲策略搭配使用將會大大下降InfluxDB的系統佔用量。並且使用連續查詢後,數據會存放到指定的數據表中,這樣就爲之後統計不一樣精度的數據提供了方便。
新建連續查詢
1
2
3
4
5
|
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
[RESAMPLE [EVERY <interval>] [FOR <interval>]]
BEGIN SELECT <function>(<stuff>)[,<function>(<stuff>)] INTO <different_measurement>
FROM <current_measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<stuff>]
END
|
樣例:
1
2
3
|
CREATE CONTINUOUS QUERY redis_30m ON test BEGIN
SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients)
INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m) END
|
在test庫中新建了一個名爲redis_30m的連續查詢,每三十分鐘取一個connected_clients字段的平均值、中位值、最大值、最小值redis_clients_30m表中。使用的數據保留策略都是default。
顯示或刪除全部已存在的連續查詢
1
2
|
SHOW CONTINUOUS QUERIES
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
|
6)數據保存策略(Retention Policies)
InfluxDB是沒有提供直接刪除數據記錄的方法,可是提供數據保存策略,主要用於指定數據保留時間,超過指定時間,就刪除這部分數據。
6.1 查看當前數據庫Retention Policies
1
|
show retention policies on "db_name"
|
6.2 建立新的Retention Policies
1
|
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
|
rp_name:策略名;
db_name:具體的數據庫名;
3w:保存3周,3周以前的數據將被刪除,influxdb具備各類事件參數,好比:h(小時),d(天),w(星期);
replication 1:副本個數,通常爲1就能夠了;
default:設置爲默認策略;
6.3 修改Retention Policies
1
|
alter retention policy "rp_name" on "db_name" duration 30d default
|
6.4 刪除Retention Policies
1
|
drop retention policy "rp_name"
|
1)安裝配置Grafana
CentOS系列使用YUM安裝
1
2
|
$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm
$ sudo yum localinstall grafana-4.2.0-1.x86_64.rpm
|
或者
1
2
|
$ yum install initscripts fontconfig
$ rpm -Uvh grafana-3.1.1-1470047149.x86_64.rpm
|
Systemd方式啓動Grafana
1
2
3
|
$ systemctl daemon-reload
$ systemctl start grafana-server
$ systemctl status grafana-server
|
啓動Granfa以後,進程名稱爲grafana-server。將會默認使用grafana用戶和組運行Granfa進程。默認會開啓HTTP的3000端口。啓動服務以後直接直接在瀏覽器訪問http://IP:3000就會出現以下界面,默認帳號和用戶名爲admin/admin,在/etc/grafana/grafana.ini配置文件中可修改。
2)InfluxDB添加用戶
1
|
create user "admin" with password 'admin' with all privileges
|
3)InfluxDB插入數據
1
2
|
> use test;
> insert disk,hostname=server01,device=/data free=80,used=100,used_percent=98.33,count=1
|
4)Grafana添加IfluxDB爲數據源
而後就能夠開始畫圖了。
InfluxDB中的tags能夠做爲條件,如hostname或device,而field能夠做爲value。
1)安裝infludb驅動
1
2
|
$ yum install python-pip
$ pip install influxdb
|
2)基本操做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#! /usr/bin/env python
#-*- coding:utf-8 -*-
from influxdb import InfluxDBClient
json_body = [
{
"measurement": "disk",
"tags": {
"hostname": "server01",
"device":"/data"
},
"fields": {
"free": 89,
"used": 100
}
}
]
# 查看數據;
def showDBNames(client):
result = client.query('show measurements;')
print("Result: {0}".format(result))
# 初始化鏈接(指定要操做的數據庫);
client = InfluxDBClient('localhost', 8086, 'root', '', 'test')
# 查看錶;
showDBNames(client)
# 寫入數據,同時建立表;
client.write_points(json_body)
# 查看錶;
showDBNames(client)
# 刪除表;
client.query("drop measurement students")
showDBNames(client)
|
InfluxDB中文文檔:https://github.com/jasper-zhang/influxdb-document-cn
轉自: http://www.ywnds.com/?p=10763#comments