在 InfluxDB 中管理订阅

在 InfluxDB 中管理订阅

链接:https://docs.influxdata.com/influxdb/v1.7/administration/subscription-management/

此页记录了早期版本的 InfluxDB。InfluxDB v1.8是最新的稳定版本。在 v1.8 文档中查看此页面

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

订阅的工作方式

当数据写入 InfluxDB 时,写入通过行协议中的 HTTP、HTTPS 或 UDP 复制到订阅者终结点。InfluxDB 订户服务创建多个”编写器“(go例程),这些”编写器”向订阅终结点发送写入。

编写器 gorous 的数量由写入并发配置定义。

当在 InfluxDB 中发生写入时,每个订阅编写器都会将写入的数据发送到指定的订阅终结点。但是,由于写入器过程和高(多个写入器)和高接收率,写入器进程和传输层的纳秒差异可能会导致写入接收顺序不一。write-concurrency

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

虽然将订阅者设置为大于 1 确实会增加订阅者写入吞吐量,但可能会导致在高吞吐速率下导致订单外写入。设置为 1 可确保写入按顺序传递到订阅者终结点,但在高摄入率下可能会造成瓶颈。write-concurrency``write-concurrency

应设置什么取决于您的特定工作负荷和对订阅终结点的按顺序写入需求。write-concurrency

影响QL 订阅语句

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

创建订阅
显示订阅
删除订阅

创建订阅

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

-- 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

向多个主机发送订阅数据

该语句允许您将多个主机指定为订阅的终结点。在子句中,可以传递多个用逗号分隔的主机字符串。使用 或 在 子句中确定 InfluxDB 如何将数据写入每个终结点:CREATE SUBSCRIPTION``DESTINATIONS``ALL``ANY``DESTINATIONS

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 部分中的选项定义subscription-protocol``[[influxdb]]

卡帕西托. conf

[[influxdb]]

  # ...

  subscription-protocol = "http"

  # ...

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

显示订阅

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

SHOW SUBSCRIPTIONS

输出示例:

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

删除订阅

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

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

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

删除所有订阅

在某些情况下,可能需要删除所有订阅。运行以下 bash 脚本,该脚本利用 CLI,循环浏览所有订阅,并删除它们。此脚本取决于 和 环境变量。如果未设置这些,请将它们导出为脚本的一部分。influx``$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``enabled``[subscriber]``true``influxdb.conf

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

[订阅者] 配置选项的说明可在配置影响数据库文档中提供。

故障 排除

无法访问或停用的订阅终结点

除非删除订阅否则,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中删除订阅。