引用網址:https://www.cnblogs.com/shhnwangjian/p/6897216.html
1、數據格式
在 InfluxDB 中,我們可以粗略的將要存入的一條數據看作一個虛擬的 key 和其對應的 value(field value)。格式如下:
1
|
cpu_usage,host
=
server01,region
=
us
-
west value
=
0.64
1434055562000000000
|
虛擬的 key 包括以下幾個部分: database, retention policy, measurement, tag sets, field name, timestamp。
- database: 數據庫名,在 InfluxDB 中可以創建多個數據庫,不同數據庫中的數據文件是隔離存放的,存放在磁盤上的不同目錄。
- retention policy: 存儲策略,用於設置數據保留的時間,每個數據庫剛開始會自動創建一個默認的存儲策略 autogen,數據保留時間為永久,之后用戶可以自己設置,例如保留最近2小時的數據。插入和查詢數據時如果不指定存儲策略,則使用默認存儲策略,且默認存儲策略可以修改。InfluxDB 會定期清除過期的數據。
- measurement: 測量指標名,例如 cpu_usage 表示 cpu 的使用率。
- tag sets: tags 在 InfluxDB 中會按照字典序排序,不管是 tagk 還是 tagv,只要不一致就分別屬於兩個 key,例如 host=server01,region=us-west 和 host=server02,region=us-west 就是兩個不同的 tag set。
- tag--標簽,在InfluxDB中,tag是一個非常重要的部分,表名+tag一起作為數據庫的索引,是“key-value”的形式。
- field name: 例如上面數據中的 value 就是 fieldName,InfluxDB 中支持一條數據中插入多個 fieldName,這其實是一個語法上的優化,在實際的底層存儲中,是當作多條數據來存儲。
- timestamp: 每一條數據都需要指定一個時間戳,在 TSM 存儲引擎中會特殊對待,以為了優化后續的查詢操作。
2、與傳統數據庫中的名詞做比較
influxDB中的名詞 | 傳統數據庫中的概念 |
database | 數據庫 |
measurement | 數據庫中的表 |
points | 表里面的一行數據 |
3、Point
Point由時間戳(time)、數據(field)、標簽(tags)組成。
Point相當於傳統數據庫里的一行數據,如下表所示:
Point屬性 | 傳統數據庫中的概念 |
time | 每個數據記錄時間,是數據庫中的主索引(會自動生成) |
fields | 各種記錄值(沒有索引的屬性) |
tags | 各種有索引的屬性 |
4、Series
Series 相當於是 InfluxDB 中一些數據的集合,在同一個 database 中,retention policy、measurement、tag sets 完全相同的數據同屬於一個 series,同一個 series 的數據在物理上會按照時間順序排列存儲在一起。
5、Shard
Shard 在 InfluxDB 中是一個比較重要的概念,它和 retention policy 相關聯。每一個存儲策略下會存在許多 shard,每一個 shard 存儲一個指定時間段內的數據,並且不重復,例如 7點-8點 的數據落入 shard0 中,8點-9點的數據則落入 shard1 中。每一個 shard 都對應一個底層的 tsm 存儲引擎,有獨立的 cache、wal、tsm file。
6、組件
TSM 存儲引擎主要由幾個部分組成: cache、wal、tsm file、compactor。
1)Cache:cache 相當於是 LSM Tree 中的 memtabl。插入數據時,實際上是同時往 cache 與 wal 中寫入數據,可以認為 cache 是 wal 文件中的數據在內存中的緩存。當 InfluxDB 啟動時,會遍歷所有的 wal 文件,重新構造 cache,這樣即使系統出現故障,也不會導致數據的丟失。
cache 中的數據並不是無限增長的,有一個 maxSize 參數用於控制當 cache 中的數據占用多少內存后就會將數據寫入 tsm 文件。如果不配置的話,默認上限為 25MB,每當 cache 中的數據達到閥值后,會將當前的 cache 進行一次快照,之后清空當前 cache 中的內容,再創建一個新的 wal 文件用於寫入,剩下的 wal 文件最后會被刪除,快照中的數據會經過排序寫入一個新的 tsm 文件中。
2)WAL:wal 文件的內容與內存中的 cache 相同,其作用就是為了持久化數據,當系統崩潰后可以通過 wal 文件恢復還沒有寫入到 tsm 文件中的數據。
3)TSM File:單個 tsm file 大小最大為 2GB,用於存放數據。
4)Compactor:compactor 組件在后台持續運行,每隔 1 秒會檢查一次是否有需要壓縮合並的數據。
主要進行兩種操作,一種是 cache 中的數據大小達到閥值后,進行快照,之后轉存到一個新的 tsm 文件中。
另外一種就是合並當前的 tsm 文件,將多個小的 tsm 文件合並成一個,使每一個文件盡量達到單個文件的最大大小,減少文件的數量,並且一些數據的刪除操作也是在這個時候完成。
7、目錄與文件結構
InfluxDB 的數據存儲主要有三個目錄。默認情況下是 meta, wal 以及 data 三個目錄。
meta 用於存儲數據庫的一些元數據,meta 目錄下有一個 meta.db
文件。
wal 目錄存放預寫日志文件,以 .wal
結尾。
data 目錄存放實際存儲的數據文件,以 .tsm
結尾。
上面幾張圖中,_internal為數據庫名,monitor為存儲策略名稱,再下一層目錄中的以數字命名的目錄是 shard 的 ID 值。
存儲策略下有兩個 shard,ID 分別為 1 和 2,shard 存儲了某一個時間段范圍內的數據。再下一級的目錄則為具體的文件,分別是 .wal
和 .tsm
結尾的文件。
InfluxDB基本操作
InfluxDB提供多種操作方式:
1)客戶端命令行方式
2)HTTP API接口
3)各語言API庫
4)基於WEB管理頁面操作
客戶端命令行方式操作
進入命令行
1
|
influx
-
precision rfc3339
|
1、InfluxDB數據庫操作
- 顯示數據庫
1
|
show databases
|
- 新建數據庫
1
|
create database shhnwangjian
|
- 刪除數據庫
1
|
drop database shhnwangjian
|
- 使用指定數據庫
1
|
use shhnwangjian
|
2、InfluxDB數據表操作
在InfluxDB當中,並沒有表(table)這個概念,取而代之的是MEASUREMENTS,MEASUREMENTS的功能與傳統數據庫中的表一致,因此我們也可以將MEASUREMENTS稱為InfluxDB中的表。
- 顯示所有表
1
|
SHOW MEASUREMENTS
|
- 新建表
InfluxDB中沒有顯式的新建表的語句,只能通過insert數據的方式來建立新表。
1
|
insert disk_free,hostname
=
server01 value
=
442221834240i
|
其中 disk_free 就是表名,hostname是索引(tag),value=xx是記錄值(field),記錄值可以有多個,系統自帶追加時間戳
或者添加數據時,自己寫入時間戳
1
|
insert disk_free,hostname
=
server01 value
=
442221834240i
1435362189575692182
|
- 刪除表
1
|
drop measurement disk_free
|
3、數據保存策略(Retention Policies)
influxDB是沒有提供直接刪除數據記錄的方法,但是提供數據保存策略,主要用於指定數據保留時間,超過指定時間,就刪除這部分數據。
- 查看當前數據庫Retention Policies
1
|
show retention policies on
"db_name"
|
- 創建新的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:設置為默認策略
- 修改Retention Policies
1
|
alter retention policy
"rp_name"
on
"db_name"
duration
30d
default
|
- 刪除Retention Policies
1
|
drop retention policy
"rp_name"
on
"db_name"
|
4、連續查詢(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
|
CREATE CONTINUOUS QUERY wj_30m ON shhnwangjian 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
|
在shhnwangjian庫中新建了一個名為 wj_30m 的連續查詢,每三十分鍾取一個connected_clients字段的平均值、中位值、最大值、最小值 redis_clients_30m 表中。使用的數據保留策略都是 default。
不同database樣例:
1
|
CREATE CONTINUOUS QUERY wj_30m ON shhnwangjian_30 BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients),
MAX
(connected_clients),
MIN
(connected_clients) INTO shhnwangjian_30.autogen.redis_clients_30m FROM shhnwangjian.autogen.redis_clients GROUP BY ip,port,time(
30m
) END
|
- 顯示所有已存在的連續查詢
1
|
SHOW CONTINUOUS QUERIES
|
- 刪除Continuous Queries
1
|
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
|
參考文章:
http://blog.fatedier.com/2016/08/05/detailed-in-influxdb-tsm-storage-engine-one/
http://www.linuxdaxue.com/noun-interpretation-of-influxdb.html