DAOS 依靠大规模分布式单端口存储。因此,每个 Target 实际上都是一个单独的失败点。
DAOS 通过在不同的容错域中提供 Target 间的冗余来实现数据和元数据的可用性和持久性。DAOS 内部的 Pool 和 Container 的元数据通过强一致性算法进行复制。然后,通过在内部透明地利用 DAOS 分布式事务机制,DAOS 对象被安全地复制或纠删码编码。本节的目的是提供有关 DAOS 如何实现容错和保证对象弹性的详细信息。
分层容错域
容错域是一组共享同一故障点的服务器,因此很可能同时发生故障。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 重新显式集成之前(可能仅在维护操作之后),不应再向其发送任何消息。
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