DAOS 分布式异步对象存储|Pool
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。
元数据设计
第一级 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
- 点赞
- 收藏
- 关注作者
评论(0)