ZettaScale logo

Zenoh 存储获得提升:通过 S3 集成增强存储能力

| 预计阅读时间 3 分钟

正如我们在 Zenoh 0.7.0-rc 版本的博文(Zenoh Charmander 即将进城)中高兴地宣布的那样,我们现在通过新的 AmazonS3/MinIO 后端实现提供增强的后端存储功能。

这源自我们Discord社区中所要求的功能,很快就进入了产品路线图

可从https://download.eclipse.org/zenoh/zenoh-backend-s3/latest/ 下载软件包安装 S3 后端。 源代码可在我们的 eclipse-zenoh 代码库中找到:https://github.com/eclipse-zenoh/zenoh-backend-s3。 您将在 README 中找到如何为 Amazon S3 和 MinIO 设置该后台的详细说明。

目录

在这篇博文中,我们将介绍 S3 后端,解释后端背后的概念、S3 后端如何融入后端、如何配置后端、后端有哪些限制以及使用后端时的注意事项。

目录

  1. 芝诺后端
  2. 特点
  3. 配置
  4. 考虑因素

芝诺后端

你可能会问自己 “什么是后台? 在 Zenoh 中,后台是一种存储技术,可以存储通过 Zenoh 发布的密钥/值,并在查询时返回。 不同的存储技术可根据不同的使用情况存储密钥/值。

目前,我们有三个后台系统:

AmazonS3 也能将数据存储在云存储服务中。

它将提高我们的存储能力,尤其是在面向对象存储方面。 到目前为止,使用对象存储的唯一方法是使用 FileSystem 后端,它被设计为受限于主机文件系统的简单存储选项。 在安全性、数据可用性和性能方面,它也缺乏云存储所提供的许多机制,而且可扩展性也不强。

我们的用户需要与对象存储技术进行交互,这种技术可以很容易地在云上进行设置,提供性能、安全性和数据可用性,并且可以扩展。 亚马逊 S3 满足了所有这些条件,并立即被提出,因为到目前为止,它已经是一项成熟的技术,在系统行业得到了广泛采用。

特点

S3 存储

Amazon S3(代表简单存储服务)通过Amazon Web Services提供对象存储功能,提供“业界领先的可扩展性、数据可用性、安全性和性能”。

通过该后台,我们可以

  • 将值作为文件/对象存储在 S3 存储桶中
  • 创建一个水桶
  • 重用现有水桶
  • 在存储区中放置值,即在存储区中创建或更新一个文件,并在键表达式提供的路径下放置指定的值
  • 查询值/文件:
    • 具体关键表达
    • 包含通配符(’\*‘ 和 ‘\*\*‘ )的关键表达式(将返回路径与关键表达式相匹配的文件值)
  • 删除文件
  • 删除存储

与 MinIO 兼容

MinIO是一种开源多云对象存储,可提供高性能,是与 S3 兼容的对象存储。 我们开发后台的目的是让您可以根据使用情况选择 AmazonS3 或 MinIO。 您可能需要考虑很多因素才能决定选择其中一种还是另一种。 其中一个要考虑的因素是与存储的交互量,如使用 Zenoh,您可能会收到成千上万个从存储中放入或检索数据的请求,如果使用 Amazon S3,这可能会影响存储的定价。

支持 TLS

AmazonS3 本身提供 HTTPS 支持,但如果使用 MinIO 建立自己的 S3 实例,则可能需要使用 TLS 确保连接安全。 为此,您需要指定允许您验证服务器的证书。 可在配置文件中指定证书颁发机构颁发的证书。

配置

下面的示例配置文件也可以在我们的资源库中找到。 其中有 “卷 “和 “存储 “的参数。

{
  "plugins": {
    "storage_manager": {
      "volumes": {
        "s3": {
          // 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": {
            // Certificate authority to authenticate the server.
            "root_ca_certificate": "./certificates/minio/ca.pem"
          }
        }
      },
      "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": "AKIAIOSFODNN7EXAMPLE",
              "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
            }
          }
        }
      }
    },
    // Optionally, add the REST plugin
    "rest": { "http_port": 8000 }
  }
}

在我们的 S3 存储概念中,每个存储都与一个 S3 存储桶相关联,而卷则与服务器相关联。 一个卷可以与多个存储相关联,这意味着所有 s3 存储桶都将存储在同一台服务器上。

所需的卷配置仅限于指定服务器的位置(如果使用 Amazon S3,则只需指定区域,而使用 MinIO 时则需提供 URL)以及 TLS 证书路径。 与之关联的所有存储将共享相同的配置。

在存储配置中,我们指定了密钥表达式、存储桶的名称、访问存储桶所需的凭证、与创建存储及其读写权限相关的一些策略等……更多详情请参见示例配置文件。

