公眾號文章匯總
767
2022-05-30
Container 表示 Pool 中的對象地址空間,并由 UUID 標識。要訪問 Container,應用程序必須首先連接到 Pool,然后創建或打開 Container。如果應用程序被授權訪問 Container,它將獲得 Container 句柄。這包括授權應用程序中的任何進程訪問 Container 及其內容的功能。這一進程可以與其它的對等進程共享此句柄。它們的功能在關閉 Container 時被取消。(請參考 存儲模型?DAOS Container 一節)。
元數據設計
Container Service (cont_svc) 存儲 Container 的元數據,并提供一個 API 來查詢和更新狀態以及管理 Container 的生命周期。
Container 的元數據被組織為鍵值存儲 (key-value stores, KVS) 的層次結構,這些鍵值會復制到多個服務器上,而這些服務器由 Raft 一致性協議支持。
客戶端請求只能由 Leader 提供服務,而 Follower 的副本只響應一個指向當前 Leader 的提示,以便客戶端重試。
cont_svc 派生自一個通用的復制服務模塊 rsvc(請參考 Replicated Services: Architecture),它的實現便于客戶端搜索當前的 Leader。
第一級 KVS root 有兩個子節點:
Containers KVS:保存 Container Properties KVS 列表,KVS 由用戶在創建新 Container 時提供的 UUID 索引。
Container Handles KVS:用于存儲由各種應用程序打開的 Container 句柄的數據,并由客戶端在打開 Container 時生成的句柄 UUID 索引。與 Container 句柄相關聯的元數據包括其功能(例如只讀或讀寫)及其每個句柄的 epoch 狀態。當 Container 關閉時,相應的條目將從此存儲中刪除。
Container Properties KVS 用于存儲每個 Container 的元數據,這些元數據由許多可變和不可變的標量值屬性以及其他 KVS 組成,如上圖所示。
用戶可以創建、刪除和檢索持久快照列表,這些快照本質上是不會被聚合的 epoch。快照在顯式銷毀之前保持可讀性,Container 也可以回滾到特定快照。(請參閱 存儲模型?DAOS Container 一節和 事務模型?Container 快照一節)。
用戶還可以為 Container 定義自定義屬性,這些 Container 本質上是 name-value 鍵值對:
name 是以空字符結尾的字符串;
value 是任意字節序列。
Container Service 允許客戶端一次檢索和更新多個屬性,并列出存儲屬性的名稱。
Target Service
Target Service 將 DAOS Container 的全局對象地址空間映射到 Target 的 VOS Pool (vpool) 中 VOS Container 的本地對象地址空間,并代表 Container VOS 調用 VOS 方法(請參閱 VOS Concepts)。它在 Container 對象上緩存每個線程的信息,并在易失性內存中打開句柄以便隨時訪問。
Target 故障
給定數十萬個 Target,epoch 協議必須允許在存在 Target 故障的情況下正常工作。由于 Pool Service 和 Container Service 均具有高可用性,因此問題主要與 Target Service 有關。
該解決方案基于這樣的假設:丟失某些 Target 不一定會導致任何應用程序數據丟失,因為 DAOS-SR 層可能會創建足夠的冗余來對應用程序隱藏故障。此外,應用程序甚至可能希望忽略特定的數據丟失(此時 DAOS-SR 層無法隱藏),因為它有足夠的應用程序級冗余來應對,或者根本不關心。
當寫入、刷新或丟棄操作失敗時,DAOS-SR 層計算是否有足夠的冗余來繼續 epoch。如果故障可以隱藏,并且假設 Pool 映射中尚未禁用所討論的 Target(例如,RAS notification),則 DAOS-SR 層必須在提交 epoch 之前禁用 Target。對于 epoch 協議,生成的 Pool 映射更新有效地記錄了 Target 可能在 epoch 中存儲一組未定義的寫操作的事實,所以應該盡量避免這種情況。這也適用于希望忽略 DAOS-SR 層無法隱藏的類似故障的應用程序。
Object ID 分配器
OID 分配器是一個例行幫助服務,它允許用戶在 Container 中分配一組唯一的 64 位無符號整數。這對無法以可伸縮的方式輕松分配唯一的 DAOS Container ID 的應用程序或中間件很有幫助。
在 Container Properties KVS 中跟蹤分配的最大 ID,以便將來訪問該 Container。此服務不保證分配的 ID 是連續的,并且在 Container 關閉時可能會丟棄多個 ID 范圍。
分配器是使用服務器端的 Incast Varialbe (IV) 實現的,該變量跟蹤 IV 樹根節點上 Container 使用的最大的 Object ID。客戶端可以從運行 Container Target Service 的任何服務器(即 IV 樹中的任何節點)請求新的分配。當一個新的請求到達時,服務器首先檢查本地是否有可供分配的 ID。如果沒有,它會將請求轉發給父級(在這種情況下,請求更大范圍的 OID)。父級執行相同的檢查并不斷轉發到其父級,直到滿足請求或我們到達 IV 根節點,根節點將更新 Container 元數據中記錄所分配的最大 OID 的 Incast Varialbe。在每個樹級別,可請求的 OID 數量都會增加,以便更快地滿足未來的 OID 分配請求。
Container 操作
客戶端通過使用 Pool 句柄和 UUID 向 Container Service 發送 CONT_CREATE?請求來創建新的 Container。客戶端必須首先建立 Pool 連接才能獲得 Pool 句柄。請求還可以包含要在新創建的 Container 上設置的屬性列表。作為響應,Container Service 使用 UUID 作為鍵創建相應的 Container Properties KVS。創建 Container 不需要 Target Service 的參與。
客戶端現在可以通過提供打開的 Pool 句柄和 Container 的 UUID 以及打開標志(例如只讀或讀寫)來打開 Container。客戶端庫向 Container Service 發送一個帶有本地生成的 UUID 的 CONT_OPEN?請求,然后使用 IV (Incast Varialbe) 將句柄異步廣播到 Pool 中所有啟用的 Target。成功完成后,它將在 Container Handles KVS 中創建一個新條目。
客戶端可以通過向 Container Service 發送 CONT_CLOSE?請求來關閉不再需要的 Container 句柄,該請求作為一個集中式的 CONT_TGT_CLOSE?向所有啟用的 Target 廣播,以便關閉 Container 句柄。然后從 Container Handles KVS 中刪除相應的條目,并放棄對句柄執行未提交的更新。
當客戶端向 Container Service 發送 CONT_DESTROY?請求使其清除所有元數據時,Container 將被銷毀。類似地,Target 共同接收來自 Container Service 的 CONT_TGT_DESTROY?請求,并刪除與該 Container 相關聯的所有數據,包括該 Container 中的所有 Object。如果當前 Container 有打開的句柄,客戶端可以選擇強制銷毀該 Container。
Epoch 協議
epoch 協議實現了事務模型中描述的 epoch 模型。Container Service 管理 Container 的 epoch(作為 Container 元數據的一部分維持確定的 epoch 狀態),而 Target Service 對全局 epoch 狀態缺乏了解。因此,epoch 的提交、丟棄和聚合過程都由 Container Service 驅動。
在每個 Target 上,Target Service 會迅速將傳入的寫操作存儲到匹配的 VOS Container 中。如果 Container 句柄丟棄了一個 epoch,VOS 將幫助丟棄與該 Container 句柄關聯的所有寫操作。
當寫操作成功時,在相等或更高的 epoch 中,沖突操作立即可見。VOS 將拒絕具有相同 epoch 的沖突寫入操作,除非它與同一 Container 句柄關聯,并且內容與已執行的內容相同。
在提交一個 epoch 之前,應用程序必須確保 Target Service 已持久化此階段足夠的寫操作集。應用程序可以根據它們各自采用的冗余方案丟失一些寫操作。提交 Container 句柄的 epoch 會將 CONT_EPOCH_COMMIT?請求發送到相應的 Container Service,該服務只需要更新元數據。當更新變持久化后,Container Service 將以新的 epoch 狀態向客戶端回復。
相關信息
Emai: debugzhang@163.com
DAOS: https://github.com/daos-stack/daos
本文翻譯自 https://github.com/daos-stack/daos/blob/master/src/container/README.md
分布式 存儲 對象存儲服務 OBS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。