3个不稳定版本

0.10.0-rc2023年9月28日
0.7.2-rc2023年6月7日
0.7.0-rc2022年12月22日
0.0.0 2022年12月7日

#1050 in 数据库接口

EPL-2.0 OR Apache-2.0

56KB
801

CI Discussion Discord License License

Eclipse Zenoh

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

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

查看网站 zenoh.io路线图 获取更多信息。


InfluxDB后端

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

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

👉 安装最新版本:请参阅下面

👉 构建"master"分支:请参阅下面

⚠️尚不支持InfluxDB 2.x。需要InfluxDB 1.8最低版本。


⚠️旧版本0.5的文档

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

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


使用示例

先决条件

  • 您已安装zenoh路由器(zenohd),并且zenoh_backend_influxdb库文件位于~/.zenoh/lib
  • 您有一个运行在https://127.0.0.1:8086上的InfluxDB服务。

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

通过 JSON5 配置文件设置

  • 创建一个 zenoh.json5 配置文件,例如
    {
      plugins: {
        // configuration of "storage_manager" plugin:
        storage_manager: {
          volumes: {
            // configuration of a "influxdb" volume (the "zenoh_backend_influxdb" backend library will be loaded at startup)
            influxdb: {
              // URL to the InfluxDB service
              url: "https://127.0.0.1:8086",
              private: {
                // If needed: InfluxDB credentials, preferably admin for databases creation and drop
                //username: "admin",
                //password: "password"
              }
            }
          },
          storages: {
            // configuration of a "demo" storage using the "influxdb" 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: {
                id: "influxdb",
                // the database name within InfluxDB
                db: "zenoh_example",
                // if the database doesn't exist, create it
                create_db: true,
                // strategy on storage closure
                on_closure: "drop_db",
                private: {
                  // If needed: InfluxDB credentials, with read/write privileges for the database
                  //username: "user",
                  //password: "password"
                }
              }
            }
          }
        },
        // Optionally, add the REST plugin
        rest: { http_port: 8000 }
      }
    }
    
  • 使用以下命令运行 Zenoh 路由器
    zenohd-c zenoh.json5

通过 curl 命令在管理空间中设置

  • 运行 Zenoh 路由器,并具有写入其管理空间的权限
    zenohd--adminspace-permissions rw
  • 添加 "influxdb" 卷(将加载 "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"}' https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/volumes/influxdb
  • 使用 "influxdb" 卷添加 "demo" 存储:curl -X PUT -H 'content-type:application/json' -d '{key_expr:"demo/example/**",volume:{id:"influxdb",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

  • "username"(可选):InfluxDB 管理员用户名。它将被用于创建数据库、授予映射到存储的数据库的读写权限以及删除数据库和度量。

  • "password"(可选):管理员用户的密码。

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


特定于卷的存储配置

依赖于基于 influxdb 的卷的存储可能通过 volume 部分进行额外的配置

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

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

  • "on_closure" (可选,字符串) : 当Storage被移除时使用的策略。有3个选项

    • 未设置"do_nothing":数据库保持不变(这是默认行为)
    • "drop_db":删除数据库(即移除)
    • "drop_series":删除所有系列(测量),数据库保持为空。
  • "username" (可选,字符串) : InfluxDB用户名(通常是非管理员)。它将用于GET/PUT/DELETE zenoh操作中数据库的读写。

  • "password" (可选,字符串) : 用户的密码。


后端的行为

映射到InfluxDB概念

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

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

删除时的行为

在删除键时,删除消息之前的所有点都会被删除。插入具有"kind"="DEL"的点的操作(以避免在无序消息的情况下重新插入具有较旧时间戳的点)。延迟后(5秒),如果删除的键对应的测量仍然不包含任何点,则删除该测量。

GET时的行为

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

选择器的示例

  # 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

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

如何构建它

⚠️ 警告 ⚠️ : 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.6.0-beta.1 built with rustc 1.64.0 (a55dd71d5 2022-09-19)

在此处,zenohd已使用rustc版本1.64.0构建。
使用以下命令安装和使用此工具链

$ rustup default 1.64.0

并且zenohd版本对应于未发布的提交,其ID为1f20c86。使用以下命令更新Cargo.lock中的zenoh依赖项

$ cargo update -p zenoh --precise 1f20c86

然后使用以下命令构建后端

$ cargo build --release --all-targets

依赖关系

~36–51MB
~1M SLoC