使用Go InfluxDB v3客户端库

导航到

在本教程中,我们将学习如何使用Go InfluxDB v3客户端库。InfluxDB 3.0是InfluxDB的最新版本,相比之前版本有着显著的性能提升。[InfluxDB 3.0]提供了以下亮点:

  • InfluxDB 3.0的写入吞吐量比InfluxDB OSS提升了45倍。
  • InfluxDB 3.0的存储压缩比InfluxDB OSS提高了4.5倍。
  • InfluxDB 3.0在给定硬件资源下更高效,与InfluxDB OSS相比,可以降低存储成本超过90%。
  • InfluxDB 3.0的查询速度在广泛的查询类型上比InfluxDB OSS快2.5-45倍,特别是在最近的数据(5分钟)上。
  • InfluxDB 3.0的查询速度在广泛的查询类型上比InfluxDB OSS快5-25倍,特别是在过去1小时的时间范围内。

Go InfluxDB v3客户端库是一个软件包,提供了一组工具和函数,用于使用Go编程语言与InfluxDB交互。它允许开发者高效地从/到InfluxDB 3.0查询和写入时序数据,简化了InfluxDB与Go应用程序的集成。与之前的Go客户端库版本一样,v3通过/write API端点实现写入。查询与之前的版本略有不同,因为它使用Apache Arrow Flight客户端库,并利用Arrow格式和Flight gRPC协议提供高效的序列化和反序列化以及双向流。

要求、安装和初始化

为了完成本教程,您需要以下内容:

将客户端包的最新版本添加到您的项目依赖项(go.mod)

go get github.com/InfluxCommunity/influxdb3-go/influxdb3

要初始化客户端,您需要将包导入到您的main.go文件中,并提供您的凭据

package main.go

import (
	"context"
	"fmt"
	"os"
	"time"

	"github.com/InfluxCommunity/influxdb3-go/influxdb3"
)
func main() {
	// Use env variables to initialize client
	url := os.Getenv("INFLUXDB_URL")
	token := os.Getenv("INFLUXDB_TOKEN")
	database := os.Getenv("INFLUXDB_DATABASE")

	// Create a new client using an InfluxDB server base URL and an authentication token
client, err := influxdb3.New(influxdb3.ClientConfig{
    Host: url,
    Token: token,
    Database: database,
})

使用Go InfluxDB v3客户端库写入数据

要将数据写入InfluxDB,请调用client.Write,并使用行协议格式的数据和数据库(或bucket)名称。行协议是InfluxDB的摄入格式。当向InfluxDB写入行协议点时,使用标签将元数据存储在实例中。字段包含您实际的时间序列值。然而,字段和标签在InfluxDB中的表中都转换为列。实际上,这些列在数据库中的功能相同,因此这种区别仅用于用户的组织目的。数据是同步写入的。以下是将行协议写入InfluxDB的示例:

line := "stat,unit=temperature avg=23.5,max=45.0"
err = client.Write(context.Background(), database, []byte(line))
if err != nil {
		panic(err)
	}

另一种方法是使用 client.WritePoints 方法来写入点对象。您还可以将点或线协议追加到数组中,并通过将数组传递给 client.WritePoints 方法来将点数组写入 InfluxDB。

// Create point using full params constructor
	p := influx.NewPoint("stat",
		map[string]string{"unit": "temperature"},
		map[string]interface{}{"avg": 24.5, "max": 45.0},
		time.Now())
	// write point synchronously
	err = client.WritePoints(context.Background(), database, p)
	if err != nil {
		panic(err)
	}

关于 upsert 的注意事项

您可以 upsert 字段但不能 upsert 标签。例如,如果您添加第二个点(注意字段值中添加了“2”),则将 upsert 那些字段值,并且您的旧值将被新字段值覆盖

# Adding first point
line := "stat,unit=temperature avg=23.5,max=45.0 1690218372000000000"
err = client.Write(context.Background(), database, []byte(line))
if err != nil {
		panic(err)
	}

# Adding second point
line := "stat,unit=temperature avg=23.52,max=45.2 1690218378000000000"
err = client.Write(context.Background(), database, []byte(line))
if err != nil {
		panic(err)

然而,如果您添加第二个点(注意标签中添加了“2”),则不会 upsert 那些值。您只会添加更多标签值。

# Adding first point
line := "stat,unit=temperature avg=23.5,max=45.0 1690218372000000000"
err = client.Write(context.Background(), database, []byte(line))
if err != nil {
		panic(err)
	}

# Adding second point
line := "stat,unit=temperature2 avg=23.52,max=45.2 1690218378000000000"
err = client.Write(context.Background(), database, []byte(line))
if err != nil {
		panic(err)

使用 Go InfluxDB v3 客户端库查询数据

您可以使用 Go InfluxDB v3 客户端库使用 SQL 和 InfluxQL(InfluxDB 的类似 SQL 的查询语言,专为时序数据设计)查询 InfluxDB 3.0。

SQL

默认情况下,client.Query 方法使用 SQL 查询 InfluxDB。您只需构造您的 SQL 查询,并将其与您要查询的数据库名称一起传递给该方法。

query := `
			SELECT *
			FROM "stat"
			WHERE
			time >= now() - interval '5 minute'
			AND
			"unit" IN ('temperature')
	`

	iterator, err := client.Query(context.Background(), query)

	if err != nil {
		panic(err)
	}

	for iterator.Next() {
		value := iterator.Value()

		fmt.Printf("avg is %f\n", value["avg"])
		fmt.Printf("max is %f\n", value["max"])
	}

InfluxQL

您可以使用 client.QueryWithOptions 方法使用 InfluxQL 查询 InfluxDB。在这种方法中,您创建选项并将它们传递给该方法。

influxQLQuery := "SHOW MEASUREMENTS"

	options := influxdb3.QueryOptions{
		QueryType: influxdb3.InfluxQL,
	}

	iterator, err := client.QueryWithOptions(context.Background(), &options, influxQLQuery)

	if err != nil {
		panic(err)
	}

	for iterator.Next() {
		value := iterator.Value()
		fmt.Printf("measurement is:", value["name"])
	}

最后思考

InfluxDB 是存储所有时序数据的一个优秀工具。它基于 Apache 生态系统编写,并利用了 DataFusionArrowParquet 等技术,以实现高效的写入、存储和查询。它还提供了与其他许多工具的互操作性,因此您可以利用它们来满足特定的预测分析需求。Go 客户端库有助于支持这种互操作性。

在这里开始使用 InfluxDB Cloud 3.0。如果您需要任何帮助,请通过我们的 社区网站Slack 频道联系我们。我很乐意了解您试图实现的目标以及您希望 InfluxDB 拥有的功能。