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

安装

下载

https://portal.influxdata.com/downloads/
这里需要注意因为这个网站引用了google的api所以国内点页面的按钮是没反应的,怎么办呢?
按照下图所示,按F12打开浏览器的控制台,然后点击Elements,按下Ctrl/Command+F搜索releases/influxdb,按回车查找自己所需版本的下载地址。influxDB - 图1
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版本

  1. go get github.com/influxdata/influxdb1-client/v2

influxDB 2.x版本

  1. go get github.com/influxdata/influxdb-client-go

基本使用

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "time"
  6. client "github.com/influxdata/influxdb1-client/v2"
  7. )
  8. // influxdb demo
  9. func connInflux() client.Client {
  10. cli, err := client.NewHTTPClient(client.HTTPConfig{
  11. Addr: "http://127.0.0.1:8086",
  12. Username: "admin",
  13. Password: "",
  14. })
  15. if err != nil {
  16. log.Fatal(err)
  17. }
  18. return cli
  19. }
  20. // query
  21. func queryDB(cli client.Client, cmd string) (res []client.Result, err error) {
  22. q := client.Query{
  23. Command: cmd,
  24. Database: "test",
  25. }
  26. if response, err := cli.Query(q); err == nil {
  27. if response.Error() != nil {
  28. return res, response.Error()
  29. }
  30. res = response.Results
  31. } else {
  32. return res, err
  33. }
  34. return res, nil
  35. }
  36. // insert
  37. func writesPoints(cli client.Client) {
  38. bp, err := client.NewBatchPoints(client.BatchPointsConfig{
  39. Database: "test",
  40. Precision: "s", //精度,默认ns
  41. })
  42. if err != nil {
  43. log.Fatal(err)
  44. }
  45. tags := map[string]string{"cpu": "ih-cpu"}
  46. fields := map[string]interface{}{
  47. "idle": 201.1,
  48. "system": 43.3,
  49. "user": 86.6,
  50. }
  51. pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now())
  52. if err != nil {
  53. log.Fatal(err)
  54. }
  55. bp.AddPoint(pt)
  56. err = cli.Write(bp)
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60. log.Println("insert success")
  61. }
  62. func main() {
  63. conn := connInflux()
  64. fmt.Println(conn)
  65. // insert
  66. writesPoints(conn)
  67. // 获取10条数据并展示
  68. qs := fmt.Sprintf("SELECT * FROM %s LIMIT %d", "cpu_usage", 10)
  69. res, err := queryDB(conn, qs)
  70. if err != nil {
  71. log.Fatal(err)
  72. }
  73. for _, row := range res[0].Series[0].Values {
  74. for j, value := range row {
  75. log.Printf("j:%d value:%v\n", j, value)
  76. }
  77. }
  78. }