DAOS 分散式非同步對象存儲|架構設計

分散式非同步對象存儲 (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: //github.com/storagezhang

Emai: [email protected]

華為雲社區: //bbs.huaweicloud.com/blogs/253697

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

本文翻譯自 //daos-stack.github.io/overview/architecture

Tags: