公眾號文章匯總
783
2022-05-29
GitHub: https://github.com/storagezhang
Emai: debugzhang@163.com
DAOS: https://github.com/daos-stack/daos
本文翻譯自 https://daos-stack.github.io/overview/fault
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 已從故障中完全恢復,客戶端節點現在可以讀取重建的對象分片。
此重建過程在應用程序持續訪問并更新對象時在線執行。
鏈接
SWIM: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1028914
分布式 存儲 對象存儲服務 OBS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。