文档文档

在 InfluxDB 中管理订阅

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

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

订阅的工作原理

当数据写入 InfluxDB 时,写入会通过 HTTP、HTTPS 或 UDP 以 Line Protocol 复制到订阅端点。InfluxDB 订阅者服务创建多个“写入器”(goroutines),这些写入器将写入发送到订阅端点。

写入器 goroutine 的数量由 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 安全性 文档。

显示订阅

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

SHOW SUBSCRIPTIONS

示例输出

name: _internal
retention_policy name                                           mode destinations
---------------- ----                                           ---- ------------
monitor          kapacitor-39545771-7b64-4692-ab8f-1796c07f3314 ANY  [https://127.0.0.1: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 订阅配置选项在 influxdb.conf[subscriber] 部分中可用。为了使用订阅,[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] 配置选项的描述在 配置 InfluxDB 文档中提供。

故障排除

无法访问或已停用的订阅端点

除非订阅被 删除,否则 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 开源版本现已可用于 Alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个作为 Alpha 版本一部分的产品。

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

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