7个版本

1.0.0-alpha.62024年8月6日
1.0.0-alpha.52024年7月26日
1.0.0-alpha.2 2024年6月21日
0.11.0 2024年6月4日
0.10.1-rc2023年12月21日

174数据库接口

Download history 78/week @ 2024-04-24 60/week @ 2024-05-01 88/week @ 2024-05-08 46/week @ 2024-05-15 12/week @ 2024-05-22 76/week @ 2024-05-29 68/week @ 2024-06-05 3/week @ 2024-06-12 82/week @ 2024-06-19 5/week @ 2024-06-26 95/week @ 2024-07-10 3/week @ 2024-07-17 125/week @ 2024-07-24 67/week @ 2024-07-31 58/week @ 2024-08-07

每月254次 下载

EPL-2.0 OR Apache-2.0

58KB
814

CI Discussion Discord License License

Eclipse Zenoh

Eclipse Zenoh:零开销的发布/订阅、存储/查询和计算。

Zenoh(发音为 /zeno/)统一了动态数据、静态数据和计算。它巧妙地将传统的发布/订阅与地理分布式存储、查询和计算相结合,同时保持了超越任何主流堆栈的时间空间效率。

请访问网站 zenoh.io路线图 以获取更多信息。


InfluxDB后端

在Zenoh中,后端是一种存储技术(如数据库管理系统、时间序列数据库、文件系统等),允许通过zenoh存储键/值发布并通过查询返回它们。有关详细信息,请参阅zenoh文档

此后端依赖于InfluxDB服务器来实现存储。Zenoh将依赖以下名称(不带特定于操作系统的前缀和扩展名)来找到并加载它:zenoh_backend_influxdb2

👉 安装最新版本:请参阅以下内容

👉 构建"main"分支:请参阅以下内容

:note: 这为InfluxDB 2.x提供了广泛的支持。


⚠️ 旧版0.5版本文档

以下文档与当前在"main"分支中开发中的0.6.x版本相关。

有关旧版本,请参阅相应标记版本的README和代码


使用示例

先决条件

  • 您已安装zenoh路由器(zenohd),并且zenoh_backend_influxdb2库文件在~/.zenoh/lib中可用。
  • 您的InfluxDB服务正在运行并监听于 https://127.0.0.1:8086

您可以通过配置文件在zenoh路由器启动时设置存储,也可以在运行时通过zenoh管理空间,例如使用REST API。

通过JSON5配置文件设置

  • 创建一个 zenoh.json5 配置文件,例如
    {
      plugins: {
        // configuration of "storage_manager" plugin:
        storage_manager: {
          volumes: {
            // configuration of a "influxdb2" volume (the "zenoh_backend_influxdb2" backend library will be loaded at startup)
            //this should be named influxdb2 for v2
            influxdb2: {
              // URL to the InfluxDB service
              url: "https://127.0.0.1:8086/api/v2/",
              private: {
                // If needed: InfluxDB credentials, preferably ALL-ACCESS for databases creation and drop
                //if not ALL-ACCESS then atleast with authorization to create/delete buckets
                //Note: this should not be left empty for the plugin to work; if you have no admin creds, you can copy the user creds instead
               // org_id: "organization ID",
               // token: "admin access token"
              }
            }
          },
          storages: {
            // configuration of a "demo" storage using the "influxdb2" volume
            demo: {
              // the key expression this storage will subscribes to
              key_expr: "demo/example/**",
              // this prefix will be stripped from the received key when converting to database key.
              // i.e.: "demo/example/a/b" will be stored as "a/b"
              // this option is optional
              strip_prefix: "demo/example",
              volume: {
                //this will be influxdb2 for v2 (exactly the same name as in volumes section)
                id: "influxdb2",
                // the database name within InfluxDB (not the db ID)
                db: "zenoh_example",
                // if the database doesn't exist, create it
                create_db: true,
                // strategy on storage closure
                on_closure: "drop_db",
                private: {
                  //required 
                  // If needed: InfluxDB credentials, with read/write privileges for the database
                  //this will be the same as for admin
                  //  org_id: "organization ID",
                    //this is any token with either:
                    //a.) Read-Write access to the existing DB mentioned above in the config
                    //b.) Read-write access to ALL buckets in the organization so it can access the new bucket created by zenoh
                   // token: "user access token" 
                }
              }
            }
          }
        },
        // Optionally, add the REST plugin
        rest: { http_port: 8000 }
      }
    }
    
  • 使用以下命令运行zenoh路由器
    zenohd-c zenoh.json5

