10个版本 ()

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

316数据库接口

Download history 173/week @ 2024-04-27 7/week @ 2024-05-04 123/week @ 2024-05-11 23/week @ 2024-05-18 2/week @ 2024-05-25 132/week @ 2024-06-01 13/week @ 2024-06-08 5/week @ 2024-06-15 80/week @ 2024-07-06 17/week @ 2024-07-13 48/week @ 2024-07-20 100/week @ 2024-07-27 95/week @ 2024-08-03 8/week @ 2024-08-10

每月252次 下载

EPL-2.0 OR Apache-2.0

62KB
867

Discussion Discord License License

Eclipse Zenoh

Eclipse Zenoh:零开销的Pub/Sub、存储/查询和计算。

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

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

S3后端

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

此后端依赖于 Amazon S3 来实现存储。它也兼容与 MinIO 对象存储一起工作。

Zenoh将依赖以下库名称(不带操作系统特定前缀和扩展)来查找和加载它:**libzenoh_backend_s3**。

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

👉 构建 "main" 分支:请见下文下面


用法示例

先决条件

  • 您已安装 Zenoh 路由器(zenohd),并且 libzenoh_backend_s3 库文件位于 ~/.zenoh/lib 中。或者,我们可以通过运行以下命令来设置库的符号链接:

    ln -s ~/zenoh-backend-s3/target/release/libzenoh_backend_s3.dylib  ~/.zenoh/lib/libzenoh_backend_s3.dylib
    
  • 您有一个正在运行的 S3 实例,这可以是 AmazonS3 实例或 MinIO 实例。

