公眾號文章匯總
916
2022-05-30
Pool 是分布在不同存儲節點上的一組 Target,在這些存儲節點上分布數據和元數據以實現水平可伸縮性,并對其進行復制或糾刪碼編碼以確保持久性和可用性(請參考 DAOS 分布式異步對象存儲|存儲模型?DAOS Pool 一節)。
Pool Service
Pool Service (pool_svc) 存儲 Pool 的元數據,并提供一個 API 來查詢和更新 Pool 的配置。
Pool 的元數據被組織為鍵值存儲 (key-value stores, KVS) 的層次結構,這些鍵值通過復制存儲在多個服務器上,而這些服務器由 Raft 一致性協議支持。
客戶端請求只能由 Leader 提供服務,而 Follower 的副本只響應一個指向當前 Leader 的提示,以便客戶端重試。
pool_svc?派生自一個通用的復制服務模塊 rsvc(請參考 Replicated Services: Architecture),它的實現便于客戶端搜索當前的 Leader。
元數據設計
第一級 KVS 存儲 Pool 映射、UID、GID 和 mode 等安全屬性、與空間管理和自愈(請參考 Rebuild)相關的信息,以及包含用戶定義屬性的第二級 KVS(請參考 Container Service: Metadata Layout)。
此外,它還存儲有關 Pool 連接的信息,這些信息由 Pool 句柄表示,并由客戶端生成的句柄 UUID 標識。
術語“Pool 連接” (pool connection) 和“Pool 句柄” (pool handle) 可以互換使用。
Pool 操作
Pool / Pool Service 創建
Pool 的創建完全由管理服務驅動,因為與存儲分配和查詢容錯域相關的步驟需要特殊權限。
格式化所有 Target 后,Target 組件調用每個 Target 上的 Pool 模塊的 ds_pool_create,它為當前 Target 生成一個新的 UUID,并將其存儲在 DSM_META_FILE 中。
此時,管理模塊通過調用 ds_pool_svc_create 將控制權傳遞給 Pool 模塊,這將在組合 Pool 和 Container Service 的選定節點子集上初始化復制服務。
Pool 模塊現在向創建數據庫服務的服務負責人發送 Pool_CREATE?請求;然后將 Target 列表及其容錯域轉換為 Pool 映射的初始版本,并與其他初始 Pool 元數據一起存儲在 Pool Service 中。
Pool 連接
為了建立 Pool 連接,客戶端進程使用 Pool UUID、連接信息(如組名和服務等級列表)和連接標志調用客戶端庫中的 daos_pool_connect?方法;這將向 Pool Service 發起 Pool 連接請求。Pool Service 嘗試根據正在使用的安全模型(例如,類似 POSIX 的模型中的 UID/GID)對請求進行身份驗證,并將請求的功能授權給客戶端生成的 Pool 句柄 UUID。在繼續之前,Pool 映射被傳輸到客戶端;如果從這一步開始出現錯誤,服務器可以簡單地要求客戶端放棄 Pool 映射。
此時,Pool Service 將檢查現有的 Pool 句柄:
如果已經存在具有相同 UUID 的 Pool 句柄,則表示已經建立了 Pool 連接,無需執行其他操作。
如果存在另一個 Pool 句柄,且當前請求的或現有的 Pool 句柄具有獨占訪問權限,則連接請求將被拒絕,并顯示忙碌狀態代碼。
如果一切順利,Pool Service 將使用 Pool 句柄 UUID 向 Pool 中的所有 Target 發送一個集中式 POOL_TGT_CONNECT 請求。Target Service 將創建并緩存本地 Pool 對象,并打開本地 VOS Pool 進行訪問。
一組對等應用程序進程可以共享一個 Pool 連接句柄(請參考 DAOS 分布式異步對象存儲|存儲模型 DAOS Pool 一節和 Use Cases: Storage Management and Workflow Integration)。
要關閉 Pool 連接,客戶端進程使用 Pool 句柄調用客戶端庫中的 daos_pool_disconnect 方法,觸發對 Pool Service 的 POOL_DISCONNECT 請求,Pool Service 會向 Pool 中的所有 Target 發送一個集中式 POOL_TGT_DISCONNECT 請求。這些步驟將銷毀與連接關聯的所有狀態,包括所有 Container 句柄。最好在調用 disconnect 方法之前,共享此連接的其他客戶端進程在本地銷毀它們的 Pool 句柄副本。如果一組客戶端進程在調用 disconnect 方法之前提前終止,那么一旦 Pool Service 從運行時環境中了解到該事件,它們的 Pool 連接最終將被逐出。
相關信息
Emai: debugzhang@163.com
DAOS: https://github.com/daos-stack/daos
本文翻譯自 https://github.com/daos-stack/daos/blob/master/src/pool/README.md
分布式 存儲 對象存儲服務 OBS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。