DAOS 分布式异步对象存储|Pool

举报
debugzhang 发表于 2021/04/13 12:30:09 2021/04/13
【摘要】 分布式异步对象存储 DAOS 是一个开源的对象存储系统,专为大规模分布式非易失性内存设计,利用了 SCM 和 NVMe 等的下一代 NVM 技术。 Pool 是分布在不同存储节点上的一组 Target,在这些存储节点上分布数据和元数据以实现水平可伸缩性,并对其进行复制或纠删码编码以确保持久性和可用性。

Pool 是分布在不同存储节点上的一组 Target,在这些存储节点上分布数据和元数据以实现水平可伸缩性,并对其进行复制或纠删码编码以确保持久性和可用性(请参考 DAOS 分布式异步对象存储|存储模型 DAOS Pool 一节)。

Pool Service

Pool Service (pool_svc) 存储 Pool 的元数据,并提供一个 API 来查询和更新 Pool 的配置。

Pool 的元数据被组织为键值存储 (key-value stores, KVS) 的层次结构,这些键值通过复制存储在多个服务器上,而这些服务器由 Raft 一致性协议支持。

客户端请求只能由 Leader 提供服务,而 Follower 的副本只响应一个指向当前 Leader 的提示,以便客户端重试。

pool_svc 派生自一个通用的复制服务模块 rsvc(请参考 Replicated Services: Architecture),它的实现便于客户端搜索当前的 Leader。

元数据设计

Pool Service Layout

第一级 KVS 存储 Pool 映射、UID、GID 和 mode 等安全属性、与空间管理和自愈(请参考 Rebuild)相关的信息,以及包含用户定义属性的第二级 KVS(请参考 Container Service: Metadata Layout)。

此外,它还存储有关 Pool 连接的信息,这些信息由 Pool 句柄表示,并由客户端生成的句柄 UUID 标识。

术语“Pool 连接” (pool connection) 和“Pool 句柄” (pool handle) 可以互换使用。

Pool 操作

Pool / Pool Service 创建

Pool 的创建完全由管理服务驱动,因为与存储分配和查询容错域相关的步骤需要特殊权限。

格式化所有 Target 后,Target 组件调用每个 Target 上的 Pool 模块的 ds_pool_create,它为当前 Target 生成一个新的 UUID,并将其存储在 DSM_META_FILE 中。

此时,管理模块通过调用 ds_pool_svc_create 将控制权传递给 Pool 模块,这将在组合 Pool 和 Container Service 的选定节点子集上初始化复制服务。

Pool 模块现在向创建数据库服务的服务负责人发送 Pool_CREATE 请求;然后将 Target 列表及其容错域转换为 Pool 映射的初始版本,并与其他初始 Pool 元数据一起存储在 Pool Service 中。

Pool 连接

为了建立 Pool 连接,客户端进程使用 Pool UUID、连接信息(如组名和服务等级列表)和连接标志调用客户端库中的 daos_pool_connect 方法;这将向 Pool Service 发起 Pool 连接请求。Pool Service 尝试根据正在使用的安全模型(例如,类似 POSIX 的模型中的 UID/GID)对请求进行身份验证,并将请求的功能授权给客户端生成的 Pool 句柄 UUID。在继续之前,Pool 映射被传输到客户端;如果从这一步开始出现错误,服务器可以简单地要求客户端放弃 Pool 映射。

此时,Pool Service 将检查现有的 Pool 句柄:

  • 如果已经存在具有相同 UUID 的 Pool 句柄,则表示已经建立了 Pool 连接,无需执行其他操作。
  • 如果存在另一个 Pool 句柄,且当前请求的或现有的 Pool 句柄具有独占访问权限,则连接请求将被拒绝,并显示忙碌状态代码。

如果一切顺利,Pool Service 将使用 Pool 句柄 UUID 向 Pool 中的所有 Target 发送一个集中式 POOL_TGT_CONNECT 请求。Target Service 将创建并缓存本地 Pool 对象,并打开本地 VOS Pool 进行访问。

一组对等应用程序进程可以共享一个 Pool 连接句柄(请参考 DAOS 分布式异步对象存储|存储模型 DAOS Pool 一节和 Use Cases: Storage Management and Workflow Integration)。

要关闭 Pool 连接,客户端进程使用 Pool 句柄调用客户端库中的 daos_pool_disconnect 方法,触发对 Pool Service 的 POOL_DISCONNECT 请求,Pool Service 会向 Pool 中的所有 Target 发送一个集中式 POOL_TGT_DISCONNECT 请求。这些步骤将销毁与连接关联的所有状态,包括所有 Container 句柄。最好在调用 disconnect 方法之前,共享此连接的其他客户端进程在本地销毁它们的 Pool 句柄副本。如果一组客户端进程在调用 disconnect 方法之前提前终止,那么一旦 Pool Service 从运行时环境中了解到该事件,它们的 Pool 连接最终将被逐出。

相关信息

Emai: debugzhang@163.com

DAOS: https://github.com/daos-stack/daos

本文翻译自 https://github.com/daos-stack/daos/blob/master/src/pool/README.md

【版权声明】本文为华为云社区用户翻译文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容, 举报邮箱:cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。