分散式非同步物件儲存 (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