oVirt中的存儲管理

oVirt(open Virtualization) 是一個基於 KVM(Kernel-based Virtual Machine)  的開源 IaaS(Infrastructure as a Service) 項目,其前身是 Redhat 的桌面虛擬化商業產品。存儲器的管理是  oVirt 的重點,本文將介紹 oVirt 是如何組織與分配各類存儲器的,用戶應該如何使用它。git

oVirt 的 Node/Engine 結構

oVirt 是一個基於 x86 架構上的 KVM 虛擬化技術的開源 IaaS 雲服務解決方案。在架構設計上它使用了 Node/Engine 分離結構,以方便功能的劃分與管理。算法

圖 1.oVirt 邏輯結構圖

圖 1.oVirt 邏輯結構圖

圖 1 從整體框架上說明了 oVirt 的工做流程。對外,oVirt 中的 Engine 經過 HTTP 協議向外提供 HTTP  API,同時提供內建的網頁服務供用戶和系統管理員使用。系統管理員經過網頁能夠建立、修改虛擬機及相關設備或用戶權限,用戶在擁有權限的狀況下能夠操做 本身的虛擬機,並經過 VNC 或 SSH 登錄本身的虛擬機。Engine  在整個系統中充當管理者的角色並對外提供管理服務,它掛載了本身的數據庫記錄整個系統中全部的虛擬機配置,各個節點的自身狀態,系統的網絡狀態,存儲器狀 態。管理的邏輯,狀態及策略所有在 Engine 中設置與實現。Node 只負責功能上的實現,不進行任何狀態的記錄和任何策略的實現。Engine 與  Node 之間的關係十分像 Linux  中驅動程序與應用程序的功能分割關係:驅動僅僅負責功能的實現,如設備的讀、寫、開啓與關閉,如何使用這些功能留給應用層。一樣 Node  僅僅負責實現虛擬機器與設備的建立與修改,資源的共享與保護,如何使用這些功能交給 Engine 處理。Node 暴露兩種基於網絡的 API 與  Engine 交互,XMLRPC 與 REST。Engine 經過這些接口控制各個 Node 上功能的啓動。固然用戶也能夠調用這些 API  進行第三方程序的開發。數據庫

oVirt 裏的 Node 能夠由一個普通的 Linux 上安裝 VDSM(Virtual Desktop  Server Manager) 構成,也能夠由一個專爲 oVirt 定製的 Linux 系統構成。在定製的狀況下,Node  上的許多文件系統都是 ramdisk( 基於內存的 Linux 磁盤設備 ),系統重啓後其中的內容消失,從而保證了 Node  的無狀態性。Engine/Node 的設計不只方便未來的開發,更簡化了用戶的安裝使用,在定製的狀況下 Node 能夠快速大量部署。本文主要以定製  Node 爲例說明 VDSM 的相關功能。安全

VDSM 對存儲器的管理

每 一個 Node 上都會運行一個 VDSM,實現網絡、存儲器、虛擬機的建立與修改的功能。VDSM  的大部分代碼用在了存儲系統上,其功能包括數據的組織,集羣下的數據共享與保護,故障恢復。一般狀況下每個物理機器看成一個 Node,運行一個  VDSM,Node 自己只攜帶少許存儲器用以保存配置。一個集羣中一般有一個 Engine 和數個 Node,這些 Node 經過網絡鏈接到  SAN(Storage Area Network) 上,VDSM 把 Node 上運行的虛擬機存儲數據保存在 SAN 上,Node  自己爲無狀態的節點,從新啓動後狀態消失,從而保證了系統總體的可用性,通常狀況下不會因用戶的操做而使 Node  失效。一旦問題發生,一般一次重啓既可恢復工做狀態。性能優化

圖 2.Node 上運行的主要組件

圖 3.Data Center 結構圖舉例

簡單歸納起來,VDSM 的功能主要有:負責 Node 的自動啓動與註冊;虛擬機的操做與生命週期管理;網絡管理;存儲管理;Host 與  VM(Virtual Machine) 狀態監視與報告;提供對虛擬機的外部干涉功能;提供內存與存儲的合併與超支功能 (Over  Commitment)。網絡