考虑因素

请记住,S3 后端仍在开发中,预计会有一些额外的工作要做。

在现阶段使用该后端有几件事需要考虑,有些与 MinIO 和 AmazonS3 的工作方式有关,有些与该后端的开发状况有关。

同名文件和目录

关于 MinIO 和 AmazonS3 之间的区别,MinIO 是 “兼容 S3 “的,但这并不意味着它的工作方式完全相同。

我们在开发过程中注意到的一个不同点来自这样一个问题:如果我们在 “a/b “键下输入一个值,然后在a/b/c 下输入另一个值,会怎么样? Zenoh 允许您在a/b/ca/b 下发布一个值,例如,订阅a/\*\* 的接收器应该能够同时接收这两个事件,而不管监听器是否是存储设备。

那么,系统在处理这种情况时是如何表现的呢?

└── a
    ├── b
    │   └── c
    └── b

a/b 下进行发布,之后在a/b/c 下进行发布(或相反),这意味着我们将在/a 下的同一位置拥有一个与文件同名的目录!
MinIO 不允许这样的行为,当尝试执行这样的操作时会抛出错误信息。 不过,亚马逊 S3 完全没有抱怨! 这是因为 Amazon S3 使用扁平命名空间来组织文件和目录,而 MinIO 使用文件系统层次结构来存储(更多信息请参阅本讨论)。 在文件系统中,我们不能让文件与同一位置的目录同名。 事实上,我们在前段时间开发文件系统后台时就曾遇到过这个问题,不得不开发一种机制来允许这种行为,并存储这两个事件的值。 不过,在新的 S3 后端中,暂时还没有实现这种机制,因此在现阶段使用 MinIO 的同时使用该后端时需要考虑到这一点。

时间戳样本

我们还没有考虑样本的时间戳,这可能会在某些边缘情况下造成问题,例如,如果我们在发送 PUT 之后紧接着又对同一个键表达式发送了 DELETE,那么 DELETE 操作可能会比 PUT 操作更早到达存储区,这将导致文件被继续存储,而不是按照预期删除,原因是顺序问题。 在本例中,如果考虑到时间戳,我们就可以放弃 PUT 操作,避免损坏存储。 这一点尚未实施,但已为此开辟了一个议题

支持复制

Zenoh 方面尚不支持复制。 如果我们有两个订阅了相同关键表达式的 S3 后端,其中一个瞬间宕机,当它重生时,需要从另一个后端获取它错过的数据来同步。 目前尚未实施。 不过,我们可以从 Amazon S3 和 MinIO 提供的复制机制中获益。

另一个复制问题是,当我们想使用多个不同的后端,例如 S3 和 RocksDB 时。 目前还没有解决这个问题的办法,需要用户手动进行同步。

Aws-sdk-s3 库

最后,该实现依赖于亚马逊的aws-sdk-s3 Rust crate,而 aws-sdk-s3 Rust crate 本身还在开发中,并明确指出:”请注意:SDK 目前处于开发人员预览版,仅供反馈之用。 请勿将此 SDK 用于生产工作负载。“因此,在进行生产发布之前,你需要充分考虑到这一点。

截至目前,亚马逊开发该板条箱的工程团队正在定期发布新版本。 因此,为了更新依赖版本,预计该后台将在未来推出新版本。

下一步是什么?

关于如何使用 S3 作为 Zenoh 的存储空间的文章到此结束,这要归功于我们最近实施的 S3 后端。

虽然它还在开发中,但它的第一个版本已经为我们提供了许多功能。 我们可以

  • 利用 Zenoh 的优势,例如使用关键表达式从 S3 存储器中查询数据
  • 使用 TLS 确保我们与 S3 存储的通信安全
  • 使用 MinIO 替代亚马逊 S3

尽管如此,我们仍希望在不久的将来解决一些局限性问题。

请继续关注我们的更新,同时不要忘记在Discord上与 Zenoh 团队保持联系,并就路线图上的新功能提出建议。

作者

ZettaScale

ZettaScale的使命是为每一个联网的人和机器带来无限制的通信、计算和存储自由——在任何地方、以任何规模、高效并安全。该公司开发开源通信中间件,支持下一代机器人、运输和关键任务应用程序。随着物理世界中的设备变得更加连接、更仪器化和更相互依存,ZettaScale使设备创建者能够轻松实现强健、安全和可扩展的通信。

ZettaScale于2022年从ADLINK 科技股份有限公司分拆,由TTTech Auto战略投资。ZettaScale在英国、法国和荷兰设有办公室。

关注

另请阅读

滚动至顶部