通过在管理空间上使用 curl 命令在运行时设置

  • 运行zenoh路由器,并具有对其管理空间的写入权限
    zenohd--adminspace-permissions rw
  • 添加 "influxdb2" 卷(将加载 "zenoh_backend_fs" 库),连接到位于 https://127.0.0.1:8086 的InfluxDB服务: curl -X PUT -H 'content-type:application/json' -d '{url:"https://127.0.0.1:8086/api/v2"}' https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/volumes/influxdb2
  • 使用 "influxdb2" 卷添加 "demo" 存储: curl -X PUT -H 'content-type:application/json' -d '{key_expr:"demo/example/**",volume:{id:"influxdb2",db:"zenoh_example",create_db:true}}' https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/storages/demo

使用REST API进行测试

使用 curl 发布和查询键/值,您可以

# Put some values at different time intervals
curl -X PUT -d "TEST-1" https://127.0.0.1:8000/demo/example/test
curl -X PUT -d "TEST-2" https://127.0.0.1:8000/demo/example/test
curl -X PUT -d "TEST-3" https://127.0.0.1:8000/demo/example/test

# Retrive them as a time serie where '_time=[..]' means "infinite time range"
curl -g 'https://127.0.0.1:8000/demo/example/test?_time=[..]'

卷配置

