基本概念
與傳統資料庫對比
時間序列資料庫,主鍵永遠是時間time
point
measurement
一類資料
series
資料序列
- 一個series就是一個測點,或者說一條曲線,那麼retention policy, measurement, tagset就共同組成了一個定位測點序列的唯一標識。
- point,就是某個series的同一個時刻的多個field的value,就組成了一個point;其實就是一般曲線上的一個點。
- InfluxDb不需要做schema定義,這意味著你可以隨意的新增measurements, tags, and fields at any time,
初步使用
下載和安裝
請參考官網。本人使用docker來執行,並從官網下載客戶端命令列工具influx
//下載influx客戶端,其實這個壓縮包已經包含了influxdb,不過我只需要客戶端influx
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.4.2_linux_amd64.tar.gz
tar xvfz influxdb-1.4.2_linux_amd64.tar.gz
//將/usr/local/bin/influx 連線到influxdb-1.4.2/usr/bin/influx
ln -s influxdb-1.4.2/usr/bin/influx /usr/local/bin/influx
//docker
docker pull registry.docker-cn.com/tutum/influxdb
docker tag registry.docker-cn.com/tutum/influxdb:latest tutum/influxdb
//8083是influxdb的web管理工具埠,8086是influxdb的HTTP API埠
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdb
//連線客戶端,預設連線到localhost:8086
influx
//指定host port user pasword連線
influx其他引數請使用:influx --help
//退出
exit
使用者管理
# 顯示使用者列表
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdbshow users;
# 建立使用者
create user "use_name" with password 'user_password'' with all privileges;
# 刪除使用者
drop user "user_name"
# 使用賬號密碼登陸(influx 預設不啟動認證機制,需要修改配置檔案來啟動認證機制)
influx -host 'influxdb_host' -port '8086' -username 'user_name'
database
show databases
create database test
use db_name
drop database test
measurement
measurement無需建立語法,只需在插入時指定measurement即可,influx會根據你的插入的資料建立相應的measurement結構
insert
//語法
select|insert <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
insert your_measurement,tag_name=tag_value... column_name=column_value
//例子
insert payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i // i是integer的意思,預設數字是float
//指定時間
insert payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1516167115623067775
select
select * from payment
select billed from payment //查詢time billed欄位
//如果欄位名或者measurement是關鍵字,那麼可以使用引號。如user是關鍵字
//注意,不能只select *或者select field欄位
select * from "user"
//select device from paymet是錯誤的
//限制查詢數量:limit
//注意select的內容要麼是*,要麼是field
select * from payment limit 10
//select "device" from payment 是錯誤的,因為沒有field欄位
//where
select * from payment where billed > 10
select * from payment where "device"='mobile' #注意引號的使用
//and or not
select * from payment where billed > 10 and "device"='mobile'
select * from payment where time > '2018-07-19 03:00:00'
select * from payment where time > now() - 1h
delete
delete from where tag_key=tag_value and ... or ...
update
influxdb 是沒有update的(一般資料倉儲只使用者資料儲存與查詢)
where
-
group by
select sum(billed) from payment group by "device" select sum(billed) from payment group by time(30m) //30m聚合一次資料`
常用的聚合函式有count、disinct、mean(平均值)、median(中位數)、spread(最小值和最大值之間的差值)、sum等。
選擇類函式
select top("billed",3) from payment
常用的選擇類函式有
- top 返回最大的n個值,如top("billed", 3) 返回billed的最大的三條記錄。如果measurement的總記錄數m小於n,則返回m條
- bottom 返回最小的n個值,用法同top
- first 返回time欄位最小的紀錄的欄位,如first("billed") 返回time最小的紀錄的billed欄位
- last 返回time欄位最大的紀錄的欄位,用法同last
- max
- min
- percentile 選取某個欄位中大於N%的這個欄位值。如果一共有4條記錄,N為10,則10%*4=0.4,四捨五入為0,則查詢結果為空。N為20,則 20% * 4 = 0.8,四捨五入為1,選取的是4個數中最小的數。如果N為40,40% * 4 = 1.6,四捨五入為2,則選取的是4個數中第二小的數。由此可以看出N=100時,就跟MAX(field_key)是一樣的,而當N=50時,與MEDIAN(field_key)在欄位值為奇數個時是一樣的。
- 其他不細說,DERIVATIVE為變化率、DIFFERENCE數值差異、ELAPSED欄位在連續的時間間隔間的差異、MOVING_AVERAGE、NON_NEGATIVE_DERIVATIVE、STDDEV標準偏差
drop
刪除整個measurement
drop measurement measurement_name;
其他
- 不要用引號括住數值或字串
- insert時不要用引號括住measurement
- 如果measurement或者欄位有引號,需要使用轉義:
SELECT * FROM "\"weather\""
- 對於一些符號如:, = 空格 ,如果出現在measuremnt或者欄位,需要轉義
連續查詢
可見https://www.linuxdaxue.com/in...
- InfluxDB的連續查詢是在資料庫中自動定時啟動的一組語句,語句中必須包含 SELECT 關鍵詞和 GROUP BY time() 關鍵詞。
- InfluxDB會將查詢結果放在指定的資料表中。
- 一般用於定時聚合資料,如聚合訪問記錄為每天訪問量。連續查詢主要用在將資料歸檔,以降低系統空間的佔用率,主要是以降低精度為代價。連續查詢和儲存策略搭配使用將會大大降低InfluxDB的系統佔用量。
- 只有管理員才可以操作連續查詢
語法
create continuous query cq_name on db_name [resample [every <interval>][for <interval>]]
begin
select <function><field>,... into measurement_1
from measurement_2 where... group by time(time<interval>)
end
//例子
create continuous query billed_30 on payment begin select sum(billed) into billed_30min from payment group by time(30m) end
//這個連續查詢會每30分鐘執行一次
- resample every用於指定執行的頻次,如resample every 30m表示 每30m執行一次
- resample for 指定連續查詢的時間範圍。如create ... resample for 60m every 30m ... group by time(30m)表示,每30m執行一次,每次將1小時的資料執行連續查詢,也就是說,每次執行時,會將now()到now()-30m和now()-30m到now()-60m分別做連續查詢,這樣我們就可以手動指定連續查詢的時間範圍了。
顯示所有連續查詢
show continuous queries
刪除
drop continuous query cq_name on db_name
儲存策略
InfluxDB本身不提供資料的刪除操作,因此用來控制資料量的方式就是定義資料保留策略。
檢視現有策略
show retention policies on db_name
--------------------------output---------------------------
name duration shardGroupDuration replicaN default
default 0 168h0m0s 1 true
- 每個db都有一個預設的策略,每個策略都有shardGroupDuration時間,檢測的時間視窗,預設為7d
- duration--持續時間,0代表無限制,如duration 1h,即只保留一小時內的資料
- replicaN--全稱是REPLICATION,副本個數
新建策略
create retention policy "policy_name" on "db_name" duration <time> replication n [default]
//例子
create retention policy "3_hour" on "test" duration 3h default
修改策略
alter retention policy "3_hour" on "test" duration 4h default
刪除策略
drop retention policy "3_hour" on "test"
資料備份與回覆
doc https://docs.influxdata.com/e...
先從之前下載的壓縮包中獲取備份工具
ln -s influxdb-1.4.2/usr/bin/influxd /usr/local/bin/influxd
本地資料備份
//語法
influxd backup -database db_name [since 2018-07-02 12:00:00] path_to_back
//since可以指定備份某個時間點之後的資料
//例子
influxd backup payment ~/tmp/backup/payment
遠端備份
influxd backup -database db_name -hosthost:port [since 2018-07-05 13:00:00]path_backup
資料恢復
influxd restore [ -metadir | -datadir ] <path-to-meta-or-data-directory> <path-to-backup>
//例子
influxd restore -database payment -metadir /var/lib/influxdb/meta -datadir /var/lib/influxdb/data ~/tmp/backup/payment
//注意,在restore之前需要把influxd stop,restore後重啟influxd資料才會成功恢復
reference
- https://www.linuxdaxue.com/no...,也是本文的圖片來源
- https://www.influxdata.com/bl..., retention policy