oVirt存储管理.docx

上传人:b****0 文档编号:18342247 上传时间:2023-08-15 格式:DOCX 页数:11 大小:676.50KB
下载 相关 举报
oVirt存储管理.docx_第1页
第1页 / 共11页
oVirt存储管理.docx_第2页
第2页 / 共11页
oVirt存储管理.docx_第3页
第3页 / 共11页
oVirt存储管理.docx_第4页
第4页 / 共11页
oVirt存储管理.docx_第5页
第5页 / 共11页
oVirt存储管理.docx_第6页
第6页 / 共11页
oVirt存储管理.docx_第7页
第7页 / 共11页
oVirt存储管理.docx_第8页
第8页 / 共11页
oVirt存储管理.docx_第9页
第9页 / 共11页
oVirt存储管理.docx_第10页
第10页 / 共11页
oVirt存储管理.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

oVirt存储管理.docx

《oVirt存储管理.docx》由会员分享,可在线阅读,更多相关《oVirt存储管理.docx(11页珍藏版)》请在冰点文库上搜索。

oVirt存储管理.docx

oVirt存储管理

oVirt存储管理

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

oVirt的Node/Engine结构

oVirt是一个基于x86架构上的KVM虚拟化技术的开源IaaS云服务解决方案。

在架构设计上它使用了Node/Engine分离结构,以方便功能的划分与管理。

图1.oVirt逻辑结构图

图1从总体框架上说明了oVirt的工作流程。

对外,oVirt中的Engine通过HTTP协议向外提供HTTPAPI,同时提供内建的网页服务供用户和系统管理员使用。

系统管理员通过网页可以创建、修改虚拟机及相关设备或用户权限,用户在拥有权限的情况下可以操作自己的虚拟机,并通过VNC或SSH登陆自己的虚拟机。

Engine在整个系统中充当管理者的角色并对外提供管理服务,它挂载了自己的数据库记录整个系统中所有的虚拟机配置,各个节点的自身状态,系统的网络状态,存储器状态。

管理的逻辑,状态及策略全部在Engine中设置与实现。

Node只负责功能上的实现,不进行任何状态的记录和任何策略的实现。

Engine与Node之间的关系十分像Linux中驱动程序与应用程序的功能分割关系:

驱动仅仅负责功能的实现,如设备的读、写、开启与关闭,如何使用这些功能留给应用层。

同样Node仅仅负责实现虚拟机器与设备的创建与修改,资源的共享与保护,如何使用这些功能交给Engine处理。

Node暴露两种基于网络的API与Engine交互,XMLRPC与REST。

Engine通过这些接口控制各个Node上功能的启动。

当然用户也可以调用这些API进行第三方程序的开发。

oVirt里的Node可以由一个普通的Linux上安装VDSM(VirtualDesktopServerManager)构成,也可以由一个专为oVirt定制的Linux系统构成。

在定制的情况下,Node上的许多文件系统都是ramdisk(基于内存的Linux磁盘设备),系统重启后其中的内容消失,从而保证了Node的无状态性。

Engine/Node的设计不仅方便将来的开发,更简化了用户的安装使用,在定制的情况下Node可以快速大量部署。

本文主要以定制Node为例说明VDSM的相关功能。

回页首

VDSM对存储器的管理

每一个Node上都会运行一个VDSM,实现网络、存储器、虚拟机的创建与修改的功能。

VDSM的大部分代码用在了存储系统上,其功能包括数据的组织,集群下的数据共享与保护,故障恢复。

通常情况下每一个物理机器当作一个Node,运行一个VDSM,Node本身只携带少量存储器用以保存配置。

一个集群中通常有一个Engine和数个Node,这些Node通过网络连接到SAN(StorageAreaNetwork)上,VDSM把Node上运行的虚拟机存储数据保存在SAN上,Node本身为无状态的节点,重新启动后状态消失,从而保证了系统整体的可用性,一般情况下不会因用户的操作而使Node失效。

一旦问题发生,通常一次重启既可恢复工作状态。

图2.Node上运行的主要组件

简单概括起来,VDSM的功能主要有:

负责Node的自动启动与注册;虚拟机的操作与生命周期管理;网络管理;存储管理;Host与VM(VirtualMachine)状态监视与报告;提供对虚拟机的外部干涉功能;提供内存与存储的合并与超支功能(OverCommitment)。

在云计算环境中,SAN中往往存储着大量虚拟机器使用的virtualimage,同时每一个virtualimage在任何时候都可能被任意Node访问,同时出于性能的考虑virtualimage可能以文件或者数据块的形式出现,这些对存储系统的设计提出了挑战。

为此,VDSM基于以下原则设计了自己的存储系统:

1高可用性:

一群安装有VDSM的Node在组建集群的时候,没有潜在的单点故障存在,任何一个Node崩溃不会影响整个集群的功能,它的角色会被其他Node取代。

