DAOS 分佈式異步對象存儲|故障模型

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

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

本文翻譯自 https://daos-stack.github.io/overview/fault

相關文章
相關標籤/搜索