Influxdb 介紹與使用

weixin_34413802發表於2018-07-22

基本概念

與傳統資料庫對比

時間序列資料庫,主鍵永遠是時間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

相關文章