在雲計算環境中,SAN 中每每存儲着大量虛擬機器使用的 virtual image,同時每個  virtual image 在任什麼時候候均可能被任意 Node 訪問,同時出於性能的考慮 virtual image  可能以文件或者數據塊的形式出現,這些對存儲系統的設計提出了挑戰。多線程

爲此,VDSM 基於如下原則設計了本身的存儲系統:架構

1 高可用性:一羣安裝有 VDSM 的 Node 在組建集羣的時候,沒有潛在的單點故障存在,任何一個 Node  崩潰不會影響整個集羣的功能,它的角色會被其餘 Node 取代。Engine 不可用的狀況下,Node  將繼續工做,用戶對虛擬機的操做能夠繼續進行。app

2 高伸縮性:添加 Node 和 SAN 幾乎不須要用戶的設置,Node 上的 VDSM 會本身註冊本身。框架

3 集羣安全性:一個 VDSM 對正在操做的 virtual image 進行排它性保護。

4 備份與恢復:virtual image 之間有相互關連的特性記錄可進行一系列引用 / 備份操做。

5 性能優化:利用多線程與多進程減小操做堵塞情況。

Storage Domain(如下簡程 SD) 是 VDSM 中的最基本存儲實體,全部的 virtual image 和 virtual  image 對應的元數據都會保存在其中。和 VDSM 中的 Storage Image 概念不一樣,這裏的 virtual image  表示的是虛擬機程序用到的虛擬磁盤數據,特指虛擬機程序最終可以操做的文件或設備文件對象。元數據是描述 virtual image  相關數據大小、狀態、鎖等內容的一組數據集合。SD 包括兩種類型:File Domain 和 Block Domain。File Domain  使用文件系統存儲數據並同步操做,主要針對 NFS(Network File System) 和 LOCALFS(Local File  System) 文件系統。在文件系統的幫助下,File Domain 擁有良好的 virtual image  操做能力,每個虛擬機的存儲數據(稱爲 Volume)和對應的元數據都以文件的方式保存。每個 Domain 實際對應於 Host  文件系統上的一個目錄,針對 NFS 文件系統 VDSM 還有額外的邏輯來處理相關意外與錯誤狀況。而 Block Domain  直接操做原始的塊數據,使用 Linux 的 LVM(Logical Volume Manager) 功能來組織數據,主要針對  iSCSI(Internet Small Computer System Interface),FCoE(Fibre Channel over  Ethernet ) 等塊設備。因爲目標設備上一般沒有一個文件系統來保證訪問的安全性,VDSM 使用了郵箱機制來保證任意時刻,只有一個 Node  能夠修改 Block 上的內容,而其餘 Node 則經過 Socket 郵箱發送本身的修改請求。所以它的操做請求速度和監視功能都會比 File  Domain 弱一些。一般設備將使用 Linux 的 device mapper 機制進行一次映射,每個 Domain 其實是一個  Linux 中的 Volume Group,元數據保存在其中的一個 Logic Volume 及其 tag 上,虛擬機的 Volume  保存在另外一個 Logic Volume 中。

Storage Pool( 如下簡稱 SP) 是一組 SD  的組合,目標是管理跨越 SD 之間的操做,也就是說 SD 之間互相的引用、備份、恢復,合併通常發生在一個 SP 之中。在數據中內心,一個 SP  抽象了一組 SD 的集合供外界的 Node 訪問或者 Engine 管理,而且一個 SP 中的全部 SD 必須是同一類型,如 NFS 或者  iSCSI。

爲了保證 SP 中的數據安全,一組 SP 中須要選擇一個 SD 做爲 Master Domain。這個 Domain 的不一樣之處在於它會保存 SP 中全部的元數據,保存一些異步請求或者任務的數據,保存所在 SP 的集羣存儲用到的鎖。

爲了簡化管理,oVirt 中抽象出了 Data Center 概念,一個 Data Center 將擁有一組 Node Cluster  用來運行虛擬機,一個 Storage Pool 用來保存虛擬磁盤數據。Node Cluster 是一組專門用來運行虛擬機的 Node  的集合,運行在其中的虛擬機能夠動態遷移到 Node Cluster 中的另一個 Node 上。一個 Data Center 是一個完成  oVirt 全部功能的實體,在這個 Data Center 中用戶能夠建立虛擬機、備份虛擬機、配置虛擬機的 Storage  Domain,動態遷移虛擬機。NodeEngine 有一些算法在開啓的時候能夠自動平衡 Data Center 中的 Node 的負載。固然  oVirt 中能夠存在數個 Data Center,它們之間的操做如備份與恢復不在本文的討論範圍以內,歸納起來一個 Data Center  是一個管理 Node Cluster 與 Storage Pool 的集合。

