分布式異步對象存儲 (DAOS) 是一個開源的對象存儲系統,專為大規模分布式非易失性內存 (NVM, Non-Volatile Memory) 設計,利用了SCM(Storage-Class Memory) 和 NVMe(Non-Volatile Memory express) 固態盤等的下一代 NVM 技術。
DAOS 是一種橫向擴展的對象存儲,可以為高性能計算應用提供高帶寬、低延遲和高 IOPS 的存儲容器,並支持結合仿真、數據分析和機器學習的下一代以數據為中心的工作流程。
與主要針對旋轉介質設計的傳統存儲堆棧不同,DAOS 針對全新 NVM 技術進行了重新構建,可在用戶空間中端對端地運行,並能完全繞開操作系統,是一套輕量級的系統。
DAOS 提供了一種為訪問高細粒度數據提供原生支持的 I/O 模型,而不是傳統的基於高延遲和塊存儲設計的 I/O 模型,從而釋放下一代存儲技術的性能。
與傳統的緩沖區不同,DAOS 是一個獨立的高性能容錯存儲層,它不依賴其它層來管理元數據並提供數據恢復能力。DAOS 服務器將其元數據保存在持久內存中,而將批量數據直接保存在 NVMe 固態盤中。
DAOS 特性
DAOS 依靠 OFI(OpenFabric Interface) 繞過操作系統,將 DAOS 操作交付給 DAOS 存儲服務器,充分利用架構中的任何遠程直接內存訪問 (RDMA, Remote Direct Memory Access) 功能,進行低延遲、高消息速率的用戶空間通信,並將數據存儲在持久內存和 NVMe 固態盤中。
DAOS 的鍵值存儲接口提供了統一的存儲模型,通過遷移 I/O 中間件庫實現對 DAOS API 的原生支持后,就能利用 DAOS 豐富的 API 和先進功能,例如 HDF5、MPI-IO 和 Apache Arrow。
DAOS 還提供 POSIX 的仿真。POSIX 不再是新數據模型的基礎,而是像其他 I/O 中間件一樣,POSIX 接口將構建為 DAOS 后端 API 頂部的庫。
DAOS 的 I/O 操作會被記錄並存儲到 SCM 維護到持久索引中,每次 I/O 都用一個特定時間戳標記,並與數據集的特定版本關聯。內部不執行讀-修改-寫 (read-modify-write) 操作,寫入操作是無損的,對對齊不敏感。在讀取請求時,DAOS 服務器遍歷持久索引,創建聚合 RDMA 描述符,從而直接在應用程序提供的緩沖區中重建所請求的版本的數據。
SCM 直接映射到 DAOS 服務地址空間的內存,DAOS 服務通過直接加載/存儲來管理持久索引。根據不同 I/O 的特性,DAOS 服務可以決定將 I/O 存儲在 SCM 或 NVMe 中:
- 對延遲敏感的I/O(如應用程序元數據和字節粒度數據)通常存儲在 SCM 中;
- 檢查點和批量數據存儲在 NVMe 中。
這種方法允許 DAOS 將數據流式傳輸到 NVMe 中,並在 SCM 中維護內部元數據索引,為批量數據提供原始 NVMe 帶寬。持久內存開發工具包 PMDK 管理對 SCM 的事務性訪問,存儲性能開發工具包 SPDK 對 NVMe 設備進行用戶空間 I/O 操作。
DAOS 可以提供:
- 超高細粒度、低延遲和真正零拷貝的 I/O
- 非阻塞型數據和元數據操作,以支持 I/O 和計算重疊
- 先進的數據放置,以解決故障域
- 由軟件管理冗余,可通過在線重建,支持復制和擦除代碼
- 端到端 (E2E) 數據完整性
- 可擴展的分布式事務,提供可靠的數據一致性和自動恢復功能
- 數據集快照功能
- 安全框架,用於管理存儲池的訪問控制
- 軟件定義存儲管理,用於調配、配置、修改和監控存儲池
- 通過 DAOS 數據模型和 API,為 I/O 中間件庫(例如 HDF5、 MPI-IO 和 POSIX)提供原生支持。應用無需移植代碼,即可直接使用 DAOS API
- Apache Spark 集成
- 使用發布/訂閱 API,實現原生生產者/消費者工作流程
- 數據索引和查詢功能
- 存儲內計算,以減少存儲和計算節點之間的數據移動
- 容災工具
- 與 Lustre 並行文件系統無縫集成,並能擴展到其他並行文件系統,從而為跨多個存儲層的數據訪問提供統一的命名空間
- 數據搬運器,用於在 DAOS 池之間遷移數據集,將數據集從並行文件系統遷移到 DAOS,反之亦然
DAOS 組件
一個數據中心可能有數十萬個計算節點,通過一個可伸縮的高性能結構相互連接,其中所有節點或稱為存儲節點的節點子集都可以直接訪問 NVM 存儲。
DAOS 安裝涉及幾個可以集中或分布式的組件。
DAOS 系統和存儲節點
DAOS系統由一個系統名標識,它由一組連接到同一結構的 DAOS 存儲節點組成。DAOS 存儲節點為每個節點運行一個 DAOS 服務實例,該實例為每個物理套接字啟動一個 DAOS I/O 引擎進程。這些 DAOS 服務的信息被記錄到系統映射中,該映射為每個 I/O 引擎進程分配一個唯一的整數秩。兩個不同的 DAOS 系統由兩組不相交的 DAOS 服務器組成,它們之間無法相互配合。
DAOS 服務
DAOS 服務是一個多租戶守護進程,運行在每個存儲節點的 Linux 實例上(物理節點、虛擬機或容器)。服務的 I/O 引擎子進程通過網絡導出本地連接的 SCM 和 NVM 存儲。服務監聽一個管理端口(由 IP 地址和 TCP 端口號尋址),以及一個或多個結構端點(由網絡 URI 尋址)。
DAOS 服務通過 /etc/DAOS
中的 YAML 文件進行配置,包括其 I/O 引擎子進程的配置。服務的啟動可以與不同的守護進程管理或編排框架集成(systemd 腳本、Kubernetes 服務、或類似 pdsh 和 srun 的並行啟動程序)。
I/O引擎
在 DAOS I/O 引擎中,存儲靜態地跨越多個 Target 分區,增強並發能力。為了避免競爭,每個 Target 都有其私有存儲、自己的服務線程池以及專用的網絡上下文,這些上下文可以直接通過結構尋址,而不依賴於托管在同一存儲節點上的其他 Target 。
SCM 模塊通常以 AppDirect interleaved 模式配置。因此,它們作為每個套接字(在 fsdax
模式)的單個 PMEM 命名空間呈現給操作系統。當配置每個 I/O 引擎的 N 個 Target 時,每個 Target 都使用該套接字 fsdax
的 SCM 容量的 \(\frac{1}{N}\),與其它 Target 獨立。每個 Target 還使用連接到此套接字的 NVMe 驅動器容量的一小部分。
Target
Target 沒有針對存儲介質故障實現任何內部數據保護機制。因此,一個 Target 就是一個單點故障,同時也是故障單元。動態狀態與每個 Target 相關聯:其狀態可以是“up and running”,也可以是“down and not available”。
Target 是性能的單位。與 Target 關聯的硬件組件(如后端存儲介質、CPU 核心和網絡)的能力和容量有限。
DAOS I/O 引擎實例導出的 Target 數是可配置的,取決於底層硬件(I/O 引擎實例的 SCM 模塊數和 NVMe SSD 數)。I/O 引擎的 Target 數的最佳配置是該 I/O 引擎服務的 NVMe 驅動器數的整數倍。
存儲 API、應用程序接口和工具
應用程序、用戶和管理員可以通過兩個不同的客戶端 API 與 DAOS 系統交互。
管理 API 提供了管理 DAOS 系統的接口。它旨在與不同供應商的存儲管理或開源編排框架集成。dmg
命令行工具是在 DAOS 的管理 API 上構建的。
DAOS 庫 libdaos
實現了 DAOS 存儲模型,主要提供給希望在 DAOS 系統中存儲數據集的應用程序和 I/O 中間件的開發人員。用戶常用的 daos
命令等的也構建在 API 之上,允許用戶通過命令行管理數據集。
應用程序可以通過本機 DAOS API、I/O 中間件庫(如 POSIX 仿真、MPI-IO、HDF5)或已與本機 DAOS 存儲模型集成的 Spark 或 TensorFlow 等框架直接訪問存儲在 DAOS 中的數據集。
代理
DAOS 代理是駐留在客戶端節點上的守護進程,通過與 DAOS 庫交互驗證應用程序進程。它是一個可信任的實體,支持使用證書對 DAOS 客戶端進行簽名。DAOS 代理支持不同的身份驗證框架,並使用 Unix 域套接字與客戶端庫通信。
相關信息
GitHub: https://github.com/storagezhang
Emai: debugzhang@163.com
華為雲社區: https://bbs.huaweicloud.com/blogs/253697