1、添加依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.tire.net</groupId> <artifactId>tire</artifactId> <version>0.0.1-SNAPSHOT</version> <name>tire</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- influxdb架包 --> <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、添加配置文件
spring: influx: url: * password: admin user: 123 database: test_data application: name: tire-net server: port: 8081
package com.tire.net.configure; import com.tire.net.utils.InfluxDbUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author bai */ @Configuration public class InfluxDbConfig { @Value("${spring.influx.url:''}") private String influxDBUrl; @Value("${spring.influx.user:''}") private String userName; @Value("${spring.influx.password:''}") private String password; @Value("${spring.influx.database:''}") private String database; @Bean public InfluxDbUtils influxDbUtils() { return new InfluxDbUtils(userName, password, influxDBUrl, database, ""); } }
package com.tire.net.utils; import lombok.Data; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Query; /** * @author bai */ @Data public class InfluxDbUtils { private String userName; private String password; private String url; public String database; private String retentionPolicy; /** * InfluxDB實例 */ private InfluxDB influxDB; public InfluxDbUtils(String userName, String password, String url, String database, String retentionPolicy) { this.userName = userName; this.password = password; this.url = url; this.database = database; this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy; this.influxDB = influxDbBuild(); } /** * 連接數據庫 ,若不存在則創建 * * @return influxDb實例 */ private InfluxDB influxDbBuild() { if (influxDB == null) { influxDB = InfluxDBFactory.connect(url, userName, password); } try { createDB(database); influxDB.setDatabase(database); } catch (Exception e) { } finally { influxDB.setRetentionPolicy(retentionPolicy); } influxDB.setLogLevel(InfluxDB.LogLevel.BASIC); return influxDB; } /**** * 創建數據庫 * @param database */ private void createDB(String database) { influxDB.query(new Query("CREATE DATABASE " + database)); } }
參考:https://www.hangge.com/blog/cache/detail_3009.html
官網文檔:https://docs.influxdata.com/influxdb/v1.8/
基礎命令:
create database mydb
show databases
use mydb
insert cpu,host=servera,region=us_west value=0.64
select ''host",from 'cup'
SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'
InfluxQL允許您在WHERE子句中指定查詢的時間范圍。您可以使用日期時間字符串,這些日期時間字符串用單引號引起來,其格式為YYYY-MM-DD HH:MM:SS.mmm (mmm是毫秒,是可選的,還可以指定微秒或納秒)。您還可以使用相對時間now()來引用服務器的當前時間戳:
SELECT * FROM "foodships" WHERE time > now() - 1h
刪除方法:
您可以刪除或刪除序列,但不能刪除或刪除基於字段值的單個點。解決方法是,您可以搜索字段值,檢索時間,然后根據time字段進行刪除。
CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAUL
制定52周的保留政策
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
查看保留策略
show retention policies on influxdb
修改保留策略
alter retention policy ''influx_retention" on influxdb duration 15d
刪除保留策略
drop retention policy "influx_retention" on influxdb
注意:保留策略是對數據庫設置的
influxd -config /etc/influxdb/influxdb.conf
3、docker部署influxdb
docker pull influxdb:1.7
4、安裝和配置grafana
docker安裝部署
docker pull grafana/grafana:7.4.3
docker run -d -p 8093:8083 -p 8086:8086 -v influxdb:/var/lib/influxdb influxdb:1.7
docker run -d -p 6060:3000 --name grafana grafana/grafana:7.4.3
參考:https://grafana.com/docs/grafana/latest/?utm_source=grafana_gettingstarted
https://blog.csdn.net/yy756127197/article/details/103411325
時序數據庫介紹
時序數據是一組按照時間維度索引的數據。時序數據在日常生活中隨處可見,比如每個整點的溫度、濕度等天氣數據,每分鍾的股票價格數據等。我們常用曲線圖、柱狀圖等形式去展現時序數據,也就是我們常常聽到的“數據可視化”。
時序數據庫是一種非關系型數據庫,以時間作為數據主鍵,專門用來存儲時序數據。
時序數據庫的特點
-
高壓縮比:由於數據每分每秒都在變化,海量的時序數據往往體量巨大,占用大量硬件資源,所以需要優化數據壓縮算法提高數據壓縮比。
-
高並發寫入:時序數據庫采用持續高並發寫入數據,無更新的方式,對於時間相同的重復的數據,只保留一份。
-
低延時、高並發查詢:通過索引降低查詢延時,通過緩存等技術提高數據並發能力。
時序數據庫的使用場景
-
IOT行業:電力、化工等工業物聯網數據監測
-
金融行業:各類金融產品及其衍生品、數字貨幣數據存儲與量化研究
-
IT行業:服務器、虛擬機、容器等的狀態數據實時監測
-
互聯網行業:用戶行為軌跡,日志等數據。
-
……
InfluxDB特性
-
專為時間序列數據編寫的定制高性能數據存儲。TSM引擎可實現高提取速度和數據壓縮
-
完全用Go編寫。它可以編譯為一個沒有外部依賴項的二進制文件。
-
簡單,高性能的寫入和查詢HTTP API。
-
插件支持其他數據協議,例如Graphite,collected和OpenTSDB。
-
類似於SQL的富有表現力的查詢語言,旨在輕松查詢聚合數據。
-
標簽允許對系列進行索引,以進行快速有效的查詢。
-
保留策略可以有效地自動過期數據。
-
連續查詢會自動計算聚合數據,從而使頻繁查詢更加有效。
本教程基於InfluxDB v1.8
InfluxDB安裝與啟動
InfluxDB安裝非常簡單,根據操作系統執行對應的安裝命令即可。
安裝
Ubuntu和Debian
SHA256: ad4058db83f424dad21337f3d7135de921498b652d67e2fcd2e2e070d2997a2d
wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.4_amd64.deb sudo dpkg -i influxdb_1.8.4_amd64.deb
RedHat和CentOS
SHA256: f13cc117d3763908f045fc244f95948d0a1637459518a81e3bb4f8ba1f202e35
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4.x86_64.rpm sudo yum localinstall influxdb-1.8.4.x86_64.rpm
Mac OS X
SHA256: d69be0c5b798096dfe53440f10cd350fd7cd68517c3ffe774451de5e63fa1284
https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_darwin_amd64.tar.gz tar zxvf influxdb-1.8.4_darwin_amd64.tar.gz
Windows二進制文件(64位)
SHA256: 09c63a0afc3587a827670504d0354f0926192a046961838c922dbe8bd5a71783
https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_windows_amd64.zip unzip influxdb-1.8.4_windows_amd64.zip
Docker鏡像
docker pull influxdb:1.8
OS X(通過Homebrew)
brew update brew install influxdb@1.8.4
啟動
啟動influx數據服務
命令行執行以下命令
sudo service influxdb start
如果操作系統使用的是systemd(Ubuntu 15.04 +,Debian 8+,CentOS 7 +,RHEL 7+)
sudo systemctl start influxdb
設置開機自動啟動
sudo systemctl enable influxdb
進入CLI(命令行界面)
在命令行輸入命令influx即可啟動CLI,並自動連接到本地InfluxDB實例。
$ influx
Connected to http://localhost:8086 version 1.8.4 InfluxDB shell version: 1.8.4 >
默認情況下,InfluxDB API在8086端口上運行。因此,influx將默認連接到端口localhost:8086。如果需要更改這些默認值,請運行influx --help。
InfluxDB名詞解釋
時序數據庫由於其存儲海量時序數據的特性,因此與傳統數據庫有些許不同,本文對influxdb時序數據庫中涉及的基本概念作出解釋。
influxdb中的database、measurement、point
database:數據庫,同Mysql等關系型數據庫中的“數據庫Database”
measurement:數據表,相當於關系型數據庫中的“表Table”
point:數據點,表示單條數據記錄,相當於關系型數據庫中的“一行數據”
由於database和measurement與傳統數據庫基本相同,這里不做過多解釋,以下針對influxdb中特有的Point進行講解。
Point
Point由時間(time)、數據(field)、標簽(tags)三類字段組成。
time:代表每條數據的時間字段,是measurement中的數據主鍵,因此time字段具有索引屬性。一條point只能有一個time。
field:代表各種數據的字段,例如氣溫、壓力、股價等,field字段沒有索引屬性。一條point可以包括多個field。
tag:代表各類非數據字段,例如設備編碼、地區、姓名等,tag字段有索引屬性。一條point可以包括多個tag。
例子
兩位科學家langstroth和perpetua於2015年8月18日在兩個不同位置進行一項計算蝴蝶和蜜蜂數量的統計實驗。假設他們使用同一個database,並使用同一個名為census的measurement錄入數據。以下表示某一個point的樣例數據:
其中time為time字段。butterflies和honeybees分別代表蝴蝶和蜜蜂的數量,因此他們是field字段。location和scientist代表科學家的位置和名字,因此他們是tag字段。
InfluxDB查詢語言(InfluxQL)
InfluxQL
InfluxQL是一種類似於SQL的查詢語言,用於與InfluxDB進行交互。如果你使用過關系數據庫及SQL,那么你可以很快速的掌握InfluxQL。
然而,InfluxQL不完全是SQL,缺乏SQL中的一些高級的語法,例如UNION,JOIN,HAVING等,這些高級語法可以在InfluxDB的另一種專用查詢語言Flux中使用。本文介紹InfluxQL語言的使用方法。
數據庫操作
# 使用Command命令行進入influxdb influx # 創建數據庫 CREATE DATABASE mydb # 顯示所有數據庫 SHOW DATABASES # 刪除數據庫 DROP DATABASE mydb # 使用數據庫 USE mydb
表操作
創建表:InfluxDB沒有專門的創建表的命令,當插入一條數據point至某A表時,此A表會自動創建,並且表的格式、字段名、字段類型也由此條插入命令決定。
修改表:InfluxDB沒有修改表的命令,但當插入一條新數據point至表A時,如果此point中的字段多於原A表的字段,會自動修改A表與此條插入數據的格式字段等一致。注意此種情況僅限於新插入的數據字段與表A字段的交集即表A的情況,否則例如新插入數據字段與表A完全不同會插入失敗。
查詢表:
# 顯示該數據庫中的表 SHOW MEASUREMENTS
刪除表:
DROP MEASUREMENT "measurementName"
參考官網教程地址;https://docs.influxdata.com/influxdb/v1.7/
用戶管理
#顯示用戶 show users #創建用戶 create user "username" with password 'password' #創建管理員權限用戶 create user "username" with password 'password' with all privileges #刪除用戶 drop user "username"
特別注意:
group by您不能用於GROUP BY
對字段進行分組。
GROUP BY *
按所有標簽對結果進行分組
GROUP BY <tag_key>
按特定標簽對結果進行分組
GROUP BY <tag_key>,<tag_key>
按多個標簽對結果進行分組。標簽鍵的順序無關緊要。
如果查詢包含WHERE
子句,則該GROUP BY
子句必須出現在該WHERE
子句之后。
tag和field設計
tag是字符串,field支持int,float類型,tag有索引,field沒有
tag選擇:經常查詢數據,需要group by
字段選擇:用於函數計算,非字符串
保留策略和分片
常見錯誤
InfluxDB數據庫報錯ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".
報錯的意思是要驗證
執行auth命令進行授權驗證,賬戶和密碼必須是數據庫管理員權限
系統架構
influxdb查詢設置北京時間
InfluxDB默認以UTC時間存儲並返回時間戳,當接收到一個時序數據記錄時,InfluxDB將時間戳從本地時區時間轉換為UTC時間並存儲,查詢時,InfluxDB返回的時間戳對應的是UTC時間。InfluxDB支持通過在tz()子句中指定TZ格式的時區名字,如Asia/Shanghai,將UTC時間轉換為中國本地時間。
SELECT * FROM "cpu" WHERE time > now() - 5m tz('Asia/Shanghai')
SELECT * FROM "system" WHERE time > now() - 5m tz('Asia/Shanghai')
登錄問題:
InfluxDB數據庫報錯ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".