Influxdb 介紹與使用

基本概念

與傳統數據庫對比

時間序列數據庫,主鍵永遠是時間time
與傳統數據庫中的名詞作比較html

point

圖片描述

measurement

一類數據
圖片描述linux

series

數據序列
圖片描述web

  • 一個series就是一個測點,或者說一條曲線,那麼retention policy, measurement, tagset就共同組成了一個定位測點序列的惟一標識。
  • point,就是某個series的同一個時刻的多個field的value,就組成了一個point;其實就是通常曲線上的一個點。
  • InfluxDb不須要作schema定義,這意味着你能夠隨意的添加measurements, tags, and fields at any time,

初步使用

下載和安裝

請參考官網。本人使用docker來運行,並從官網下載客戶端命令行工具influxdocker

//下載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的(通常數據倉庫只用戶數據存儲與查詢)ide

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

經常使用的選擇類函數有ui

  • 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

刪除整個measurementspa

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

相關文章
相關標籤/搜索