因爲 Data Center 中全部的 Node  都擁有對 Data Center 中的 Storage Pool 的訪問權限,所以 VDSM 實現了一個稱爲 SPM(Storage Pool  Manager) 的功能角色。在一個 Data Center 中,全部的 Node 啓動後會自動選舉出一個 Node 充當 SPM  的角色,被選舉者將運行 VDSM 上的 SPM 邏輯,負責完成如下功能:建立 / 刪除 / 縮放所在 Data Center 中的  Image,快照,模板。這些操做的共同點是會影響 Storage Pool 中的元數據,如 SAN 上鬆散塊設備的分配。爲了保證元數據不被多個  Node 同時修改,SPM 擁有對 Storage Pool 中元數據的排它性操做權限,SPM 使用集中式郵箱接受其餘 Node  的相關請求,其餘 Node 只能經過給 SPM 發送操做請求的方式修改元數據,最終的操做都由 SPM  線性完成,從而避免了存儲器操做競態的出現。爲了兼顧效率,不修改元數據的普通操做,如數據讀寫,Node 能夠不一樣過 SPM,本身直接訪問  Storage Pool 完成。因爲 SPM 是由一個普通 Node 選舉出來的,所以當它由於外部緣由失效後,系統將會選舉出另外的 Node  充當 SPM,從而保證系統能繼續運行。

圖 3.Data Center 結構圖舉例

圖 3.Data Center 結構圖舉例

前面所說的抽象概念主要是給 VDSM 本身組織管理數據用的,而 Storage Image 和 Storage Volume 則是  VDSM 抽象出來以方便給虛擬機使用的概念。Storage Image 和前文所描述的 virtual image 不一樣,virtual  image 是虛擬機程序看到的虛擬磁盤,一個 Storage Image 中每每包含不少 Storage Volume,每個 Storage  Volume 均可以做爲一個 virtual image 傳遞給虛擬機做爲虛擬磁盤使用。同一個 Storage Image 中的多個  Storage Volume 每每存在相互備份,相互引用等關係。當幾個 Storage Volume 之間是引用的關係時,這幾個 Storage  Volume 集合成爲一個 virtual image 傳遞給虛擬機,在虛擬機看來它操做的就是一個虛擬磁盤只不過數據分佈在一系列的  Storage Volume 上(這時把最外層的 Storage Volume 做爲參數傳遞給虛擬機啓動程序 )。Storage Image  用來管理這樣一組含有內在聯繫的 Storage Volume。在 Storage Domain 和 Storage Pool 建好後,VDSM  即可以經過 SPM 在指定的 Storage Domain 裏建立 Storage Image 與 Storage  Volume。建立虛擬機的時候須要 Storage Volume 作爲參數。

圖 4. VM 使用 Storage Volume 示意圖

圖 4. VM 使用 Storage Volume 示意圖

Storage Over Commitment  是一個容許管理者分配比實際存儲空間大的虛擬存儲器給用戶使用的技術。一個虛擬機所佔用的實際存儲空間能夠比它所定義的存儲空間小的多,只有當其中的存儲 數據真正增加時,其實際存儲空間纔會動態增加。如管理員定義 VM1 擁有 12G 的 Image,但系統啓動後這個 Image 實際只佔用了  10M 的存儲空間。當用戶在虛擬機安裝軟件後,Image  實際佔用的空間纔會增加。這種技術容許虛擬機不須要考慮實際機器的物理存儲能力,作到存儲器的共享與使用效率最大化。

Qemu  的幾種存儲格式都能提供這種動態伸縮能力,如 QCOW2 格式。VDSM 使用了 Qemu 的存儲縮放功能,當使用的 Storage Domain  爲 Logic Volume 時間,VDSM 將會監視 Qemu 所標記的寫入上限位置。當發現越界時,VDSM 將會請求 SPM 擴展  Logic Volume 大小,從而完成空間的動態增加。

圖 5. VDSM 對 LV 的動態擴展

