zoukankan      html  css  js  c++  java
  • influxDB

    influxDB

    本文介绍了influxDB时序数据库及Go语言操作influxDB

    InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

    教程

    安装

    下载地址

    文档

    github

    2.2下载

    image-20210924075044227

    2.2安装

    image-20210917083903150

    将上一步的压缩包,解压到本地。

    image-20210917084039492

    启动

    image-20210922230042917

    浏览器打开访问8086端口,创建用户信息

    image-20210922230137822

    1.7 安装

    1.7基本命令官方文档

    1.17下载

    解压文件

    image-20210923225242297

    修改配置文件

    [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
    

    启动

    image-20210923231253452

    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版本

    image-20210924081235313

    github

    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)
    		}
    	}
    }
    
    

    image-20210924081506953

    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")
    }
    
    

    image-20210923075931979

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    大咖们如何评判优秀架构师?
    腾讯会议大规模任务调度系统架构设计
    计算压力倍增,携程度假起价引擎架构演变
    快手春节红包背后,高并发存储架构设计
    日均20亿流量:携程机票查询系统的架构升级
    我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程
    OGRE
    CMake
    深入理解C++11【5】
    深入理解C++11【4】
  • 原文地址:https://www.cnblogs.com/randysun/p/15676131.html
Copyright © 2011-2022 走看看