influxDB
本文介紹了influxDB
時序數據庫及Go語言操作influxDB
。
InfluxDB是一個開源分布式時序、事件和指標數據庫。使用Go語言編寫,無需外部依賴。其設計目標是實現分布式和水平伸縮擴展。
安裝
下載
https://portal.influxdata.com/downloads/
這里需要注意因為這個網站引用了google的api所以國內點頁面的按鈕是沒反應的,怎么辦呢?
按照下圖所示,按F12
打開瀏覽器的控制台,然后點擊Elements
,按下Ctrl/Command+F
搜索releases/influxdb
,按回車查找自己所需版本的下載地址。
Mac和Linux用戶可以點擊https://v2.docs.influxdata.com/v2.0/get-started/下載。
安裝
將上一步的壓縮包,解壓到本地。
influxDB介紹
名詞介紹
influxDB名詞 | 傳統數據庫概念 |
---|---|
database | 數據庫 |
measurement | 數據表 |
point | 數據行 |
point
influxDB中的point相當於傳統數據庫里的一行數據,由時間戳(time)、數據(field)、標簽(tag)組成。
Point屬性 | 傳統數據庫概念 |
---|---|
time | 每個數據記錄時間,是數據庫中的主索引 |
field | 各種記錄值(沒有索引的屬性),例如溫度、濕度 |
tags | 各種有索引的屬性,例如地區、海拔 |
Series
Series
相當於是 InfluxDB 中一些數據的集合,在同一個 database 中,retention policy、measurement、tag sets 完全相同的數據同屬於一個 series,同一個 series 的數據在物理上會按照時間順序排列存儲在一起。
Go操作influxDB
安裝
influxDB 1.x版本
go get github.com/influxdata/influxdb1-client/v2
influxDB 2.x版本
go get github.com/influxdata/influxdb-client-go
基本使用
package main
import (
"fmt"
"log"
"time"
client "github.com/influxdata/influxdb1-client/v2"
)
// influxdb demo
func connInflux() client.Client {
cli, err := client.NewHTTPClient(client.HTTPConfig{
Addr: "http://127.0.0.1:8086",
Username: "admin",
Password: "",
})
if err != nil {
log.Fatal(err)
}
return cli
}
// query
func queryDB(cli client.Client, cmd string) (res []client.Result, err error) {
q := client.Query{
Command: cmd,
Database: "test",
}
if response, err := cli.Query(q); err == nil {
if response.Error() != nil {
return res, response.Error()
}
res = response.Results
} else {
return res, err
}
return res, nil
}
// insert
func writesPoints(cli client.Client) {
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: "test",
Precision: "s", //精度,默認ns
})
if err != nil {
log.Fatal(err)
}
tags := map[string]string{"cpu": "ih-cpu"}
fields := map[string]interface{}{
"idle": 201.1,
"system": 43.3,
"user": 86.6,
}
pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now())
if err != nil {
log.Fatal(err)
}
bp.AddPoint(pt)
err = cli.Write(bp)
if err != nil {
log.Fatal(err)
}
log.Println("insert success")
}
func main() {
conn := connInflux()
fmt.Println(conn)
// insert
writesPoints(conn)
// 獲取10條數據並展示
qs := fmt.Sprintf("SELECT * FROM %s LIMIT %d", "cpu_usage", 10)
res, err := queryDB(conn, qs)
if err != nil {
log.Fatal(err)
}
for _, row := range res[0].Series[0].Values {
for j, value := range row {
log.Printf("j:%d value:%v\n", j, value)
}
}
}