ZStack通過邏輯功能辟汰,將存儲系統(tǒng)抽象成主存儲和備份存儲列敲。一個主存儲是一個存放VM磁盤的存儲池;一個備份存儲是這么一個存儲帖汞,用戶存儲鏡像模板戴而、備份的磁盤、快照翩蘸。主存儲和備份存儲可以是物理分離的存儲系統(tǒng)所意,也可以是同一個存儲系統(tǒng)同時扮演兩種角色。存儲廠商可以輕松地鹿鳖,通過實現(xiàn)相應的存儲插件扁眯,在ZStack中加入他們的產(chǎn)品。
概述
云中的存儲系統(tǒng)可以以它們的邏輯功能被分為兩類翅帜。一類作為存儲池工作姻檀,存儲VM的磁盤,并可以被運行中的VM訪問涝滴;這類存儲可以是基于文件系統(tǒng)的绣版,磁盤被作為文件存儲;或者基于塊存儲歼疮,磁盤則變成了塊設備杂抽。在ZStack的術(shù)語表中,這類存儲被稱為主存儲韩脏,要么可以是網(wǎng)絡共享的存儲缩麸,如NFS、ISCSI:
要么是本地存儲赡矢,如物理主機的硬盤:
另一類存儲系統(tǒng)作為倉庫存在杭朱,存儲含有操作系統(tǒng)的鏡像模板,以及備份的磁盤和快照吹散;這類存儲可以是基于文件系統(tǒng)的弧械,實體作為文件被存儲;或者是基于對象存儲的空民,實體作為對象被存儲刃唐。在ZStack的術(shù)語表中,這類存儲被稱為備份存儲界轩,對VM無法直接訪問画饥,只能是網(wǎng)絡共享的存儲:
這兩種存儲都是邏輯概念,事實上浊猾,它們可以是各自獨立的存儲系統(tǒng)荒澡,使用不同的協(xié)議。例如与殃,ISCSI主存儲和NFS備份存儲单山。或者同一個存儲系統(tǒng)幅疼,同時扮演兩種角色米奸。例如,ceph爽篷,它的塊存儲部分是用于滿足主存儲悴晰,而它的對象存儲部分則扮演了備份存儲的角色。存儲廠商可以很容易地在ZStack中逐工,同時為主存儲和備份存儲加入他們的存儲系統(tǒng)铡溪,通過實現(xiàn)存儲插件的方式。
內(nèi)部實現(xiàn)
主存儲和備份存儲并不是分開工作的泪喊;它們?yōu)榱藞?zhí)行存儲相關(guān)的活動棕硫,確實需要相互合作。最重要的活動是為了創(chuàng)建一個新的虛擬機袒啼。當一個虛擬機是第一次在一個主存儲上被創(chuàng)建哈扮,它的鏡像模板將會被從備份存儲下載到主存儲的鏡像緩存中。由于大多數(shù)hypervisor使用稱為鏈式克隆的技術(shù)蚓再,一旦鏡像模板被下載滑肉,它將為所有的,使用了同樣的鏡像模板且在同樣的主存儲中有根磁盤的虛擬機摘仅,作為基礎磁盤來工作靶庙。
在下載鏡像之外,主存儲也會上傳實體娃属,像磁盤六荒、快照,到備份存儲膳犹;這些上傳活動都是備份相關(guān)的恬吕;例如,當用戶備份一個數(shù)據(jù)磁盤時须床,數(shù)據(jù)磁盤的一個副本將會被上傳到備份存儲铐料,作為一個鏡像模板,可以在之后被下載到主存儲用于創(chuàng)建新的數(shù)據(jù)磁盤豺旬。
在源代碼中钠惩,主存儲和備份存儲在不同的插件中實現(xiàn)。在復雜性方面族阅,備份存儲顯得更直接篓跛,因為只處理自身的事情。備份存儲的主要活動是下載坦刀、上傳和刪除愧沟。一個備份存儲需要定義一些協(xié)議蔬咬,規(guī)定主存儲怎樣下載和上傳實體,但它不需要知道主存儲的細節(jié)沐寺,因為這是主存儲的責任去使用這些協(xié)議來執(zhí)行這些活動林艘。另外,備份存儲必須實現(xiàn)一些協(xié)議混坞,這些協(xié)議允許鏡像服務注冊和刪除鏡像模板狐援。和所有的其他資源類似,備份存儲有一個抽象的基類BackupStorageBase,已經(jīng)實現(xiàn)了大多數(shù)通用的業(yè)務邏輯究孕,存儲廠商只需要實現(xiàn)那些和他們后臺存儲系統(tǒng)直接相關(guān)的操作啥酱,通常是通過調(diào)用SDK或調(diào)用agent。
主存儲更加復雜厨诸。復雜的根源來自于這么一個事實镶殷,即它的業(yè)務邏輯不只是依賴于備份存儲,也依賴于hypervisor的細節(jié)泳猬。一個主存儲批钠,首先,必須理解備份存儲的協(xié)議得封,以下載和上傳實體埋心;例如,一個NFS主存儲必須知道Sftp備份存儲忙上,亞馬遜S3備份存儲拷呆,Swift備份存儲的信息,如果它計劃支持所有的這些疫粥。另一方面茬斧,對于同一個備份存儲,協(xié)議的使用方法也會隨著不同的hypervisor而不同梗逮;例如项秉,NFS主存儲可以調(diào)用KVM agent去使用s3tool來從亞馬遜S3備份存儲下載一個鏡像模板;然而慷彤,由于VMWare有一個封閉的生態(tài)系統(tǒng)娄蔼,對于NFS主存儲來說要做同樣事情的唯一方式是通過VMWare的SDK〉谆基于這些事實岁诉,主存儲的復雜性是M*N,其中M是備份存儲的種類跋选,N是它所支持的hypervisor的種類涕癣。
正如ZStack—通用插件系統(tǒng)一文中所描述的,ZStack是一個插件系統(tǒng),每一個特性都被做成一個小的插件前标;一個主存儲需要定義兩個接口來打破這個復雜性坠韩。第一個是一個hypervisor的后端距潘,用于處理只和hypervisor有關(guān)的活動;例如同眯,NFS主存儲有個定義好的接口:NfsPrimaryStorageBackend绽昼,對每一個支持的hypervisor,都會有一個具體的類须蜗,類似NfsPrimaryStorageKVMBackend用于KVM。第二個目溉,稱之為PrimaryToBackupStorageMediator明肮,是一個hypervisor到備份存儲的后端,用于處理同時涉及到hypervisor和備份存儲的后端缭付;例如柿估,Nfs主存儲有一個NfsPrimaryToSftpBackupKVMBackup的實現(xiàn),用于為KVM支持Sftp備份存儲陷猫。
這聽起來非常糟糕秫舌,因為一個主存儲必須實現(xiàn)如此多的東西;然而绣檬,事實上足陨,一個主存儲可能不需要去為所有的hypervisor支持所有的備份存儲;例如娇未,為VMWare支持Sftp備份存儲是毫無意義的墨缘,因為VMWare SDK沒有可能允許用scp傳輸一個文件到它的存儲倉(即使可以通過繞過SDK使得這成為可能,我們不把它視為一種可靠的方式)零抬。而且網(wǎng)絡共享存儲上镊讼,流行的協(xié)議并不特別多,大多數(shù)的使用場景可以被處理平夜,一旦我們把Nfs主存儲和Iscsi主存儲準備就位蝶棋。
注意:在當前的ZStack版本中(0.6),只有Nfs主存儲和Sftp備份存儲被實現(xiàn)了忽妒。
總結(jié)
在這篇文章中玩裙,我們演示了ZStack的存儲模型。通過以邏輯功能將存儲劃分成主存儲和備份存儲锰扶,ZStack提供了一個非常棒的靈活性献酗,使得存儲廠商可以選擇性地以各種意圖插入他們的存儲系統(tǒng)。而且隨著越來越的普遍的存儲協(xié)議坷牛,比如NFS罕偎、ISCSI、S3京闰、Swift颜及,將被作為默認插件加入甩苛,用戶將不需要憂慮他們是否能夠為他們現(xiàn)存的存儲系統(tǒng)找到合適的組合。