支持InfluxDB的卷需要一些配置才能工作

  • "url" (必需): InfluxDB服务的URL。例如: https://127.0.0.1:8086

  • "org_id" (可选): 一个InfluxDB组织的组织ID。

  • "token" (可选): 管理用户的令牌。它将用于创建数据库、授予映射到存储的数据库的读写权限以及删除数据库和度量。在Influxdb2.x中,您可以使用ALL ACCESS令牌进行此操作(https://docs.influxdata.com/influxdb/cloud/admin/tokens/#all-access-token

org_idtoken 都应该隐藏在一个 private 对象后面,如上例所示。一般来说,如果您希望在查询配置时隐藏配置的一部分,您应该将其隐藏在一个 private 对象后面。


特定于卷的存储配置

依赖于 influxdb2 支持的卷的存储可能可以通过 volume 部分进行额外的配置

  • "db" (可选,字符串): 存储将映射到的InfluxDB数据库名。如果没有指定,将生成一个随机名称,并创建相应的数据库(即使未设置 "create_db")。

  • "create_db" (可选,布尔值) : 如果数据库不存在,则创建InfluxDB数据库。默认情况下,数据库不创建,除非指定了 "db" 属性。(值不重要,只需检查属性是否存在)

  • "on_closure" (可选,字符串) : 移除存储时使用的策略。有以下3个选项

    • unset"do_nothing": 数据库保持不变(这是默认行为)
    • "drop_db": 删除数据库(即移除)
    • "drop_series": 删除所有系列(测量),数据库保持为空。这在v2版本中目前不支持。
  • "org_id" (可选,字符串) : 用户的组织。它应该与管理员的组织相同。

  • "token" (可选,字符串) : InfluxDB访问令牌,通常是非管理员。它将被用于GET/PUT/DELETE zenoh操作中的数据库读写。


后端行为

映射到InfluxDB概念

每个 存储 将映射到InfluxDB的 数据库
要存储的每个 将映射到以从 "strip_prefix" 属性中剥离的名称命名的InfluxDB 测量。(见下文)
放入存储中的每个 键/值 将映射到InfluxDB的 ,重用zenoh设置的timestamp(但精度为纳秒)。点的字段和标签如下

  • "kind" 标签:zenoh变更类型(对已放入的值使用 "PUT",对标记键删除的操作使用 "DEL"
  • "timestamp" 字段:原始zenoh时间戳
  • "encoding" 字段:值的编码标志
  • "base64" 字段:一个布尔值,表示值是否以base64编码
  • "value" 字段:作为字符串的值,可能是二进制值编码的base64。

删除时的行为

在删除键时,删除消息之前的所有点将被删除。插入一个具有 "kind"="DEL 的点(以避免无序消息中较旧时间戳点的重新插入)。在v1中,如果删除的键对应的测量在5秒后仍不含点,zenoh会丢弃该测量。然而,influxdb 2.x 不支持此功能。

GET 操作的行为

在GET操作中,默认情况下存储只返回每个键/测量的最新点。这是为了与其他仅存储每个键一个值的后端技术保持一致。
如果您想获取GET操作的结果作为时间序列,您需要通过您的 选择器 中的 "_time" 参数指定时间范围。

:note: 目前,通配符块 * 和 ** 对于 Influxdb 2.x 不起作用。这是由于 Influxdb 2.x API 对我们方法的缺乏支持。

选择器的示例

  # get the complete time-series
  /demo/example/**?_time=[..]

  # get points within a fixed date interval
  /demo/example/influxdb/**?_time=[2020-01-01T00:00:00Z..2020-01-02T12:00:00.000000000Z]

  # get points within a relative date interval
  /demo/example/influxdb/**?_time=[now(-2d)..now(-1d)]

有关时间范围格式的完整描述,请参阅 "_time" RFC


如何安装它

要安装此后端库的最新版本,您可以按照以下步骤操作

手动安装(所有平台)

所有发布包都可以从以下地址下载

每个子目录都有 Rust 目标的名称。请参阅 https://doc.rust-lang.net.cn/stable/rustc/platform-support.html 上每个目标对应的平台

选择您的平台,并下载 .zip 文件。
将其解压缩到与 zenohd 相同的目录或任何可以找到后端库的目录(例如 /usr/lib 或 ~/.zenoh/lib)

Linux Debian

将 Eclipse Zenoh 私有仓库添加到源列表,并安装 zenoh-backend-influxdb-v2 软件包

echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt update
sudo apt install zenoh-backend-influxdb-v2

如何构建它

⚠️ 警告 ⚠️ : Zenoh 及其生态系统正在积极开发中。当您从 git 构建时,请确保您也使用 git 构建您计划使用的任何其他 Zenoh 仓库(例如绑定、插件、后端等)。可能发生的情况是 git 中的某些更改与最新打包的 Zenoh 版本(例如 deb、docker、pip)不兼容。我们在保持 Zenoh 项目中各个 git 仓库之间的兼容性方面投入了特别大的努力。

首先,安装 Cargo 和 Rust。如果您已经安装了 Rust 工具链,请确保它已更新至

$ rustup update

⚠️ 警告 ⚠️ : 由于 Rust 没有稳定的 ABI,后端库应该使用与 zenohd 相同的 Rust 版本构建,并且对于 zenoh 依赖项使用相同的版本(或提交号)。否则,在 zenohd 和库之间共享类型内存映射中的不兼容性可能导致 "SIGSEV" 崩溃。

要了解 zenohd 构建时使用的 Rust 版本,请使用 --version 选项。

使用下载版本示例

$ zenohd --version
The zenoh router v0.10.0-rc built with rustc 1.72.0 (5680fa18f 2023-08-23)

在这里,zenohd版本是0.10.0-rc,使用1.72.0版本的rustc构建。
使用以下命令安装和使用此工具链:

$ rustup default 1.72.0

然后编辑更新后的Cargo.toml文件,将所有zenoh依赖项的版本号设置为相同。

zenoh = { version = "0.10.0-rc", features = [ "unstable" ] }

然后仅针对v2后端构建库,您需要在构建命令中指定它。

$ cargo build --release --all-targets -p zenoh-backend-influxdb-v2

您也可以同时构建两个版本。

$ cargo build --release --all-targets

=======

以下是从源代码构建的版本示例

$ zenohd --version
The zenoh router v0.11.0-dev-37-g9f7a37ee built with rustc 1.72.0 (5680fa18f 2023-08-23)

在这里,zenohd版本是v0.11.0-dev-37-g9f7a37ee,其中

  • v0.11.0-dev表示它是未来v0.11.0版本的开发版本。
  • -37表示自标记开发开始的标签0.11.0-dev以来,已有37次提交。
  • -g9f7a37ee表示源代码的提交编号:9f7a37ee(前缀g仅表示"git",应忽略)。

它已使用1.72.0版本的rustc构建。
使用以下命令安装和使用此工具链:

$ rustup default 1.72.0

并将Cargo.lock中的所有zenoh依赖项更新为使用提交ID。

$ cargo update -p zenoh --precise 9f7a37ee

依赖项

~30–49MB
~782K SLoC