Engine不可用的情况下,Node将继续工作,用户对虚拟机的操作可以继续进行。

2高伸缩性:

添加Node和SAN几乎不需要用户的设置,Node上的VDSM会自己注册自己。

3集群安全性:

一个VDSM对正在操作的virtualimage进行排它性保护。

4备份与恢复:

virtualimage之间有相互关连的特性记录可进行一系列引用/备份操作。

5性能优化:

利用多线程与多进程减少操作堵塞状况。

StorageDomain(以下简程SD)是VDSM中的最基本存储实体,所有的virtualimage和virtualimage对应的元数据都会保存在其中。

和VDSM中的StorageImage概念不同,这里的virtualimage表示的是虚拟机程序用到的虚拟磁盘数据,特指虚拟机程序最终能够操作的文件或设备文件对象。

元数据是描述virtualimage相关数据大小、状态、锁等内容的一组数据集合。

SD包括两种类型:

和BlockDomain。

使用文件系统存储数据并同步操作,主要针对NFS(Network)和LOCALFS(Local)文件系统。

在文件系统的帮助下,拥有良好的virtualimage操作能力,每一个虚拟机的存储数据(称为Volume)和对应的元数据都以文件的方式保存。

每一个Domain实际对应于Host文件系统上的一个目录,针对NFS文件系统VDSM还有额外的逻辑来处理相关意外与错误情况。

而BlockDomain直接操作原始的块数据,使用Linux的LVM(LogicalVolumeManager)功能来组织数据,主要针对iSCSI(InternetSmallComputerSystemInterface),FCoE(FibreChanneloverEthernet)等块设备。

由于目标设备上通常没有一个文件系统来保证访问的安全性,VDSM使用了邮箱机制来保证任意时刻,只有一个Node可以修改Block上的内容,而其他Node则通过Socket邮箱发送自己的修改请求。

因此它的操作请求速度和监视功能都会比弱一些。

通常设备将使用Linux的devicemapper机制进行一次映射,每一个Domain实际上是一个Linux中的VolumeGroup,元数据保存在其中的一个LogicVolume及其tag上,虚拟机的Volume保存在另一个LogicVolume中。

StoragePool(以下简称SP)是一组SD的组合,目标是管理跨越SD之间的操作,也就是说SD之间互相的引用、备份、恢复,合并一般发生在一个SP之中。

在数据中心里,一个SP抽象了一组SD的集合供外界的Node访问或者Engine管理,并且一个SP中的所有SD必须是同一类型,如NFS或者iSCSI。

为了保证SP中的数据安全,一组SP中需要选择一个SD作为MasterDomain。

这个Domain的不同之处在于它会保存SP中所有的元数据,保存一些异步请求或者任务的数据,保存所在SP的集群存储用到的锁。

为了简化管理,oVirt中抽象出了DataCenter概念,一个DataCenter将拥有一组NodeCluster用来运行虚拟机,一个StoragePool用来保存虚拟磁盘数据。

NodeCluster是一组专门用来运行虚拟机的Node的集合,运行在其中的虚拟机可以动态迁移到NodeCluster中的另外一个Node上。

一个DataCenter是一个完成oVirt所有功能的实体,在这个DataCenter中用户可以创建虚拟机、备份虚拟机、配置虚拟机的StorageDomain,动态迁移虚拟机。

NodeEngine有一些算法在开启的时候可以自动平衡DataCenter中的Node的负载。

当然oVirt中可以存在数个DataCenter,它们之间的操作如备份与恢复不在本文的讨论范围之内,概括起来一个DataCenter是一个管理NodeCluster与StoragePool的集合。

由于DataCenter中所有的Node都拥有对DataCenter中的StoragePool的访问权限,因此VDSM实现了一个称为SPM(StoragePoolManager)的功能角色。

在一个DataCenter中,所有的Node启动后会自动选举出一个Node充当SPM的角色,被选举者将运行VDSM上的SPM逻辑,负责完成以下功能:

创建/删除/缩放所在DataCenter中的Image,快照,模板。

这些操作的共同点是会影响StoragePool中的元数据,如SAN上松散块设备的分配。

为了保证元数据不被多个Node同时修改,SPM拥有对StoragePool中元数据的排它性操作权限,SPM使用集中式邮箱接受其他Node的相关请求,其他Node只能通过给SPM发送操作请求的方式修改元数据,最终的操作都由SPM线性完成,从而避免了存储器操作竞态的出现。

为了兼顾效率,不修改元数据的普通操作,如数据读写,Node可以不同过SPM,自己直接访问StoragePool完成。

由于SPM是由一个普通Node选举出来的,因此当它因为外部原因失效后,系统将会选举出另外的Node充当SPM,从而保证系统能继续运行。

图3.DataCenter结构图举例

前面所说的抽象概念主要是给VDSM自己组织管理数据用的,而StorageImage和StorageVolume则是VDSM抽象出来以方便给虚拟机使用的概念。

