10个版本 ()

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.7.0-rc2022年12月22日

#131 in 数据库接口

Download history 266/week @ 2024-04-28 5/week @ 2024-05-05 137/week @ 2024-05-12 22/week @ 2024-05-19 146/week @ 2024-06-02 5/week @ 2024-06-09 71/week @ 2024-06-16 16/week @ 2024-06-23 83/week @ 2024-07-07 15/week @ 2024-07-14 63/week @ 2024-07-21 90/week @ 2024-07-28 98/week @ 2024-08-04 5/week @ 2024-08-11

每月下载量257次

EPL-2.0 OR Apache-2.0

35KB
432

CI Discussion Discord License License

Eclipse Zenoh

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

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

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


RocksDB后端

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

此后端依赖于RocksDB来实现存储。Zenoh将依赖于其库的名称(不包含特定于操作系统的前缀和扩展名)来找到它并加载它:zenoh_backend_rocksdb

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

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


使用示例

先决条件

  • 您已安装Zenoh路由器(zenohd),并且zenoh_backend_rocksdb库文件位于~/.zenoh/lib中。
  • 将环境变量ZENOH_BACKEND_ROCKSDB_ROOT声明为您想要存储RocksDB数据库的目录。如果您没有声明它,将使用~/.zenoh/zenoh_backend_rocksdb目录。

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

通过JSON5配置文件设置

  • 创建一个包含以下内容的zenoh.json5配置文件
    {
      plugins: {
        // configuration of "storages" plugin:
        storage_manager: {
          volumes: {
            // configuration of a "rocksdb" volume (the "zenoh_backend_rocksdb" backend library will be loaded at startup)
            rocksdb: {}
          },
          storages: {
            // configuration of a "demo" storage using the "rocksdb" 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"
              strip_prefix: "demo/example",
              volume: {
                id: "rocksdb",
                // the RocksDB database will be stored in this directory (relative to ${ZENOH_BACKEND_ROCKSDB_ROOT})
                dir: "example",
                // create the RocksDB database if not already existing
                create_db: true
              }
            }
          }
        },
        // Optionally, add the REST plugin
        rest: { http_port: 8000 }
      }
    }
    
  • 使用以下命令运行zenoh路由器:
    zenohd-c zenoh.json5

通过管理空间中的curl命令在运行时设置

  • 运行zenoh路由器,并具有对其管理空间的写权限
    zenohd--adminspace-权限 rw
  • 添加“rocksdb”后端(将加载“zenoh_backend_rocksdb”库)
    curl -XPUT -H 'content-type:application/json' -d '{}'https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/volumes/rocksdb
  • 使用“rocksdb”后端添加“demo”存储
    curl -XPUT -H 'content-type:application/json' -d '{key_expr:"demo/example/**",strip_prefix:"demo/example",volume: {id: "rocksdb",dir: "example",create_db: true}}'https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/storages/demo

使用REST API进行测试

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

# Put values that will be stored in the RocksDB database
curl -X PUT -d "TEST-1" https://127.0.0.1:8000/demo/example/test-1
curl -X PUT -d "B" https://127.0.0.1:8000/demo/example/a/b

# Retrive the values
curl https://127.0.0.1:8000/demo/example/**

特定卷的存储配置

依赖于RocksDB后端的存储必须在上面显示的附加配置

  • "dir" (必需,字符串) :RocksDB数据库存储的目录名称。绝对路径将是 ${ZENOH_BACKEND_ROCKSDB_ROOT}/<dir>

  • "create_db" (可选,布尔值) :如果数据库不存在,则创建RocksDB数据库。默认不设置。(值不重要,只检查属性存在)

  • "read_only" (可选,布尔值) :存储将仅响应GET查询。它将不接受任何PUT或DELETE消息,并且不会在RocksDB数据库中放入任何内容。默认不设置。(值不重要,只检查属性存在)

  • "on_closure" (可选,字符串) :存储被移除时使用的策略。有两种选项

    • unset:数据库保持不变(这是默认行为)
    • "destroy_db":销毁数据库(即删除)

后端的行为

映射到RocksDB数据库

每个 存储 将映射到存储在目录中的RocksDB数据库: ${ZENOH_BACKEND_ROCKSDB_ROOT}/<dir>,其中

  • ${ZENOH_BACKEND_ROCKSDB_ROOT} 是在zenoh路由器启动前指定的环境变量。如果没有指定此变量,则使用 ${ZENOH_HOME}/zenoh_backend_rocksdb (其中 ${ZENOH_HOME} 的默认值是 ~/.zenoh)。
  • <dir> 是存储创建时指定的 "dir" 属性。每个放入存储的zenoh key/value 将映射到数据库中的2个 key/values
  • 对于两者,数据库键是zenoh键,从存储创建时指定的"strip_prefix"属性中提取出来的。
  • "default" 列族中,键与zenoh编码的值一起作为值存储。
  • "data_info" 列族中,键按照以下顺序存储一个字节缓冲区的编码
    • 时间戳编码为:8个字节的时钟时间 + 16个字节的HLC ID
    • "已删除"标志编码为1个字节的布尔值
    • 编码前缀标志编码为ZInt(可变长度)
    • 编码后缀编码为字符串(字符串长度为ZInt + 字符串字节(不包括结束\0))

删除行为

在删除键时,相应的键将从"default"列族中删除。在"data-info"列族中插入一个条目,其中“删除”标志设置为true,并包含删除时间戳(以避免在未排序的消息的情况下重新插入较旧时间戳的点)。
定期,一个任务会从"data-info"列族中清理旧的条目和设置“删除”标志为true的条目

GET行为

在GET操作中

  • 如果选择器是唯一键(即不包含任何'*'):直接从2个列族中通过get RocksDB操作检索对应键的值及其编码和时间戳。
  • 如果选择器是键表达式:存储将搜索匹配的键,如果可能的话,利用RocksDB的前缀搜索以最小化要检查的条目数量。

如何安装它

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

手动安装(所有平台)

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

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

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

Linux Debian

将Eclipse Zenoh私有仓库添加到源列表,并安装zenoh-backend-rocksdb

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

如何构建它

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

首先,安装 ClangCargo 和 Rust。如果您已经安装了 Rust 工具链,请确保它与以下版本兼容。

$ rustup update

⚠️ 警告 ⚠️ : 由于 Rust 没有稳定的 ABI,后端库应该使用与 zenohd 完全相同的 Rust 版本构建,并使用与 'zenohd' 相同的版本(或提交号)的 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

依赖项

~63MB
~1M SLoC