ZStack經過邏輯功能,將存儲系統抽象成主存儲和備份存儲。一個主存儲是一個存放VM磁盤的存儲池;一個備份存儲是這麼一個存儲,用戶存儲鏡像模板、備份的磁盤、快照。主存儲和備份存儲能夠是物理分離的存儲系統,也能夠是同一個存儲系統同時扮演兩種角色。存儲廠商能夠輕鬆地,經過實現相應的存儲插件,在ZStack中加入他們的產品。html
概述後端
雲中的存儲系統能夠以它們的邏輯功能被分爲兩類。一類做爲存儲池工做,存儲VM的磁盤,並能夠被運行中的VM訪問;這類存儲能夠是基於文件系統的,磁盤被做爲文件存儲;或者基於塊存儲,磁盤則變成了塊設備。在ZStack的術語表中,這類存儲被稱爲主存儲,要麼能夠是網絡共享的存儲,如NFS、ISCSI:緩存
要麼是本地存儲,如物理主機的硬盤:網絡
另外一類存儲系統做爲倉庫存在,存儲含有操做系統的鏡像模板,以及備份的磁盤和快照;這類存儲能夠是基於文件系統的,實體做爲文件被存儲;或者是基於對象存儲的,實體做爲對象被存儲。在ZStack的術語表中,這類存儲被稱爲備份存儲,對VM沒法直接訪問,只能是網絡共享的存儲:spa
這兩種存儲都是邏輯概念,事實上,它們能夠是各自獨立的存儲系統,使用不一樣的協議。例如,ISCSI主存儲和NFS備份存儲。或者同一個存儲系統,同時扮演兩種角色。例如,ceph,它的塊存儲部分是用於知足主存儲,而它的對象存儲部分則扮演了備份存儲的角色。存儲廠商能夠很容易地在ZStack中,同時爲主存儲和備份存儲加入他們的存儲系統,經過實現存儲插件的方式。操作系統
內部實現插件
主存儲和備份存儲並非分開工做的;它們爲了執行存儲相關的活動,確實須要相互合做。最重要的活動是爲了建立一個新的虛擬機。當一個虛擬機是第一次在一個主存儲上被建立,它的鏡像模板將會被從備份存儲下載到主存儲的鏡像緩存中。因爲大多數hypervisor使用稱爲鏈式克隆的技術,一旦鏡像模板被下載,它將爲全部的,使用了一樣的鏡像模板且在一樣的主存儲中有根磁盤的虛擬機,做爲基礎磁盤來工做。scala
在下載鏡像以外,主存儲也會上傳實體,像磁盤、快照,到備份存儲;這些上傳活動都是備份相關的;例如,當用戶備份一個數據磁盤時,數據磁盤的一個副本將會被上傳到備份存儲,做爲一個鏡像模板,能夠在以後被下載到主存儲用於建立新的數據磁盤。3d
在源代碼中,主存儲和備份存儲在不一樣的插件中實現。在複雜性方面,備份存儲顯得更直接,由於只處理自身的事情。備份存儲的主要活動是下載、上傳和刪除。一個備份存儲須要定義一些協議,規定主存儲怎樣下載和上傳實體,但它不須要知道主存儲的細節,由於這是主存儲的責任去使用這些協議來執行這些活動。另外,備份存儲必須實現一些協議,這些協議容許鏡像服務註冊和刪除鏡像模板。和全部的其餘資源相似,備份存儲有一個抽象的基類BackupStorageBase,已經實現了大多數通用的業務邏輯,存儲廠商只須要實現那些和他們後臺存儲系統直接相關的操做,一般是經過調用SDK或調用agent。htm
主存儲更加複雜。複雜的根源來自於這麼一個事實,即它的業務邏輯不僅是依賴於備份存儲,也依賴於hypervisor的細節。一個主存儲,首先,必須理解備份存儲的協議,如下載和上傳實體;例如,一個NFS主存儲必須知道Sftp備份存儲,亞馬遜S3備份存儲,Swift備份存儲的信息,若是它計劃支持全部的這些。另外一方面,對於同一個備份存儲,協議的使用方法也會隨着不一樣的hypervisor而不一樣;例如,NFS主存儲能夠調用KVM agent去使用s3tool來從亞馬遜S3備份存儲下載一個鏡像模板;然而,因爲VMWare有一個封閉的生態系統,對於NFS主存儲來講要作一樣事情的惟一方式是經過VMWare的SDK。基於這些事實,主存儲的複雜性是M*N,其中M是備份存儲的種類,N是它所支持的hypervisor的種類。
正如ZStack—通用插件系統一文中所描述的,ZStack是一個插件系統,每個特性都被作成一個小的插件;一個主存儲須要定義兩個接口來打破這個複雜性。第一個是一個hypervisor的後端,用於處理只和hypervisor有關的活動;例如,NFS主存儲有個定義好的接口:NfsPrimaryStorageBackend,對每個支持的hypervisor,都會有一個具體的類,相似NfsPrimaryStorageKVMBackend用於KVM。第二個,稱之爲PrimaryToBackupStorageMediator,是一個hypervisor到備份存儲的後端,用於處理同時涉及到hypervisor和備份存儲的後端;例如,Nfs主存儲有一個NfsPrimaryToSftpBackupKVMBackup的實現,用於爲KVM支持Sftp備份存儲。
這聽起來很是糟糕,由於一個主存儲必須實現如此多的東西;然而,事實上,一個主存儲可能不須要去爲全部的hypervisor支持全部的備份存儲;例如,爲VMWare支持Sftp備份存儲是毫無心義的,由於VMWare SDK沒有可能容許用scp傳輸一個文件到它的存儲倉(即便能夠經過繞過SDK使得這成爲可能,咱們不把它視爲一種可靠的方式)。並且網絡共享存儲上,流行的協議並不特別多,大多數的使用場景能夠被處理,一旦咱們把Nfs主存儲和Iscsi主存儲準備就位。
注意:在當前的ZStack版本中(0.6),只有Nfs主存儲和Sftp備份存儲被實現了。
總結
在這篇文章中,咱們演示了ZStack的存儲模型。經過以邏輯功能將存儲劃分紅主存儲和備份存儲,ZStack提供了一個很是棒的靈活性,使得存儲廠商能夠選擇性地以各類意圖插入他們的存儲系統。並且隨着愈來愈的廣泛的存儲協議,好比NFS、ISCSI、S三、Swift,將被做爲默認插件加入,用戶將不須要憂慮他們是否可以爲他們現存的存儲系統找到合適的組合。