正如我们在 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 后端如何融入后端、如何配置后端、后端有哪些限制以及使用后端时的注意事项。
目录
芝诺后端
你可能会问自己 “什么是后台? 在 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/c
或a/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
尽管如此,我们仍希望在不久的将来解决一些局限性问题。