InfluxDB簡介
InfluxDB是一個時間序列數據庫,旨在處理高寫入和查詢負載。它是TICK堆棧的組成部分 。InfluxDB旨在用作涉及大量帶時間戳數據的任何用例的后備存儲,包括DevOps監控,應用程序指標,物聯網傳感器數據和實時分析。
功能特點
- 基於時間序列,支持與時間有關的相關函數(如最大,最小,求和等)
- 可度量性:你可以實時對大量數據進行計算
- 基於事件:它支持任意的事件數據基於事件:它支持任意的事件數據
主要特點
無結構(無模式):可以是任意數量的列
可拓展的
支持min, max, sum, count, mean, median 等一系列函數,方便統計支持min, max, sum, count, mean, median 等一系列函數,方便統計
原生的HTTP支持,內置HTTP API原生的HTTP支持,內置HTTP API
強大的類SQL語法強大的類SQL語法
自帶管理界面,方便使用自帶管理界面,方便使用
InfluxDB與傳統數據庫的比較
InfluxDB的名詞 | 傳統數據庫的概念 |
---|---|
database | 數據庫 |
measurement | 數據庫的表 |
points | 表里的一行數據 |
InfluxDB的獨特的特性
point
Point相當於傳統數據庫里的一行數據,如下表所示:
point屬性 | 傳統數據庫中的概念 |
---|---|
time(時間戳) | 每個數據記錄時間,是數據庫中的主索引(會自動生成) |
fields(字段、數據) | 各種記錄值(沒有索引的屬性)也就是記錄的值:溫度, 濕度 |
tags(標簽) | 各種有索引的屬性:地區,海拔 |
注意
在influxdb中,字段必須存在。因為字段是沒有索引的。如果使用字段作為查詢條件,會掃描符合查詢條件的所有字段值,性能不及tag。類比一下,fields相當於SQL的沒有索引的列。
tags是可選的,但是強烈建議你用上它,因為tag是有索引的,tags相當於SQL中的有索引的列。tag value只能是string類型。
series
相當於是 InfluxDB 中一些數據的集合,在同一個 database 中,retention policy、measurement、tag sets 完全相同的數據同屬於一個 series,同一個 series 的數據在物理上會按照時間順序排列存儲在一起。
> select * from students name: students time score stuid value ---- ----- ----- ----- 1542848518465067760 89 s123 1542850528630385278 79 s123 1542850533581732431 69 s123 1542850536266169940 39 s123 1542850676477097687 99 s123 1542874869654197110 s124 100 1542874898710687064 s125 60 > show series from students key --- students,stuid=s123 students,stuid=s124 students,stuid=s125
shard
shard 和 retention policy 相關聯。每一個存儲策略下會存在許多 shard,每一個 shard 存儲一個指定時間段內的數據,並且不重復;
例如 7點-8點 的數據落入 shard0 中,8點-9點的數據則落入 shard1 中。
每一個 shard 都對應一個底層的 tsm 存儲引擎,有獨立的 cache、wal、tsm file。
組件
TSM 存儲引擎主要由幾個部分組成: cache、wal、tsm file、compactor。
Cache: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 文件合並成一個,使每一個文件盡量達到單個文件的最大大小,減少文件的數量,並且一些數據的刪除操作也是在這個時候完成。
安裝
環境: CentOS7.0_x64
InfluxDB版本:1.7.0
基礎環境
yum install go
InfluxDB的安裝
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.0.x86_64.rpm rpm -ivh influxdb-1.2.0.x86_64.rpm
安裝后產生的InfluxDB相關文件講解
/usr/bin下文件
文件名 文件解析
influxd influxdb服務器
influx influxdb 命令行客戶端
influx_inspect 查看工具
influx_stress 壓力測試工具
influx_tsm 數據庫轉換工具(將數據庫從b1或bz1格式轉換為tsm1格式)
/var/lib/influxdb下文件夾(建完表和庫的時候才會有)
文件夾 | 文件夾解析 |
---|---|
data | 存放最終存儲的數據,文件以**.tsm**結尾 |
meta | 存放數據庫元數據 |
wal | 存放預寫日志文件 |
/etc/influxdb下文件
文件 | 文件解析 |
---|---|
influxdb.conf | influxdb數據庫配置文件 |
啟動服務
操作服務的相關命令
服務式啟動命令 service influxdb start 服務式的其他命令 停止服務 service influxdb stop 重啟服務 service influxdb restart 嘗試重啟服務 service influxdb try-restart 重新加載服務 service influxdb reload 強制重新加載服務 service influxdb force-reload 查看服務狀態 service influxdb status
以非服務方式啟動
cd /usr/bin;./influxd
服務啟動查看是否正常
-
通過查看服務對應進程
InfluxDB默認使用以下網絡端口:
- TCP端口
8086
用於通過InfluxDB的HTTP API進行客戶端 - 服務器通信 - TCP端口
8088
用於RPC服務以進行備份和還原
除了上面的端口,InfluxDB還提供了多個可能需要自定義端口的插件。可以通過配置文件修改所有端口映射,配置文件位於/etc/influxdb/influxdb.conf
默認安裝位置。
InfluxDB 客戶端命令行方式操作
-
InfluxDB數據庫操作
客戶端命令行方式操作 [root@localhost influxdb]# influx Connected to http://localhost:8086 version 1.7.0 InfluxDB shell version: 1.7.0 Enter an InfluxQL query > 顯示數據庫 > show databases name: databases name ---- _internal 新建數據庫 > create database testdb > show databases name: databases name ---- _internal testdb 刪除數據庫 > drop database testdb > show databases name: databases name ---- _internal 使用數據庫 > create database testdb > use testdb Using database testdb
InfluxDB 數據表操作
在InfluxDB當中,並沒有表(table)這個概念,取而代之的是measurement,measurement的功能與傳統數據庫中的表一致,因此我們也可以將measurement稱為InfluxDB中的表。
顯示所有表
show measurement
新建表
InfluxDB中沒有顯示的創建表的語句,只能通過insert數據的房還是來建立新表。
其中 disk_free 就是表名,hostname 是索引(tag),value=xx 是記錄值(field),記錄值可以有多個,系統自帶追加時間戳。
> insert disk_free,hostname=server01 value=442221834240i > select * from disk_free name: disk_free time hostname value ---- -------- ----- 1435362189575692180 server01 442221834240
或者添加數據時,自己寫入時間戳(寫入相同時間戳、相同tags,對原有數據進行update操作)
> insert disk_free,hostname=server01 value=442221834240i 1435362189575692182 > select * from disk_free name: disk_free time hostname value ---- -------- ----- 1435362189575692180 server01 442221834240 1435362189575692182 server01 442221834240
刪除表
> drop measurement disk_free
數據保存策略(Retention Policies)
InfluxDB 是沒有提供直接刪除數據記錄的方法,但是提供數據保存策略,主要用於指定數據保留時間,超過指定時間,就刪除這部分數據。
查看當前數據庫Retention Policies
name:名稱,此示例名稱為 default。
duration:持續時間,0代表無限制。
shardGroupDuration:shardGroup的存儲時間,shardGroup是InfluxDB的一個基本儲存結構,應該大於這個時間的數據在查詢效率上應該有所降低。
replicaN:全稱是replication,副本個數。
default:是否是默認策略。
> show retention policies on testdb name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 true
創建新的Retention Policies
rp_name:策略名。
db_name:具體的數據庫名。
3w:保存3周,3周之前的數據將被刪除,influxdb 具備各種事件參數,持續時間必須至少為1小時;比如:h(小時)、d(天)、w(星期)。
replication 1:副本個數,一般為1即可。
default:設置為默認策略。
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
修改Retention Policies alter retention policy "rp_name" on "db_name" duration 30d default 刪除Retention Policies drop retention policy "rp_name" on "db_name"
連續查詢(Continuous Queries)
InfluxDB 的連續查詢是在數據庫中自動定時啟動的一組語句,語句中必須包含 select 關鍵字 和 group by time() 關鍵字。
InfluxDB 會將查詢結果放在指定的數據表中。
目的:使用連續查詢是最優的降低采樣率的方式,連續查詢和存儲策略搭配使用將會大大降低 InfluxDB 的系統占用量。而且使用連續查詢后,數據會存放到指定的數據表中,這樣就為以后統計不同精度的數據提供了方便。
新建連續查詢
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
樣例
CREATE CONTINUOUS QUERY wj_30m ON testdb 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
在 testdb 庫中新建了一個名為 wj_30m 的連續查詢,每三十分鍾取一個 connected_clients 字段的平均值、中位值、最大值、最小值 redis_clients_30m 表中。使用的數據保留策略都是default。
不同 database 樣例:
CREATE CONTINUOUS QUERY wj_30m ON testdb_30 BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO testdb_30.autogen.redis_clients_30m FROM testdb.autogen.redis_clients GROUP BY ip,port,time(30m) END
顯示所有已存在的連續查詢
show continuous queries
刪除Continuous Queries
drop continuous query <cq_name> on <database_name>