StorageImage和前文所描述的virtualimage不同,virtualimage是虚拟机程序看到的虚拟磁盘,一个StorageImage中往往包含很多StorageVolume,每一个StorageVolume都可以作为一个virtualimage传递给虚拟机作为虚拟磁盘使用。

同一个StorageImage中的多个StorageVolume往往存在相互备份,相互引用等关系。

当几个StorageVolume之间是引用的关系时,这几个StorageVolume集合成为一个virtualimage传递给虚拟机,在虚拟机看来它操作的就是一个虚拟磁盘只不过数据分布在一系列的StorageVolume上(这时把最外层的StorageVolume作为参数传递给虚拟机启动程序)。

StorageImage用来管理这样一组含有内在联系的StorageVolume。

在StorageDomain和StoragePool建好后,VDSM便可以通过SPM在指定的StorageDomain里创建StorageImage与StorageVolume。

创建虚拟机的时候需要StorageVolume做为参数。

图4.VM使用StorageVolume示意图

StorageOverCommitment是一个允许管理者分配比实际存储空间大的虚拟存储器给用户使用的技术。

一个虚拟机所占用的实际存储空间可以比它所定义的存储空间小的多,只有当其中的存储数据真正增长时,其实际存储空间才会动态增长。

如管理员定义VM1拥有12G的Image,但系统启动后这个Image实际只占用了10M的存储空间。

当用户在虚拟机安装软件后,Image实际占用的空间才会增长。

这种技术允许虚拟机不需要考虑实际机器的物理存储能力,做到存储器的共享与使用效率最大化。

Qemu的几种存储格式都能提供这种动态伸缩能力,如QCOW2格式。

VDSM使用了Qemu的存储缩放功能,当使用的StorageDomain为LogicVolume时间,VDSM将会监视Qemu所标记的写入上限位置。

当发现越界时,VDSM将会请求SPM扩展LogicVolume大小,从而完成空间的动态增长。

图5.VDSM对LV的动态扩展

回页首

使用VDSM创建虚拟磁盘举例

这里从VDSMAPI的角度举例说明虚拟磁盘的创建过程,用户也可以通过网页GUI的形式操作Engine完成创建的过程,Engine最后还是会通过VDSMAPI完成最终的操作。

例子语言为Python,VDSM提供了vdscli类封装XMLRPCAPI访问方法。

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或者用户给出

defvdsOK(d):

printd

ifd['status']['code']:

raiseException(str(d))

returnd

#此函数用来判断操作成功与否

defwaitTask(s,taskid):

whilevdsOK(s.getTaskStatus(taskid))['taskStatus']['taskState']!

='finished':

time.sleep(3)

vdsOK(s.clearTask(taskid))

#VDSM的任务很多是异步的,每一个请求都是一个任务,此函数用来查询任务成功与否

defmain():

s=vdscli.connect()

#连接VDSM,默认连接本地的VDSM

vdsOK(s.connectStorageServer(LOCALFS_DOMAIN,

"myfavoritepet",[dict(id=1,connection=path)]))

#连接到VDSM的一个StorageServer

vdsOK(s.createStorageDomain(LOCALFS_DOMAIN,sdUUID,

"mylocaldomain",path,DATA_DOMAIN,0))

#创建StorageDomainsdUUID

vdsOK(s.createStoragePool(LOCALFS_DOMAIN,spUUID,

"poolname",sdUUID,[sdUUID],masterVersion))

#以sdUUID为masterdomain创建StoragePool

vdsOK(s.connectStoragePool(spUUID,hostID,"scsikey",sdUUID,masterVersion))

#连接到StoragePool上

tid=vdsOK(s.spmStart(spUUID,-1,-1,-1,0))['uuid']

waitTask(s,tid)

#启动这个StoragePool上的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存在于前面创建的StorageDomain上。

至此,

#虚拟磁盘便准备好了,可以用此磁盘的UUID做为参数创建虚拟机了。

main()

回页首

VDSM存储部分代码简介

VDSM中的存储部分代码主要在./vdsm/storage下,下面简单介绍下几个重要的文件作用,读者可以参考以了解VDSM的具体实现方法。

Misc.py:

包含了帮助函数与工具以执行系统命令。

Hsm.py:

HostStorageManager模块,存储管理的总体组织者,初试化和很多操作都是以此文件中的函数为入口点的。

sd.py:

StorageDomain模型。

sp.py:

StoragePool模型。

image.py:

StorageImage模型。

volume.py:

StorageVolume模型。

dispatcher.py:

任务分配器。

task.py:

任务模型。

taskManager.py:

任务的监视与管理。

safeLease.py:

集群环境下的锁。

storage_mailbox.py:

和SPM进行mailbox通信的实现。

由于VDSM的开发活动比较活跃,一些概念与组织在将来可能有变化,本文的内容基于版本v4.9.6,您可以下载源代码使用gitreset切换到此版本进行阅读比较。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2