在 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
子句中使用 ALL
或 ANY
决定了 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 中删除订阅。
此页对您有帮助吗?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您提供关于 InfluxDB 和此文档的反馈和错误报告。要寻求支持,请使用以下资源
拥有年度合同或支持合同的客户可以联系 InfluxData 支持。