influxDB
influxDB
本文介绍了influxDB
时序数据库及Go语言操作influxDB
。
InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。
安装
2.2安装
将上一步的压缩包,解压到本地。
启动
浏览器打开访问8086端口,创建用户信息
1.7 安装
解压文件
修改配置文件
[meta]
# Where the metadata/raft database is stored
# dir = "/var/lib/influxdb/meta"
dir = "D:/software/influxdb-1.7.7-1/meta"
[data]
# The directory where the TSM storage engine stores TSM files.
dir = "D:/software/influxdb-1.7.7-1/data"
# The directory where the TSM storage engine stores WAL files.
wal-dir = "D:/software/influxdb-1.7.7-1/wal
启动
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
package main
import (
"fmt"
"log"
"time"
client "github.com/influxdata/influxdb1-client/v2"
)
// influxdb demo
func connInflux1() 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 queryDB1(cli client.Client, cmd string) (res []client.Result, err error) {
q := client.Query{
Command: cmd,
Database: "randy",
}
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 writesPoints1(cli client.Client) {
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: "randy",
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 := connInflux1()
fmt.Println(conn)
// insert
writesPoints1(conn)
// 获取10条数据并展示
qs := fmt.Sprintf("SELECT * FROM %s LIMIT %d", "cpu_usage", 10)
res, err := queryDB1(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)
}
}
}
influxDB 2.x版本
go get github.com/influxdata/influxdb-client-go
基本使用-influxDB 2.x版本
package main
import (
"context"
"fmt"
"github.com/influxdata/influxdb-client-go/v2"
"log"
"time"
)
/*
@author RandySun
@create 2021-09-17-8:58
*/
var bucket = "RandySun"
var org = "RandySun"
func connInflux() influxdb2.Client {
// 连接数据库客户端
token := "iLgyKP7N4-oTGKSj-vGVD8w9p-tHJQ-24BNouCfb4HEtHlSU-GeOCZ0cCWE3RauoSZDmVHJuB7Rg71Xd2b22sQ=="
url := "http://127.0.0.1:8086"
client := influxdb2.NewClient(url, token)
return client
}
// insert
func writesPoints(client influxdb2.Client, org, bucket string) {
tags := map[string]string{"cpu": "ih-cpu"}
fields := map[string]interface{}{
"idle": 201.1,
"system": 43.3,
"user": 86.6,
}
// 创建数据点
pt := influxdb2.NewPoint("cpu_usage", tags, fields, time.Now())
// 获取写入数据客户端
writeAPI := client.WriteAPIBlocking(org, bucket)
// 写入数据
writeAPI.WritePoint(context.Background(), pt)
log.Println("insert success")
}
//// query
func queryDB(client influxdb2.Client, org string) (err error) {
queryAPI := client.QueryAPI(org)
result, err := queryAPI.Query(context.Background(), `from(bucket:"RandySun")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu_usage")`)
if err == nil {
for result.Next() {
if result.TableChanged() {
fmt.Printf("table: %s\n", result.TableMetadata().String())
}
fmt.Printf("value: %v\n", result.Record().Value())
}
if result.Err() != nil {
fmt.Printf("query parsing error: %s\n", result.Err().Error())
}
} else {
panic(err)
}
return nil
}
func main() {
client := connInflux()
fmt.Println(client)
writesPoints(client, org, bucket)
queryDB(client, "RandySun")
}
在当下的阶段,必将由程序员来主导,甚至比以往更甚。