使用Go InfluxDB v3客户端库
作者:Anais Dotis-Georgiou / 产品
2023年9月7日
导航到
在本教程中,我们将学习如何使用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 生态系统编写,并利用了 DataFusion、Arrow 和 Parquet 等技术,以实现高效的写入、存储和查询。它还提供了与其他许多工具的互操作性,因此您可以利用它们来满足特定的预测分析需求。Go 客户端库有助于支持这种互操作性。
在这里开始使用 InfluxDB Cloud 3.0。如果您需要任何帮助,请通过我们的 社区网站 或 Slack 频道联系我们。我很乐意了解您试图实现的目标以及您希望 InfluxDB 拥有的功能。