DAOS 依靠大规模分布式单端口存储。所以,每一个 Target 实际上都是一个单独的失败点。git
DAOS 经过在不一样的容错域中提供 Target 间的冗余来实现数据和元数据的可用性和持久性。DAOS 内部的 Pool 和 Container 的元数据经过强一致性算法进行复制。而后,经过在内部透明地利用 DAOS 分布式事务机制,DAOS 对象被安全地复制或纠删码编码。本节的目的是提供有关 DAOS 如何实现容错和保证对象弹性的详细信息。github
容错域是一组共享同一故障点的服务器,所以极可能同时发生故障。DAOS 假设容错域是分层且不重叠的。实际的层次结构和容错域成员身份必须由 DAOS 用于生成 Pool 映射的外部数据库提供。算法
Pool 元数据从不一样的高级容错域复制到多个节点上,以得到高可用性,而对象数据则根据选定的 Object 类在不一样数量的容错域上进行复制或纠删码编码。数据库
DAOS 服务器经过基于 gossip 的协议 SWIM 在 DAOS 系统中进行监控,该协议提供了准确、高效和可扩展的服务故障检测。系统经过按期的本地健康评估监控附加到每一个 DAOS Target 上的存储,每当本地存储 I/O 错误返回到 DAOS 服务器时,将自动调用内部运行情况检查程序。此程序将经过分析 IO 错误代码和设备智能/健康数据来进行整体健康评估。若是结果是否认的,Target 将被标记为有故障的,而且到该 Target 的进一步 I/O 将被拒绝并从新路由。安全
检测到故障后,必须从 Pool 映射中排除故障 Target 或服务器(其实是一组 Target)。此过程自动触发或由管理员手动触发。服务器
排除后,Pool 映射的新版本将急切地推送到全部存储 Target。此时,Pool 进入降级模式,可能须要额外的访问处理(例如,用纠删码重建数据)。此时 DAOS 客户端和存储节点无限期地重试 RPC,直到它们重新的 Pool 映射中找到替代的 Target。此时,与被排除的 Target 的全部未完成的通讯都将停止,在 Target 从新显式集成以前(可能仅在维护操做以后),不该再向其发送任何消息。jsp
Pool 服务会当即向全部存储 Target 通知 Pool 映射的更改。但客户端节点不是这样,它们每次与服务器通讯时都会被延迟地通知 Pool 映射无效。为此,客户端将其当前 Pool 映射版本打包到每一个 RPC 中,服务器将回复当前 Pool 映射版本。所以,当 DAOS 客户端遇到 RPC 超时时,它会按期与其余 DAOS Target 进行通讯,以确保其 Pool 映射始终是最新的。最终,客户端将知晓 Target 被排除并进入降级模式。分布式
这种机制保证了全局节点排除,而且全部节点最终共享相同的 Target 有效性视图。编码
从 Pool 映射中排除后,每一个 Target 将自动启动重建过程以恢复数据冗余。首先,每一个 Target 建立一个受被排除的 Target 影响的本地对象列表。该列表是经过扫描由底层存储层维护的本地对象表来完成的。而后,对于每一个受影响的对象,将肯定新对象分片的位置,并恢复历史对象的冗余(即快照)。重建全部受影响的对象后,Pool 映射将再次更新,以将 Target 报告为失败。这标志着集体重建过程的结束,以及此特定故障的降级模式的退出。此时,Pool 已从故障中彻底恢复,客户端节点如今能够读取重建的对象分片。翻译
此重建过程在应用程序持续访问并更新对象时在线执行。
GitHub: https://github.com/storagezhang
Emai: debugzhang@163.com
华为云社区: https://bbs.huaweicloud.com/blogs/254523