您可以通过配置文件在 Zenoh 路由器启动时设置存储,也可以在运行时通过 Zenoh 管理空间设置,例如使用 REST API(见https://zenoh.io/docs/manual/plugin-storage-manager/)。

设置 MinIO 实例

为了运行下文中的用法示例,启动一个 MinIO 实例是方便的。要在 Docker 容器上启动 MinIO,首先使用以下命令安装 MinIO:

docker pull minio/minio

然后,您可以使用以下命令启动实例

docker run -p 9000:9000 -p 9090:9090  --user $(id -u):$(id -g)  --name minio -e 'MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE' -e 'MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'  -v ${HOME}/minio/data:/data   quay.io/minio/minio server data --console-address ':9090'

如果成功,则可以通过https://127.0.0.1:9090 访问控制台。

通过 JSON5 配置文件设置

  • 创建一个包含以下内容的 zenoh.json5 配置文件:

    {
      plugins: {
        // Configuration of "storage_manager" plugin:
        storage_manager: {
          volumes: {
            s3: {
              // AWS region to which connect (see https://docs.aws.amazon.com/general/latest/gr/s3.html).
              // This field is mandatory if you are going to communicate with an AWS S3 server and
              // optional in case you are working with a MinIO S3 server.
              region: "eu-west-1",
    
              // Endpoint where the S3 server is located.
              // This parameter allows you to specify a custom endpoint when working with a MinIO S3
              // server.
              // This field is mandatory if you are working with a MinIO server and optional in case
              // you are working with an AWS S3 server as long as you specified the region, in which
              // case the endpoint will be resolved automatically.
              url: "https://s3.eu-west-1.amazonaws.com",
    
              // Optional TLS specific parameters to enable HTTPS with MinIO. Configuration shared by
              // all the associated storages.
              // tls: {
              //  private: {
              //    // Certificate authority to authenticate the server.
              //    root_ca_certificate_file: "/home/user/certificates/minio/ca.pem",
              //
              //    // Alternatively you can inline your certificate encoded with base 64:
              //    root_ca_certificate_base64: "<YOUR_CERTIFICATE_ENCODED_WITH_BASE64>"
              //  }
              //},
            },
          },
          storages: {
            // Configuration of a "demo" storage using the S3 volume. Each storage is associated to a
            // single S3 bucket.
            s3_storage: {
              // The key expression this storage will subscribes to
              key_expr: "s3/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: "s3/example",
    
              volume: {
                // Id of the volume this storage is associated to
                id: "s3",
    
                // Bucket to which this storage is associated to
                bucket: "zenoh-bucket",
    
                // The storage attempts to create the bucket, but if the bucket already exists and is
                // owned by you, then with 'reuse_bucket' you can associate that preexisting bucket to
                // the storage, otherwise it will fail.
                reuse_bucket: true,
    
                // If the storage is read only, it will only handle GET requests
                read_only: false,
    
                // strategy on storage closure, either `destroy_bucket` or `do_nothing`
                on_closure: "destroy_bucket",
    
                private: {
                  // Credentials for interacting with the S3 bucket
                  access_key: "SARASAFODNN7EXAMPLE",
                  secret_key: "asADasWdKALsI/ASDP22NG/pWokSSLqEXAMPLEKEY",
                },
              },
            },
          },
        },
        // Optionally, add the REST plugin
        rest: { http_port: 8000 },
      },
    }
    
  • 使用以下命令运行 Zenoh 路由器:

    zenohd -c zenoh.json5
    

与 AWS S3 存储一起工作的卷配置

当与 AWS S3 存储一起工作时,必须指定在Amazon Simple Storage Service 端点和配额 文档中指示的区域名称。端点 URL 不需要指定,因为内部端点解析器将自动找到与指定区域关联的端点。

与卷关联的所有存储都将使用相同的区域。

配置文件中的卷部分将如下所示:

storage_manager {
  volumes: {
    s3: {
        // AWS region to which connect
        region: "eu-west-1",
    }
  },
  ...
}

与 MinIO 一起工作的卷配置

相反,当与 MinIO S3 存储一起工作时,我们需要指定存储的端点而不是区域,MinIO 服务器将忽略区域。在这种情况下,我们可以省略指定区域。

配置文件中的卷部分将如下所示:

storage_manager {
  volumes: {
    s3: {
        url: "https://127.0.0.1:9000",
    }
  },
  ...
}

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

  • 运行 Zenoh 路由器
    cargo run --bin=zenohd
    
  • 添加 "s3" 后端(将加载 "zenoh_backend_s3" 库)
    curl -X PUT -H 'content-type:application/json' -d '{url: "https://127.0.0.1:9000", private: {access_key: "AKIAIOSFODNN7EXAMPLE", secret_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"}}' https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/volumes/s3
    
  • 使用 "s3" 后端添加 "s3_storage" 存储
    curl -X PUT -H 'content-type:application/json' -d '{key_expr:"s3/example/*", strip_prefix:"s3/example", volume: {id: "s3", bucket: "zenoh-bucket", create_bucket: true, region: "eu-west-3", on_closure: "do_nothing", private: {access_key: "AKIAIOSFODNN7EXAMPLE", secret_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"}}}' https://127.0.0.1:8000/@/router/local/config/plugins/storage_manager/storages/s3_storage
    

使用 REST API 进行测试

使用 curl 发布和查询键/值,您可以进行以下操作:

# Put values that will be stored in the S3 storage
curl -X PUT -H 'content-type:application/json' -d '{"example_key": "example_value"}' http://0.0.0.0:8000/s3/example/test

# To get the stored object
curl -X GET -H {} -d '{}' http://0.0.0.0:8000/s3/example/test

# To delete the previous object
curl -X DELETE -H {} -d '{}' http://0.0.0.0:8000/s3/example/test

# To delete the whole storage and the bucket if configured (note in order for this test to work, you need to setup adminspace read/write permissions)
curl -X DELETE 'http://0.0.0.0:8000/@/router/local/config/plugins/storage_manager/storages/s3_storage'

# To delete the whole volume (note in order for this test to work, you need to setup adminspace read/write permissions)
curl -X DELETE 'http://0.0.0.0:8000/@/router/local/config/plugins/storage_manager/volumes/s3'

在 MinIO 上启用 TLS

为了通过 HTTPS 建立安全通信,我们需要提供验证服务器凭据的证书颁发机构的证书。

TLS 证书可以使用 Minica 在zenoh 文档中生成。在运行以下命令时:

minica --domains localhost

将生成一个私钥、一个公钥证书和一个证书颁发机构证书

└── certificates
    ├── localhost
    │   ├── cert.pem
    │   └── key.pem
    ├── minica-key.pem
    └── minica.pem

在配置文件中,我们需要指定 root_ca_certificate_file,因为这将允许 s3 插件验证 MinIO 服务器的密钥。例如:

tls: {
  private: {
    root_ca_certificate_file: "/home/user/certificates/minio/minica.pem",
  },
},

在这里,root_ca_certificate_file 对应于生成的 minica.pem 文件。您还可以通过在字段 root_ca_certificate_base64 中内联根 CA 证书来直接嵌入根 CA 证书,使用 base64 编码。

《cert.pem》和《key.pem》文件分别对应公钥证书和私钥。我们需要分别将它们重命名为《public.crt》和《private.key》,并将它们存储在MinIO配置目录下(如MinIO文档中指定)。如果您之前已运行Docker容器,则需要将包含证书的文件夹作为卷挂载;假设我们将证书存储在${HOME}/minio/certs下,我们需要按照以下方式启动容器

docker run -p 9000:9000 -p 9090:9090  --user $(id -u):$(id -g)  --name minio -e 'MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE' -e 'MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' -v ${HOME}/minio/data:/data -v ${HOME}/minio/certs:/certs quay.io/minio/minio server data --certs-dir certs --console-address ':9090'

最终,卷配置应如下所示

storage_manager: {
  volumes: {
    s3: {
        // Endpoint where the S3 server is located
        url: "https://127.0.0.1:9000",

        // Configure TLS specific parameters
        tls: {
          private: {
            root_ca_certificate_file: "/home/user/certificates/minio_certs/minica.pem",
          },
        },
    },
  },

注意:不要忘记修改端点协议,例如从https://127.0.0.1:9090更改为https://127.0.0.1:9090


如何安装它

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

手动安装(所有平台)

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

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

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

Linux Debian

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

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

如何构建它

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

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

$ rustup update

⚠️ 警告 ⚠️ : 由于Rust没有稳定的ABI,后端库应使用与zenohd完全相同的Rust版本构建。否则,在zenohd和库之间共享类型内存映射中的不兼容性可能导致"SIGSEV"崩溃。

要了解zenohd使用的Rust版本,请使用--version选项。
示例

$ zenohd --version
zenohd v0.7.0-rc-365-geca888b4-modified built with rustc 1.69.0 (84c898d65 2023-04-16)
The zenoh router v0.7.0-rc-365-geca888b4-modified built with rustc 1.69.0 (84c898d65 2023-04-16)

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

$ rustup default 1.69.0

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

$ cargo build --release --all-targets

依赖项

~68MB
~1M SLoC