influxdb的命令們

InfluxDB是一個開源的時序數據庫,使用GO語言開發,特別適合用於處理和分析資源監控數據這種時序相關數據。而InfluxDB自帶的各種特殊函數如求標準差,隨機取樣數據,統計數據變化比等,使數據統計和實時分析變得十分方便。

influxdb的單機版是開源的,而集羣版是商業版,influxdb被設計運行在SSD上,如果使用機器或者網絡磁盤作爲存儲介質,會導致性能下降至少一個數量級。influxdb支持restful api,同時也支持https,爲了保證安全性,非局域網建議使用https與Influxdb進行通信。

學習influxdb,如同學習MySQL先要了解SQL一樣,讓我們一起來看看influxdb的那些命令們 ~

centos下使用命令 yum install influxdb 安裝influxdb之後,就可以使用命令 service influxdb start 啓動influxdb,通過命令 influx 啓動cli客戶端。influxdb的命令基本都符合標準的sql格式,基礎操作命令如下:

influx 啓動influxdb客戶端,如同mysql -u xxx功能
create database db1  創建數據庫db1
show databases  查看數據庫列表
use db1  使用數據庫db1,是不是和mysql中功能類似
show measurements  查看measurement列表

drop database db1  刪除數據庫db1
drop measurement mt1  刪除表mt1
delete from measurement [WHERE <tag_key> <operator>]
drop shard <shard_id_num> 刪除分片

influxdb的概念們

  • database:數據庫;
  • measurement:數據表;
  • point:數據行,由時間戳、tag、field組成(一條數據至少包括measurement(對應mysql中表概念)、timestamp、至少一個k-v結構的field,再加上0個或者多個k-v結構的tag);
  • series:一些數據結合,同一個database下,retention policy、measurement、tag sets完全相同的數據同屬於一個 series,同一個series的數據物理上會存放在一起;
  • 分片:默認按時間段創建的數據分片,它和存儲策略相關,每一個存儲策略下會存在許多 shard,每一個 shard 存儲一個指定時間段內的數據,並且不重複。每一個分片都映射到底層存儲引擎數據庫,每一個數據庫都有自己的WAL和TSM文件,使用命令 show shards 查看分片。

influxdb數據寫入需滿足如下格式:

insert <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp] 

注意:measurement和至少一個fileld的k-v是必須的,tag和timestrap時間戳是可選的。

說實話,這個寫入格式還是有點小嚴格的,因爲它要求measurement和可能的0個或多個tag之間必須是緊挨着的,中間不能有空格;同時多個filed之間也是不能有空格,tag和field的k,tag的v都是字符串類型;時間戳不是必須的,如果爲空則使用服務端的本地時間作爲時間戳。相同時間戳的數據第二次寫入會覆蓋第一次寫入的數據,相當於更新操作。

數據寫入完成之後,就可以使用查看命令:

select * from measurement_name [WHERE <tag_key> <operator>] [limit xx]  查看數據
show series [on dbname] [from measurement] [WHERE <tag_key> <operator>] [limit xx]  查看series信息
show tag keys [on dbname] [from measurement] [WHERE <tag_key> <operator>] [limit xx]  查看tag keys信息
show field keys [on dbname] [from measurement]  查看field keys

Influxdb可支持每秒十萬級別的數據量,如果長時間保存會對存儲造成很大壓力,因此和一般數據存儲系統一樣有一個數據保留策略,同時針對大流量量數據可採樣保存,小流量數據可全量保存。influxdb通過保留策略(RP,Retention Policy)來管理過期數據。

# 創建過期策略
create retention policy <retention_policy_name> on <database_name> duration <duration> replicationN <n> [SHARD DURATION <duration>] [DEFAULT]
show retention policies [on dbname]  查看過期策略

在influxdb中,通過數據保留策略(RP),分片是掛在RP下管理的,數據過期的維度是分片,當檢測到一個 shard 中的數據過期後,只需要將這個 shard 的資源釋放,相關文件刪除即可,這樣的做法使得刪除過期數據變得非常高效。

除了直接使用influxdb命令之外,還可使用函數,influxdb的函數大致分爲aggregate,select和predictaggregate類型命令大致如下

  • count:返回非空字段數據數量,格式爲select count ( [ * | <field_key> | /<regular_expression>/ ] ) from measurement_name [WHERE <tag_key> <operator>] [limit xx]。除了統計非空字段數量之外,還可統計distinct列的數量,比如命令 select count(distintct("xxx")) from xxx。大多數influxdb命令針對沒有數據間隔返回null,count針對沒有數據返回的間隔返回0,而類似的fill(<fill_option>)用fill_option替換0值。
  • distinct:返回非null值的數據不相同數據計數。
  • integral:返回曲線下面積(積分),格式爲 select integral ( [ * | <field_key> | /<regular_expression>/ ] [ , <unit> ] ) from measurement_name [WHERE <tag_key> <operator>] [limit xx] ,uint爲時間單位,默認單位s。
  • mean:返回字段平均值。
  • median:返回字段中位數。
  • mode:返回字段中出現頻率最高的值。
  • spread:返回字段中最大值、最小值的差值。
  • stddev:返回字段的標準差。
  • sum:字段和。

selectors類型命令大致如下

  • bottom:返回最小的n個值,格式爲select bottom (<field_key>[,<tag_key(s)>],<N> ) from xxx where xxx
  • first:返回時間戳最早的值;
  • last:返回時間戳最近的值;
  • max、min:返回最大/最小返回值;
  • percentile:返回較大的百分比,格式爲select percentile (<field_key>, <N>)[,<tag_key(s)>|<field_key(s)>]
  • top:返回最大的字段值。

influxdb支持很多常見和高級的聚合查詢函數,可滿足大多數場景需要,具體可參考 https://jasper-zhang1.gitbooks.io/influxdb/content/Query_language/functions.html

小結

infludb中存儲的是時間序列數據,比如說某個時間點系統負載、服務耗時等信息,時間序列數據可以包含多個值。關於什麼是時間序列數據,簡單來來說就是數據是和一個時間點關聯的,結合mysql中的記錄與id關係來看就是時間序列數據的主鍵就是時間點(timestrap)。

infludb中的一條數據至少包括measurement(對應mysql中表概念)、timestamp、至少一個k-v結構的field,再加上0個或者多個k-v結構的tag。對比mysql來看,measurement就是一張表,其主鍵是timestamp時間戳,tag和field對應就是表中列,tag和field都是k-v接口,k對應列的名字,v對應該列存儲的值,tag和field不同的是,tag是有索引的而field沒有(如果查詢條件爲tag則會掃描所有查詢到的數據),對於mysql表的有索引列和無索引列。注意mysql中的表需要提前定義結構,而influxdb中的measurement無需提前定義,其null值也不會被存儲。

influxdb中measurement無需定義,即無模式設計,開發者可以在任意添加measurement,tags和fields,不過針對同一個field,第二次和第一次寫入的數據類型不匹配,influxdb會報錯(由於默認tag的v都是字符串類型,所有不存在這個問題,不管輸入是什麼數據都當做字符串來處理)。

推薦閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章