DAOS 分布式異步對象存儲|存儲模型

      網友投稿 792 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/storage

      概述

      DAOS 分布式異步對象存儲|存儲模型

      DAOS Pool 是分布在 Target 集合上的存儲資源預留。分配給每個 Target 上的 Pool 的實際空間稱為 Pool Shard。

      分配給 Pool 的總空間在創(chuàng)建時確定,后期可以通過調整所有 Pool Shard 的大小(在每個 Target 專用的存儲容量限制內)或跨越更多 Target(添加更多 Pool Shard)來隨時間擴展。

      Pool 提供了存儲虛擬化,是資源調配和隔離的單元。DAOS Pool 不能跨多個系統(tǒng)。

      一個 Pool 可以承載多個稱為 DAOS Container 的事務對象存儲。每個 Container 都是一個私有的對象地址空間,可以對其進行事務性修改,并且獨立于存儲在同一 Pool 中的其他 Container。Container 是快照和數(shù)據(jù)管理的單元。屬于 Container 的 DAOS 對象可以分布在當前 Pool 的任何一個 Target 上以提高性能和恢復能力,并且可以通過不同的 API 訪問,從而高效地表示結構化、半結構化和非結構化數(shù)據(jù)。

      下表顯示了每個 DAOS 概念的目標可伸縮性級別:

      DAOS Pool

      Pool 由唯一的 Pool UUID 標識,并在稱為 Pool 映射的持久版本控制列表中維護 Target 成員身份。成員資格是確定的和一致的,成員資格的變更是按順序編號的。Pool 映射不僅記錄活躍 Target 的列表,還以樹的形式包含存儲拓撲,用于標識共享公共硬件組件的 Target。例如,樹的第一級可以表示共享同一主板的 Target,第二級可以表示共享同一機架的所有主板,最后第三級可以表示同一機房中的所有機架。

      該框架有效地表示了層次化的容錯域,然后使用這些容錯域來避免將冗余數(shù)據(jù)放置在發(fā)生相關故障的 Target 上。在任何時候,都可以將新 Target 添加到 Pool 映射中,并且可以排除失敗的 Target。此外,Pool 映射是完全版本化的,這有效地為映射的每次修改分配了唯一的序列,特別是對于失敗節(jié)點的刪除。

      Pool Shard 是永久內存的預留,可以選擇與特定 Target 上 NVMe 預先分配的空間相結合。它有一個固定的容量,滿了就不能運行。可以隨時查詢當前空間使用情況,并報告 Pool Shard 中存儲的任何數(shù)據(jù)類型所使用的總字節(jié)數(shù)。

      一旦 Target 失敗并從 Pool 映射中排除,Pool 中的數(shù)據(jù)冗余將自動在線恢復。這種自愈過程稱為重建。重建進度定期記錄在永久內存中存儲的 Pool 中的特殊日志中,以解決級聯(lián)故障。添加新 Target 時,數(shù)據(jù)會自動遷移到新添加的 Target,以便在所有成員之間平均分配占用的空間。這個過程稱為空間再平衡,使用專用的持久性日志來支持中斷和重啟。

      Pool 是分布在不同存儲節(jié)點上的一組 Target,在這些節(jié)點上分布數(shù)據(jù)和元數(shù)據(jù)以實現(xiàn)水平可伸縮性,并使用復制或糾刪碼 (erasure code) 確保持久性和可用性。

      創(chuàng)建 Pool 時,必須定義一組系統(tǒng)屬性以配置 Pool 支持的不同功能。此外,用戶還可以定義將持久存儲的屬性。

      Pool 只能由經過身份驗證和授權的應用程序訪問。DAOS 支持多種安全框架,例如 NFSv4 訪問控制列表或基于第三方的身份驗證 (Kerberos)。連接到 Pool 時強制執(zhí)行安全性檢查。成功連接到 Pool 后,將向應用程序進程返回連接上下文。

      如前文所述,Pool 存儲許多不同種類的持久性元數(shù)據(jù),如 Pool 映射、身份驗證和授權信息、用戶屬性、特性和重建日志。這些元數(shù)據(jù)非常關鍵,需要最高級別的恢復能力。因此,Pool 的元數(shù)據(jù)被復制到幾個來自不同高級容錯域的節(jié)點上。對于具有數(shù)十萬個存儲節(jié)點的非常大的配置來說,這些節(jié)點中只有很小的一部分(大約幾十個)運行 Pool 元數(shù)據(jù)服務。在存儲節(jié)點數(shù)量有限的情況下,DAOS 可以依賴一致性算法來達成一致,在出現(xiàn)故障時保證一致性,避免腦裂。

      要訪問 Pool,用戶進程應該連接到 Pool 并通過安全檢查。一旦授權,Pool 就可以與任何或所有對等應用程序進程(類似 openg() POSIX 擴展)共享(通過 local2global() 和 global2local() 操作)連接。這種集體連接機制有助于在數(shù)據(jù)中心上運行大規(guī)模分布式作業(yè)時避免元數(shù)據(jù)請求風暴。當發(fā)出連接請求的原始進程與 Pool 斷開連接時,Pool 連接將被注銷。

      DAOS Container

      Container 代表 Pool 中的對象地址空間,由 Container UUID 標識。

      下圖顯示了用戶(I/O 中間件、特定領域的數(shù)據(jù)格式、大數(shù)據(jù)或 AI 框架等)如何使用 Container 來存儲相關數(shù)據(jù)集:

      與 Pool 一樣,Container 可以存儲用戶屬性。Container 在創(chuàng)建時必須傳遞一組屬性,以配置不同的功能,例如校驗和。

      要訪問 Container,應用程序必須首先連接到 Pool,然后打開 Container。如果應用程序被授權訪問 Container,則返回 Container 句柄,它的功能包括授權應用程序中的任何進程訪問 Container 及其內容。打開進程可以與所有對等進程共享此句柄。它們的功能在 Container 關閉時被撤銷。

      Container 中的對象可能具有不同的模式,用于處理數(shù)據(jù)分布和 Target 上的冗余,定義對象模式所需的一些參數(shù)包括動態(tài)或靜態(tài)條帶化、復制或糾刪碼。Object 類定義了一組對象的公共模式屬性,每個 Object 類都被分配一個唯一的標識符,并在 Pool 級別與給定的模式相關聯(lián)。一個新的 Object 類可以在任何時候用一個可配置的模式來定義,這個模式在創(chuàng)建之后是不可變的(或者至少在屬于這個類的所有對象都被銷毀之前)。

      為了方便起見,在創(chuàng)建 Pool 時,默認情況下會預定義幾個最常用的 Object 類:

      如下所示,Container 中的每個對象都由一個唯一的 128 位對象地址標識。對象地址的高 32 位保留給 DAOS 來編碼內部元數(shù)據(jù),比如 Object 類。剩下的 96 位由用戶管理,在 Container 中應該是唯一的。只要保證唯一性,棧的上層就可以使用這些位來編碼它們的元數(shù)據(jù)。DAOS API 為每個 Container 提供了 64 位可伸縮對象 ID 分配器。應用程序要存儲的對象 ID 是完整的 128 位地址,該地址僅供一次性使用,并且只能與單個對象模式相關聯(lián)。

      <---------------------------------- 128 bits ----------------------------------> -------------------------------------------------------------------------------- |DAOS Internal Bits| Unique User Bits | -------------------------------------------------------------------------------- <---- 32 bits ----><------------------------- 96 bits ------------------------->

      Container 是事務和版本控制的基本單元。所有的對象操作都被 DAOS 庫隱式地標記為一個稱為 epoch 的時間戳。DAOS 事務 API 允許組合多個對象更新到單個原子事務中,并基于 epoch 順序進行多版本并發(fā)控制。所有版本更新都可以定期聚合,以回收重疊寫入所占用的空間,并降低元數(shù)據(jù)復雜性。快照是一個永久引用,可以放置在特定的 epoch 上以防止聚合。

      Container 元數(shù)據(jù)(快照列表、打開的句柄、對象類、用戶屬性、屬性和其他)存儲在持久性內存中,并由專用 Container 元數(shù)據(jù)服務維護,該服務使用與父元數(shù)據(jù) Pool 服務相同的復制引擎或自己的引擎,這在創(chuàng)建 Container 時是可配置的。

      與 Pool 一樣,對 Container 的訪問由 Container 句柄控制。要獲取有效的句柄,應用程序進程必須打開 Container 并通過安全檢查。然后,可以通過 Container 的 local2global() 和 global2local() 操作與其他對等應用程序進程共享此句柄。

      DAOS Object

      為了避免傳統(tǒng)存儲系統(tǒng)常見的擴展問題和開銷,DAOS 有意將對象簡化,不提供類型和架構之外的默認對象元數(shù)據(jù)。這意味著系統(tǒng)不維護時間、大小、所有者、權限,甚至不跟蹤開啟者。

      為了實現(xiàn)高可用性和水平伸縮性,DAOS 提供了許多對象模式(復制/糾刪碼、靜態(tài)/動態(tài)條帶化等)。模式框架是靈活的,并且易于擴展,以允許將來使用新的自定義模式類型。模式布局是在對象標識符和 Pool 映射打開的對象上通過算法生成的。通過在網絡傳輸和存儲期間使用校驗和保護對象數(shù)據(jù),確保了端到端的完整性。

      可以通過不同的 API 訪問 DAOS 對象:

      Multi-level key-array API 是具有局部性特征的本機對象接口。key 分為 distribution key (dkey) 和 attribute key (akey)。dkey 和 akey 都可以是可變長度的類型(字符串、整數(shù)或其它復雜的數(shù)據(jù)結構)。同一 dkey 下的所有條目都保證在同一 Target 上并置。與 akey 關聯(lián)的值可以是不能部分修改的單個可變長度值,也可以是固定長度值的數(shù)組。akeys 和 dkey 都支持枚舉。

      Key-value API 提供了一個簡單的鍵和可變長度值接口。它支持傳統(tǒng)的 put、get、remove 和 list 操作。

      Array API 實現(xiàn)了一個由固定大小的元素組成的一維數(shù)組,該數(shù)組的尋址方式是 64 位偏移尋址。DAOS 數(shù)組支持任意范圍的 read、write 和 punch 操作。

      分布式 存儲 對象存儲服務 OBS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Swagger中的常用注解
      下一篇:docker 容器操作命令
      相關文章
      亚洲日韩VA无码中文字幕| 亚洲日韩国产二区无码| 国产精品亚洲一区二区在线观看 | 久久精品国产亚洲Aⅴ香蕉 | 久久久亚洲精品国产| 亚洲国产精品福利片在线观看| 亚洲愉拍99热成人精品热久久| 亚洲色一色噜一噜噜噜| 激情小说亚洲色图| 亚洲AV无码专区在线厂| 日韩精品亚洲专区在线影视| 大胆亚洲人体视频| 亚洲福利精品一区二区三区| 亚洲精品无码成人片在线观看| va亚洲va日韩不卡在线观看| 亚洲AV无码乱码在线观看| 亚洲精品综合久久| 国产亚洲成人在线播放va| 亚洲无线码在线一区观看| 亚洲国产精品无码久久一区二区 | 国产亚洲中文日本不卡二区| 亚洲中文字幕一二三四区苍井空 | 国产亚洲精品岁国产微拍精品| 亚洲VA中文字幕无码毛片| 亚洲AV无码乱码国产麻豆| 亚洲丝袜美腿视频| 亚洲男女性高爱潮网站| 77777午夜亚洲| 色噜噜的亚洲男人的天堂| 亚洲第一成人影院| 亚洲一区二区三区在线观看精品中文| 亚洲中文字幕无码一区二区三区| 亚洲国产精品无码成人片久久| 亚洲伦理一区二区| 亚洲国产精品日韩在线观看| 亚洲一区二区三区在线观看网站| 含羞草国产亚洲精品岁国产精品| 亚洲精品无码久久不卡| 亚洲av最新在线网址| 亚洲宅男天堂a在线| 亚洲国产成人无码AV在线影院|