Documentation

在InfluxDB中管理订阅

此页面记录了 InfluxDB OSS 的早期版本。InfluxDB OSS v2 是最新的稳定版本。请参阅 InfluxDB v2 文档

InfluxDB 订阅是本地或远程端点,所有写入 InfluxDB 的数据都会被复制到这些端点。订阅主要用于 Kapacitor,但是任何能够接受 UDP、HTTP 或 HTTPS 连接的端点都可以订阅 InfluxDB,并接收所有数据的副本,因为数据被写入时。

订阅如何工作

当数据被写入InfluxDB时,写入通过HTTP、HTTPS或UDP以行协议的方式重复发送到订阅端点。 InfluxDB订阅服务创建多个“写入器”(goroutines), 它们将写入发送到订阅端点。

写入协程的数量由write-concurrency配置定义。

当写入发生在InfluxDB时,每个订阅写入器将写入的数据发送到指定的订阅端点。然而,随着高write-concurrency(多个写入器)和高摄取速率,写入进程和传输层中的纳秒级差异可能导致写入的接收顺序混乱。

关于高写入负载的重要信息

虽然将订阅者 write-concurrency 设置为大于 1 可以增加您的 订阅者写入吞吐量,但在高摄取速率下可能导致写入顺序错乱。 将 write-concurrency 设置为 1 确保写入按顺序传递给订阅者端点, 但在高摄取速率下可能会造成瓶颈。

设置write-concurrency的值取决于您的特定工作负载以及对顺序写入订阅端点的需求。

InfluxQL 订阅语句

使用以下InfluxQL语句来管理订阅:

CREATE SUBSCRIPTION
SHOW SUBSCRIPTIONS
DROP SUBSCRIPTION

创建订阅

使用 CREATE SUBSCRIPTION InfluxQL 语句创建订阅。指定订阅名称、要订阅的数据库名称和保留策略,以及要将写入到 InfluxDB 的数据复制到的主机的 URL。

-- Pattern:
CREATE SUBSCRIPTION "<subscription_name>" ON "<db_name>"."<retention_policy>" DESTINATIONS <ALL|ANY> "<subscription_endpoint_host>"

-- Examples:
-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that sends data to 'example.com:9090' via HTTP.
CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ALL 'http://example.com:9090'

-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that round-robins the data to 'h1.example.com:9090' and 'h2.example.com:9090' via UDP.
CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ANY 'udp://h1.example.com:9090', 'udp://h2.example.com:9090'

如果在订阅者主机上启用了身份验证,请调整URL以包含凭据。

-- Create a SUBSCRIPTION on database 'mydb' and retention policy 'autogen' that sends data to another InfluxDB on 'example.com:8086' via HTTP. Authentication is enabled on the subscription host (user: subscriber, pass: secret).
CREATE SUBSCRIPTION "sub0" ON "mydb"."autogen" DESTINATIONS ALL 'http://subscriber:secret@example.com:8086'

SHOW SUBSCRIPTIONS 输出所有订阅者的URL为纯文本,包括带有身份验证凭据的URL。任何具有运行SHOW SUBSCRIPTIONS 权限的用户都能够看到这些凭据。

将订阅数据发送到多个主机

这个 CREATE SUBSCRIPTION 语句允许您指定多个主机作为订阅的端点。 在您的 DESTINATIONS 子句中,您可以传递多个以逗号分隔的主机字符串。 在 DESTINATIONS 子句中使用 ALLANY 决定 InfluxDB 如何将数据写入每个端点:

ALL: 将数据写入所有指定的主机。

ANY: 在指定的主机之间轮询写入。

多个主机的订阅

-- Write all data to multiple hosts
CREATE SUBSCRIPTION "mysub" ON "mydb"."autogen" DESTINATIONS ALL 'http://host1.example.com:9090', 'http://host2.example.com:9090'

-- Round-robin writes between multiple hosts
CREATE SUBSCRIPTION "mysub" ON "mydb"."autogen" DESTINATIONS ANY 'http://host1.example.com:9090', 'http://host2.example.com:9090'

订阅协议

订阅可以使用 HTTP、HTTPS 或 UDP 传输协议。 使用哪个协议由订阅端点预期的协议决定。 如果创建 Kapacitor 订阅,则在您的 kapacitor.conf[[influxdb]] 部分中由 subscription-protocol 选项定义。

kapacitor.conf

[[influxdb]]

  # ...

  subscription-protocol = "http"

  # ...

有关 HTTPS 连接和 InfluxDB 与 Kapacitor 之间安全通信的信息,请查看 Kapacitor security 文档。

显示订阅

SHOW SUBSCRIPTIONS InfluxQL 语句返回 InfluxDB 中注册的所有订阅的列表。

SHOW SUBSCRIPTIONS

示例输出:

name: _internal
retention_policy name                                           mode destinations
---------------- ----                                           ---- ------------
monitor          kapacitor-39545771-7b64-4692-ab8f-1796c07f3314 ANY  [http://localhost:9092]

取消订阅

使用 DROP SUBSCRIPTION InfluxQL 语句移除或删除订阅。

-- Pattern:
DROP SUBSCRIPTION "<subscription_name>" ON "<db_name>"."<retention_policy>"

-- Example:
DROP SUBSCRIPTION "sub0" ON "mydb"."autogen"

取消所有订阅

在某些情况下,可能需要移除所有订阅。 运行以下bash脚本,该脚本利用influx CLI,循环遍历所有订阅并将其移除。 此脚本依赖于$INFLUXUSER$INFLUXPASS环境变量。 如果这些变量未设置,请将其作为脚本的一部分导出。

# Environment variable exports:
# Uncomment these if INFLUXUSER and INFLUXPASS are not already globally set.
# export INFLUXUSER=influxdb-username
# export INFLUXPASS=influxdb-password

IFS=$'\n'; for i in $(influx -format csv -username $INFLUXUSER -password $INFLUXPASS -database _internal -execute 'show subscriptions' | tail -n +2 | grep -v name); do influx -format csv -username $INFLUXUSER -password $INFLUXPASS -database _internal -execute "drop subscription \"$(echo "$i" | cut -f 3 -d ',')\" ON \"$(echo "$i" | cut -f 1 -d ',')\".\"$(echo "$i" | cut -f 2 -d ',')\""; done

配置 InfluxDB 订阅

InfluxDB 订阅配置选项可在 [subscriber] 部分的 influxdb.conf 中找到。要使用订阅,[subscriber] 部分中的 enabled 选项必须设置为 true。以下是一个 influxdb.conf 订阅者配置示例:

[subscriber]
  enabled = true
  http-timeout = "30s"
  insecure-skip-verify = false
  ca-certs = ""
  write-concurrency = 40
  write-buffer-size = 1000

关于 [subscriber] 配置选项的描述可以在 Configuring InfluxDB 文档中找到。

故障排除

不可访问或已停用的订阅端点

除非订阅被 dropped,InfluxDB 假定端点应该始终接收数据,并将继续尝试发送数据。如果端点主机无法访问或已被退役,您将看到类似以下的错误:

# Some message content omitted (...) for the sake of brevity
"Post http://x.y.z.a:9092/write?consistency=...: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)" ... service=subscriber
"Post http://x.y.z.a:9092/write?consistency=...: dial tcp x.y.z.a:9092: getsockopt: connection refused" ... service=subscriber
"Post http://x.y.z.a:9092/write?consistency=...: dial tcp 172.31.36.5:9092: getsockopt: no route to host" ... service=subscriber

在某些情况下,这可能是由于网络错误或类似问题导致无法成功连接到订阅端点。 在其他情况下,这是因为订阅端点不再存在,并且订阅未从InfluxDB中删除。

因为 InfluxDB 不知道一个订阅端点是否会再次变得可访问,当一个端点变得不可访问时,订阅不会自动删除。如果移除一个订阅端点,您必须手动 删除订阅 以便从 InfluxDB 中移除。



Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: