在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 SUBSCRIPTIONSHOW SUBSCRIPTIONSDROP 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 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 中移除。