圖 5. VDSM 對 LV 的動態擴展

回頁首

使用 VDSM 建立虛擬磁盤舉例

這裏從 VDSM API 的角度舉例說明虛擬磁盤的建立過程,用戶也能夠經過網頁 GUI 的形式操做 Engine  完成建立的過程,Engine 最後仍是會經過 VDSM API 完成最終的操做。例子語言爲 Python,VDSM 提供了 vdscli 類封裝  XMLRPC API 訪問方法。

 spUUID = '5c84a9d2-be25-49a9-bcb2-2f0f5b9066c0'   sdUUID = 'b9c4821e-e9c0-4dd4-8393-c59b82c9cd29'  imgUUID = '87f5f391-5b83-4e7f-9072-7f50266559c3'  volUUID = 'ce73fdd0-2630-40ca-b2df-a0dd90674dec'  # 這裏作爲測試,直接寫出了將使用的 UUID,實際環境中 UUID 由 Engine 或者用戶給出  def vdsOK(d):      print d      if d['status']['code']:          raise Exception(str(d))      return d   # 此函數用來判斷操做成功與否  def waitTask(s, taskid):      while vdsOK(s.getTaskStatus(taskid))['taskStatus']['taskState'] != 'finished':          time.sleep(3)      vdsOK(s.clearTask(taskid))   #VDSM 的任務不少是異步的,每個請求都是一個任務,此函數用來查詢任務成功與否  def main():      s = vdscli.connect()      # 鏈接 VDSM,默認鏈接本地的 VDSM      vdsOK(s.connectStorageServer(LOCALFS_DOMAIN,      "my favorite pet", [dict(id=1, connection=path)]))      # 鏈接到 VDSM 的一個 StorageServer      vdsOK(s.createStorageDomain(LOCALFS_DOMAIN, sdUUID,      "my local domain", path, DATA_DOMAIN, 0))      # 建立 Storage Domain sdUUID      vdsOK(s.createStoragePool(LOCALFS_DOMAIN, spUUID,      "pool name", sdUUID, [sdUUID], masterVersion))      # 以 sdUUID 爲 master domain 建立 Storage Pool      vdsOK(s.connectStoragePool(spUUID, hostID, "scsikey", sdUUID, masterVersion))      # 鏈接到 Storage Pool 上     tid = vdsOK(s.spmStart(spUUID, -1, -1, -1, 0))['uuid']      waitTask(s, tid)      # 啓動這個 Storage Pool 上的 SPM,成功後會有一個 Node 充當 SPM      sizeGiB = 10      sectors_per_GB = 2097152      size = sizeGiB * sectors_per_GB      tid = vdsOK(s.createVolume(sdUUID, spUUID, imgUUID, size,                         COW_FORMAT, SPARSE_VOL, LEAF_VOL,                         volUUID, "volly",                         BLANK_UUID, BLANK_UUID))['uuid']      waitTask(s, tid)      # 建立最終的 Volume,大小爲 10GB,此 Volume 存在於前面建立的 Storage Domain 上。至此,     #虛擬磁盤便準備好了,能夠用此磁盤的 UUID 作爲參數建立虛擬機了。  main()


VDSM 存儲部分代碼簡介

VDSM 中的存儲部分代碼主要在 ./vdsm/storage 下,下面簡單介紹下幾個重要的文件做用,讀者能夠參考以瞭解 VDSM 的具體實現方法。

Misc.py: 包含了幫助函數與工具以執行系統命令。

Hsm.py: Host Storage Manager 模塊,存儲管理的整體組織者,初試化和不少操做都是以此文件中的函數爲入口點的。

sd.py: Storage Domain 模型。

sp.py: Storage Pool 模型。

image.py: Storage Image 模型。

volume.py: Storage Volume 模型。

dispatcher.py: 任務分配器。

task.py: 任務模型。

taskManager.py: 任務的監視與管理。

safeLease.py: 集羣環境下的鎖。

storage_mailbox.py: 和 SPM 進行 mailbox 通訊的實現。

因爲 VDSM 的開發活動比較活躍,一些概念與組織在未來可能有變化,本文的內容基於版本 v4.9.6,您能夠下載源代碼使用 git reset 切換到此版本進行閱讀比較。

相關文章
相關標籤/搜索