influxdb的簡單使用
參考https://blog.51cto.com/caimengzhi/1895306 感謝作者!
之前對influxdb有一個簡單的了解和入門的使用,近期由於想使用influxdb做一點東西玩玩,又要撿起influxdb。本篇就針對influxdb的數據庫、表的概念,增刪改查操作、RESTful操作等做下總結。
一、influxdb與傳統數據庫的比較
庫、表等比較:
influxDB 傳統數據庫中的概念 database 數據庫 measurement 數據庫中的表 points 表里面的一行數據 influxdb數據的構成:
Point由時間戳(time)、數據(field)、標簽(tags)組成。
Point屬性 傳統數據庫中的概念
time 每個數據記錄時間,是數據庫中的主索引(會自動生成) fields 各種記錄值(沒有索引的屬性)也就是記錄的值:溫度, 濕度 tags 各種有索引的屬性:地區,海拔
這里不得不提另一個名詞:series:
所有在數據庫中的數據,都需要通過圖表來展示,而這個series表示這個表里面的數據,可以在圖表上畫成幾條線:通過tags排列組合算出來。具體可以通過SHOW SERIES FROM "表名" 進行查詢。
influxdb使用的端口如下:
8083: Web admin管理服務的端口, http://localhost:8083 8086: HTTP API的端口 8088: 集群端口(目前還不是很清楚, 配置在全局的bind-address,默認不配置就是開啟的)
二、安裝及增刪改查
1、安裝
#wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm
#rpm -ivh influxdb-1.1.0.x86_64.rpm
#systemctl enable influxdb
#systemctl start influxdb
注:本示例是在centos7/rhel7中配置的服務,如果在rhel6下,可以使用service進行服務配置和啟動。
2、命令行下創建及查詢
通過influx命令進行管理,可以使用如下命令創建數據庫:
> CREATE DATABASE "testDB" > show databases //查詢當前的所有數據庫 > show databases name: databases --------------- name _internal testDB > use testDB //使用某個數據庫
建庫的操作可以發現非常類似於mysql下的操作。而在influxdb下沒有細分的表的概念,influxdb下的表在插入數據庫的時候自動會創建。可以通過SHOW measurements命令查看所有的表,這個類似於mysql下的show tables; 。
> INSERT cpu,host=serverA,region=us_west value=0.64 //在cpu表中插入相關的數據 > SELECT * FROM cpu ORDER BY time DESC LIMIT 3 //查詢最近的三條數據 > SELECT * FROM /.*/ LIMIT 1 //正則表達式查詢 > delete from cpu where time=1480235366557373922 //刪除某條數據 > DROP MEASUREMENT "measurementName" //刪除表
update更新語句沒有,不過有alter命令,在influxdb中,刪除操作用和更新基本不用到 。在針對數據保存策略方面,有一個特殊的刪除方式,這個后面再提。
關於用戶的操作如下:
#顯示用戶 SHOW USERS #創建用戶 CREATE USER "username" WITH PASSWORD 'password' #創建管理員權限的用戶 CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES #刪除用戶 DROP USER "username"
influxdb的權限設置比較簡單,只有讀、寫、ALL幾種。更多用戶權限設置可以參看官方文檔:https://docs.influxdata.com/influxdb/v1.0/query_language/authentication_and_authorization/ 。默認情況下,influxdb類似與mongodb,是不開啟用戶認證的,可以修改其 conf文件,配置http塊內容如下:
[http]
enable = true bind-address = ":8086" auth-enabled = true # 開啟認證
三、數據保存策略及連續查詢
1、數據保存策略
一般情況下基於時間序列的point數據不會進行直接刪除操作,一般我們平時只關心當前數據,歷史數據不需要一直保存,不然會占用太多空間。這里可以配置數據保存策略(Retention Policies),當數據超過了指定的時間之后,就會被刪除。
SHOW RETENTION POLICIES ON "testDB" //查看當前數據庫的Retention Policies CREATE RETENTION POLICY "rp_name" ON "db_name" DURATION 30d REPLICATION 1 DEFAULT //創建新的Retention Policies #注釋如下: rp_name:策略名 db_name:具體的數據庫名 30d:保存30天,30天之前的數據將被刪除 它具有各種時間參數,比如:h(小時),w(星期) REPLICATION 1:副本個數,這里填1就可以了 DEFAULT 設為默認的策略
也可以通過如下命令修改和刪策略:
ALTER RETENTION POLICY "rp_name" ON db_name" DURATION 3w DEFAULT DROP RETENTION POLICY "rp_name" ON "db_name"
2、連續查詢(Continuous Queries)
當數據超過保存策略里指定的時間之后,就會被刪除。如果我們不想完全刪除掉,比如做一個數據統計采樣:把原先每秒的數據,存為每小時的數據,讓數據占用的空間大大減少(以降低精度為代價)。這就需要InfluxDB提供的:連續查詢(Continuous Queries)。
查看當前的查詢策略
SHOW CONTINUOUS QUERIES
創建新的Continuous Queries
CREATE CONTINUOUS QUERY cq_30m ON testDB BEGIN SELECT mean(temperature) INTO weather30m FROM weather GROUP BY time(30m) END 注釋如下: cq_30m:連續查詢的名字 testDB:具體的數據庫名 mean(temperature): 算平均溫度 weather: 當前表名 weather30m: 存新數據的表名 30m:時間間隔為30分鍾
當我們插入新數據之后,通過SHOW MEASUREMENTS查詢發現。可以發現數據庫中多了一張名為weather30m(里面已經存着計算好的數據了)。這一切都是通過Continuous Queries自動完成的。
刪除Continuous Queries
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
四、RESTful 接口操作
插入及查詢操作:
#code from www.361way.com now=$(date '+%FT%T.000Z') tomorrow=$(date -v +1d '+%FT%T.000Z') echo "creating database" curl -G http://localhost:8086/query --data-urlencode "q=CREATE DATABASE foo" echo "creating retention policy" curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION INF REPLICATION 1 DEFAULT" echo "inserting data" curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$now\",\"fields\": {\"value\": 100}}]}" -H "Content-Type: application/json" http://localhost:8086/write echo "inserting data" curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$tomorrow\",\"fields\": {\"value\": 200}}]}" -H "Content-Type: application/json" http://localhost:8086/write sleep 1 echo "querying data" curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu" echo "querying data" curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu where time < now() + 10d"
GZIP壓縮數據插入及查詢:
#code from www.361way.com echo "inserting data" curl -v -i -H "Content-encoding: gzip" -H "Content-Type: application/json" -X POST -T foo.json.gz http://localhost:8086/write rm foo.json.gz echo "querying data with gzip encoding" curl -v -G --compressed http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT sum(value) FROM \"foo\".\"bar\".cpu GROUP BY time(1h)"
還可以指定數據保存策略及表的各關鍵值插入:
echo "creating retention policy" curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION 300d REPLICATION 3 DEFAULT" curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"uswest"},"time": "2015-02-26T22:01:11.703Z","fields": {"rx": 2342,"tx": 9804}}]}' -H "Content-Type: application/json" http://localhost:8086/write curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"useast"},"time": "2015-02-27T22:01:11.703Z","fields": {"rx": 4324,"tx": 7930}}]}' -H "Content-Type: application/json" http://localhost:8086/write
更多可以參考github上的測試內容。
無論是influx還是通過RESETful 參數進行查詢,其還有pertty參數可以使輸出的json格式更加美觀 。除此之外,influx命令還有column、CSV等格式輸出,influx命令支持通過import參數輸入類csv類格式的數據。
五、influxdb.conf配置web管理
當前版本的influxdb,默認情況下未開啟web管理功能。可以通過修改influxdb.conf文件中admin項的配置開啟web管理界面,具體如下:
[admin]
#Determines whether the admin service is enabled. enabled = true #The default bind address used by the admin service. bind-address = ":8083"