升级系统、基于虚拟机的升级方法及装置与流程

文档序号:14396414阅读:576来源:国知局

本申请涉及软件领域,具体而言,涉及一种升级系统、基于虚拟机的升级方法及装置。



背景技术:

在云计算环境中,一个数据中心的计算资源通过虚拟化技术切分为大量虚拟机(virtualmachine,简称为vm,vm是一台服务器上虚拟出来的多个可以运行os的实例),用户可以在vm中灵活部署自己的应用或者服务,例如,web、社交、游戏、金融等,在这些应用或服务中,有些应用或服务保存着重要的数据,需要较低的数据读写时延,并需要7*24小时不间断服务、以及足够好的可用性和sla(service-levelagreement,服务等级协议)保障。随着数据中心后台软件的迭代,不断有新功能的加入,以及性能优化、缺陷修复等,因此这些应用或服务也需要频繁的升级。目前升级时,一般采用冷升级的方式,在升级之前通知用户并选择用户相对较少的时间进行升级,例如,选择凌晨3点进行升级。对于vm存储而言,在升级的过程中,任何一块vm磁盘都有可能正在提交io请求,而且这些io请求的数据可能是用户的重要信息,或者是某个流程中的重要步骤。而在冷升级的过程中,需要关闭vm虚拟机,在所有的vm虚拟机均被关闭之后,再进行升级。升级之后再重新启动vm虚拟机,整个升级的过程中,用户均不能访问该虚拟机提供的服务,且虚拟机磁盘后端存储也包括很多软件组件,如接入服务、数据块存储服务(chunkserver)、数据管理服务(master)等。这些组件升级过程中,会或多或少影响io体验,如io长时间hang、io返错等等,使用户体验比较差。

而数据中心内部都由一个个集群组成,集群内部每个服务器上运行着多台vm,每个vm可以配置多块磁盘,每块磁盘独立提交读写io请求,升级后端软件要求最好能尽量减少服务的中断,使得io的暂停和恢复时间尽量短,让用户的io受影响最小。

针对现有技术中冷升级需要关闭vm虚拟机再进行升级,导致升级过程中用户不能访问vm虚拟机的技术问题,目前尚未提出有效的解决方案。



技术实现要素:

本申请实施例提供了一种升级系统、基于虚拟机的升级方法及装置,以至少解决采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

根据本申请实施例的一个方面,提供了一种升级系统,包括:链路暂停与恢复模块,用于退出后端存储服务的原服务进程模块,在退出原服务进程模块后,启动升级后的新服务进程模块;原服务进程模块,用于在退出的过程中暂停并保存处理的io请求,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求;新服务进程模块,用于重新执行暂停并保存的原服务进程模块处理的io请求。

根据本申请实施例的一个方面,提供了一种基于虚拟机的升级方法,包括:启动升级虚拟机的后端存储服务,生成io通道控制指令;根据io通道控制指令暂停处理当前的io读写请求,并退出后端存储服务的当前服务进程;在退出后端存储服务的当前服务进程之后,启动后端存储服务的新服务进程;在后端存储服务升级后,使用新服务进程重新执行暂停处理的io读写请求。

根据本申请实施例的一个方面,提供了一种基于虚拟机的升级装置,包括:第一启动模块,用于启动升级虚拟机的后端存储服务,生成io通道控制指令;退出模块,用于根据io通道控制指令暂停处理当前的io读写请求,并退出后端存储服务的当前服务进程;第二启动模块,用于在退出后端存储服务的当前服务进程之后,启动后端存储服务的新服务进程;执行模块,用于在后端存储服务升级后,使用新服务进程重新执行暂停处理的io读写请求。

在本申请实施例中,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例1的一种vm磁盘的io处理整体结构示意图;

图2是根据本申请实施例1的一种升级系统的结构示意图;

图3是根据本申请实施例1的一种升级系统的信息交互图;

图4是根据本申请实施例2的一种可选的升级设备的结构示意图;

图5是根据本申请实施例2的一种升级方法的计算机终端的硬件结构框图;

图6是根据本申请实施例2的一种可选的升级方法的流程图;

图7是根据本申请实施例3的一种升级装置的结构图;

图8是根据本申请实施例4的基于虚拟机的升级方法的流程图;

图9是根据本申请实施例5的一种基于虚拟机的升级装置的结构示意图;以及

图10是根据本发明实施例6的一种计算机终端的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

以下实施例中涉及到的英文缩写的中文含义如下:

vm:vmware虚拟机,一台服务器上虚拟出来的多个可以运行os的实例,可以使用户在一台物理机上同时运行两个或更多windows、dos、linux系统.

io:读写请求。

latency:io的时延,发出请求到完成所花费的时间。

raid:磁盘阵列,由多个磁盘自合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果,提升整个磁盘系统效能。

sla:service-levelagreement,服务等级协议。

实施例1

本申请实施例应用于虚拟机,虚拟机运行在虚拟平台上,该虚拟平台运行在物理设备上。虚拟平台上可以运行一个或多个虚拟机。虚拟机vm可以通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实操作系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对物理设备上的真正的系统产生任何影响。并且,虚拟机中的操作系统还可以与还具有能够在物理设备上的操作系统进行灵活切换。虚拟机中可以运行多种类的操作系统,例如,windows系统、各种版本的linux系统、macos系统。

现有的虚拟平台有vmware、virtualbox和virtualpc,它们都能在操作系统为windows系统的物理设备上虚拟出多个虚拟机。现有的虚拟平台还有xen、openvz、kvm。其中,xen是半虚拟化技术,相当于自己运行了一个内核的实例,可以自由的加载内核模块,虚拟的内存和io,稳定而且可预测。xen计算分为xen+pv和xen+hvm,区别就是pv只支持linux,而hvm支持win系统。openvz是操作系统级别的虚拟化技术,是底层操作系统上的一层应用,这意味着易于理解和低权重开销,一般来说也意味着更优的性能,并且是openvz配置起来也比较灵活。kvm和xen类似,比xen更好的一点是,kvm是完全虚拟的,所以不分pv和hvm的区别,所有的kvm类+型的虚拟技术都可以装各种linux的发行版和各种win的发行版。

图1是根据本申请实施例的vm磁盘io处理整体结构示意图,如图1所示,使用xen部署虚拟化平台以后,一台物理机可以虚拟出很多个vm,该示例中的物理设备运行了多个虚拟机vm1……vmn,每个虚拟机上可以有一个或多个磁盘,例如,系统盘和数据盘,用户在这些vm内部署的应用(如web、游戏、财务等)会读取和存放数据到vm内的磁盘,vm至少会有一个系统盘,存放操作系统,可能有多个数据盘,数据盘存放自己的业务数据,每个磁盘都连接前端驱动,前端驱动是虚拟机中的磁盘驱动,前端驱动通过虚拟化平台连接后端驱动,io请求经过vm内的前端驱动,再经过虚拟化平台到达后端驱动,后端驱动需要将io请求转发给一个后端存储服务进程,后端存储服务进程将请求提交给后端存储,如分布式文件系统或者本地raid存储。虚拟化平台运行在物理设备上,通过物理设备连接存储设备(或称为后端设备),提供后端存储服务。该存储设备可以包括:分布式存储设备和/或本地磁盘阵列raid存储设备。

选择采用哪些类型的存储设备,可以根据不同的虚拟机的功能来进行选择。例如,有的虚拟机中运行的服务要求有足够好的数据可靠性,此时数据需要有多个冗余备份,这样即使单个虚拟机宕机也不影响使用,这种情况下,可以将vm磁盘接入到分布式存储。又例如,有的虚拟机中运行的服务要求比较高的性能,此时io的延时要求比较低,如果这些服务不需要进行冗余备份或者已经解决了冗余备份的问题,此时,这些服务可以接入本地raid存储。

在上述运行环境下,本申请实施例提供了如图1所示的升级系统,在以下实施例中涉及到后端存储服务,后端存储服务为运行在物理设备上用于接收并处理io请求的服务,该物理设备上运行了虚拟化平台,虚拟化平台上运行了一个或多个虚拟机,每个虚拟机都可能对该虚拟的磁盘提交io请求。在每个虚拟机上,可以分为系统磁盘和至少一个数据磁盘。对于这些磁盘均可能被虚拟机中的应用或服务访问,即虚拟机会提交对磁盘的io请求,以进行io操作。图2是根据本申请实施例1的一种升级系统的结构示意图,如图2所示,该系统包括:

链路暂停与恢复模块20,用于退出后端存储服务的原服务进程模块,在退出原服务进程模块后,启动升级后的新服务进程模块。

在本申请上述系统中,上述io请求可能有多个io请求,此时均需要进行暂停并保存这些io请求。

原服务进程模块22,用于在退出的过程中暂停并保存处理的io请求,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求,虚拟化平台运行在物理设备上,后端存储服务为运行在物理设备上用于接收并处理io请求的服务。

新服务进程模块24,用于重新执行暂停并保存的原服务进程模块处理的io请求。

本实施例提出的一种升级系统,实现在vm不停机的情况下,存储后端存储服务进程的热升级,不限制vm内部所部署的是什么应用,也实现多个vmio链路的并发暂停与恢复,降低vm之间的相互影响,新服务进程启动ready后主动恢复已暂停的设备,降低热升级对vmio的影响时间。

通过上述系统,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

由上可知,本申请上述实施例通过在退出原服务进程后启动升级后的新服务进程,在新服务进程启动之后,可以恢复之前的io请求,从而达到了在升级过程中不需要停止虚拟机运行的技术效果。

此处需要说明的是,上述系统包括的原服务进程在退出的过程中暂停并保存原服务进程处理的io请求”,可以知晓,原服务进程在启动升级后就退出原服务进程,将未处理的请求进行了保存,且新服务进程重新执行暂停并保存的原服务进程处理的io请求,启动新服务进程后由新服务进程对未处理的请求进行处理。也就是说,对于启动升级之后保存于旧的服务进程但并未处理的请求是由新服务进程处理的,新服务进程为升级后的服务进程,因此,上述方案最大程度的使用了升级后的新服务进程来处理请求。

还需要说明的是,由于本申请上述方案退出的和启动的均为服务进程,实例是一直运行的,并未终止的,并且由于上述方案是应用于虚拟机平台的后端服务升级方法,虚拟机平台可以运行多种软件或程序,因此相对于对单独的web服务器的升级来说,上述方案适用更多的场景和范围,具有更好的效果。

图3是根据本申请实施例1的一种升级系统的信息交互图,在一种可选的实施例中,通过链路暂停与恢复模块20还进行升级,步骤s31,退出后端存储服务的原服务进程模块;步骤33,在退出原服务进行模块后,启动升级后的新服务进程模块;步骤s35,在退出的过程中暂停保存处理的io请求;步骤s37,启动升级后的新服务进程。

在本申请上述实施例中,上述系统还包括:虚拟块装置,用于在退出后端存储服务的原服务进程模块之前,接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息,在退出后端存储服务的原服务进程模块的过程中保存配置信息,所有虚拟块装置暂停接收新的io请求,并且,对于将正在处理的io请求挂起。

具体的,上述磁盘的配置信息可以包括后端存储文件的id、磁盘大小、存储类型(分布式存储还是本地raid存储)等。

在一种可选的实施例中,在创建vm时,会创建每个磁盘及其对应的虚拟块装置,这些虚拟块装置,也保存着对应磁盘的详细配置,如后端存储文件的id、磁盘大小、存储类型(分布式存储还是本地raid存储)等,虚拟块装置同时维护着自己的minor(linux操作系统给每个设备的编号)编号,在正常运行时,虚拟块装置接收并转发io请求。

其中,链路暂停与恢复模块还用于将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置。

原服务进程模块还用于在退出的过程中暂停所有的虚拟块装置。

新服务进程模块还用于在启动的过程中启动所有的虚拟块装置。

在本申请上述实施例的升级过程中,虚拟块装置仍存储有自己的minor编号,并且保存着对应磁盘的配置信息,但会停止对io请求的处理,等升级完成后再恢复对io请求的处理,虚拟块装置停止处理io后,vm磁盘已经提交至虚拟块装置,但还没有返回处理结果的io都会暂时挂起,并且不再接收新的io请求,直到重新开始处理io,在后端存储完成该io请求以后,虚拟块装置才会将io请求的结果返回给vm磁盘,并且恢复接收新的io请求。

图4是根据本申请实施例2的一种可选的升级设备的结构示意图,结合图4所示的示例,在一种可选的实施例中,虚拟块装置作为io请求的入口,每个vm磁盘的io请求在经过后端驱动映射以后,都提交给其对应的虚拟块装置,虚拟块装置将io请求提交给io链路模块,并最终交由后端存储服务处理。

在本申请上述实施例中,上述新服务进程模块通过主动遍历所有的虚拟块装置来启动所有的虚拟块装置。

为了启动所有的虚拟装置,每个虚拟块装置可以查询后端新服务进程是否启动完成,例如:可以预设一个轮巡时间,每个虚拟块装置根据预设以预设的轮巡时间作为查询的间隔时间,对后端新服务进程的启动情况进行查询,在任意一个虚拟块设备的查询结果为后端新服务进程已经启动完成的情况下,即可以启动虚拟块装置,继续执行挂起的io请求,并接收新的io请求。

但每个虚拟模块查询后端新服务进程是否启动需要预设一个比较合理的轮巡时间,如果轮巡时间过长,会导致io请求挂起的时间长,如果间隔过短,则会到查询操作过多,增加虚拟块装置的运行负担。如果预设的轮巡时间不合理,则会影响新进程的启动,因此使用新服务进程模块通过主动遍历所有的虚拟块装置来启动所有的虚拟块装置,以主动恢复整条io链路,可以更快的恢复io请求的处理。

在本申请上述实施例中,上述系统还包括:请求队列,用于在退出后端存储服务的原服务进程模块之前,保存接收到的io请求,并且在io请求完成后将其删除。

在上述系统中,如果后端存储服务没有进行升级,则io请求按照预设的流程向后提交,在后端存储完成io请求后返回请求结果之后,就将已经完成的io请求从等待队列中删除。

其中,原服务进程模块还用于在退出的过程中将处理的io请求发送至请求队列进行保存。

在上述系统中,在后端存储服务进行升级的过程中,将所有正在处理但还没有返回处理结果的io请求保存在队列中,起到保护io现场的作用。io从虚拟块装置取出来以后,除了提交给io链路,同时也在可以在等待队列中保存一份。

新服务进程模块还用于在启动的过程中重新提交请求队列中的io请求并进行处理。

根据本申请上述方案,在请求队列中保存的io请求均是未处理完的io请求,达到了容易管理未处理完的io请求的技术效果。

在一种可选的实施例中,在后端存储服务进行热升级的情况下,后端存储服务进程已经退出,无法完成io请求,但等升级完成新存储服务进程启动时,等待队列中的io请求将被重新提交一遍,最终io请求仍会处理完并返回给vm磁盘。

通过本申请上述实施例,采用队列的方式进行处理,可以方便管理未处理完的io请求。在升级的时候保存该队列而并删除该队列,可以记录下未处理完毕的io请求,在升级之后启动新服务进程时重新提交该队列中的io请求即可。

在本申请上述实施例中,上述系统还包括:

io链路,用于在创建时建立对应的字符设备,字符设备的句柄用于被监听以获得io事件通知。

在上述实施例中,字符设备用于表示在io传输过程中,以字符为单位进行传输的设备,在一种可选的实施例中,可以以特别文件方式在文件目录树中占据位置并拥有相应的结点,结点中的文件类型指明该文件时字符设备文件,可以使用与普通文件操作你命令对字符设备文件进行操作,例如打开、关闭、读、写等。字符设备的句柄用于标识不同的字符设备,在打开字符设备的句柄的情况下,每个io链路都可以进行io事件通知。

链路暂停与恢复模块还用于将接收到的io请求通过io链路进行处理。

io链路是一条io从内核态到用户态服务进程的通道,通过该通道以及内存映射,实现了io请求上下文、io内容的内存映射从而提高了性能,减少了拷贝,实现了通知机制。

在该可选的实施方式中,vm中的应用读写磁盘时,io请求会经过前后端驱动到达物理机,通过触发的方式进行逻辑的处理。然后将io请求解析并拿到io的长度、偏移、操作、编号、相对地址等,然后进行内存映射。在内存映射时可以通过mmap等系统调用,将前后端驱动中这个磁盘对应的地址空间映射到物理设备中,从而拿到一个自己可以访问的地址空间,包括地址空间的起始地址和长度等,当vm磁盘io请求提交过来时,先从映射的地址空间中拿到请求的上下文,包括请求编号、偏移、大小、请求数据的相对地址等,根据请求的编号、相对地址以及地址空间的起始地址,计算得到存放这个请求数据的内存地址,从而不再需要将写请求的数据内容进行拷贝,降低io的latency(延时)。

原服务进程模块还用于在退出的过程中保留字符设备,关闭字符设备的句柄,新服务进程模块还用于在重启的过程中重新打开字符设备的句柄。

在本申请上述实施例中,链路暂停与恢复模块还用于通过字符设备将io请求的上下文保存、映射到物理设备的内存中,使io请求的上下文对原服务进程模块可见。

原服务进程模块还用于在退出的过程中销毁映射到物理设备的内存。

在一种可选的实施例中,可以采用函数munmap()来清除io请求映射在物理设备中的内存,如果消除映射陈宫,则函数的返回至为0,否则返回值为-1。

新服务进程模块还用于在重启的过程中通过字符设备重新进行内存映射。

在一种可选的实施例中,可以采用函数mmap()来重新建立内存映射,如果映射成功则返回映射区的内存启示地址,否则返回map_failed(-1)。使用内存映射文件处理存储于磁盘上的文件时,不需要再对文件执行io操作,也即在对文件进行处理时,不需要再对文件申请并分配缓存,由于取消了将文件数据加载至内存,数据从内存到文件的回写以及释放内存块等操作,使得在建立内存映射能够达到提高io请求的处理速度的技术效果。

在本申请上述实施例中,上述系统还包括:

环形缓冲模块,用于管理io请求的上下文。

原服务进程模块还用于在退出的过程中删除内存中的环形缓冲;新服务进程还用于在启动的过程中重建环形缓冲。

在上述实施例中,通过io链路模块实现与后面的io处理模块的交互,io链路模块提供一条io从内核态到用户态服务进程的通道,实现了io请求上下文、io内容的内存映射从而提交性能减少拷贝,也实现了ioring(环形缓冲)及其通知机制,每个链路创建时会创建并打开一个字符设备,打开这个字符设备对应的句柄实现了io到达事件的通知,这个字符设备同时也提供了一块内存及其映射的接口,这段共享的内存一个ioring管理io上下文的传递,映射给后端存储服务进程可见。热升级时暂停io链路时,监听句柄会暂时关闭,映射的内存和ioring会先销毁,但字符设备不会删除,恢复io链路时,会重新打开句柄,并分配共享的内存页并建立ioring通道。

在本申请上述实施例中,上述系统还包括:

io处理模块,用于将字符设备的句柄进行注册监听io事件通知,并根据监听得到的io请求交给存储设备进行处理。

在一个可选的实施方式中,可以对每个虚拟机磁盘进行独立的处理。例如,在创建vm磁盘时,每个vm磁盘会创建一个自身对应的io处理模块,在上述实施例中,io处理模块可以用于根据io请求的上下文映射得到io请求的数据内容,其中,io请求的上下文可以由io处理模块从io链路中获取,映射的到的io请求的数据内容可以提交至后端存储设备。

在另一种可选的实施例中,io处理模块在将io请求的数据内容提交至后端存储设备之前,还可以对io请求进行流控限速处理,例如,根据预先设置的限制条件判断是否允许就该虚拟机的io请求向存储设备提交,在判断结果为允许的情况下,才向存储设备提交io请求。如果限制条件不允许提交io请求,此时,可以拒绝该io请求,并提示现在受到了资源的限制。或者,作为一个相对友好的处理方式,可以在预定时间后再向存储设备提交该io请求。当再次提交的时候,可以不再判断该io请求是否符合预先设置的限制条件。或者,再次提交的时候依然根据预先设置的限制条件再次判断是否允许提交该io请求,如果不允许则继续等待预定时间后再提交。

其中,链路暂停与恢复模块还用于在退出后端存储服务的原服务进程模块之前,为每个虚拟机磁盘创建一个对应的io处理模块。

原服务进程模块还用于在退出的过程中销毁io处理模块。

在上述实施例中,在退出服务进程的过程中,由于暂停了io链路,因此会同时销毁io处理模块,io请求不再会传递至后端存储模块进行处理。例如,可以将所有的io处理模块进行销毁,在启动新服务进程时,再重新创建io处理模块。

新服务进程还用于在启动的过程中重新创建io处理模块。

在启动新服务进行时需要重新创建io处理模块,新创建的io处理模块会重新接收io事件并从环形缓冲中取出io请求。

在本申请上述实施例中,上述系统还包括:

原服务进程模块还用于的过程中在多个线程中并行异步关闭存储设备中的文件。

在一种可选的实施例中,可以采用后端文件管理模块负责后端存储文件的打开、关闭等管理。在vm磁盘创建时,需要打开其对应的后端文件(分布式文件系统或者本地raid存储里的文件)才能读写io请求,在io处理模块对io请求进行处理后,会提交到其对应的后端文件。在本申请上述事实了提出的升级方案中,io链路的暂停会暂时关闭后端存储文件,当io链路恢复时再重新打开后端存储文件。但一台物理机上可以创建多个vm磁盘,多个vm磁盘的打开和关闭的速度也会延长让io请求挂起的时间,为了加速后端存储文件关闭的操作,后端文件管理模块在收到关闭指令后,会在多个线程里并行异步的关闭后端存储文件,收到打开指令后,也会在多个线程里并行异步的重新打开后端文件,同时也提供了等待所有文件成功关闭的接口,以在所有文件成功关闭后返回预设指令,在这个接口返回预设指令后,可以确定原服务进程安全的退出了。

新服务进程模块还用于在启动的过程中在多个线程中并行异步打开存储设备中的文件。

在一种可选的实施例中,为了加速后端存储文件打开的操作,在启动新服务进程后,后端文件管理模块会在多个线程里并行异步的关闭后端存储文件。

对于文件的关闭处理,可以使用一个线程进行关闭,但一个物理机可能部署有多个vm磁盘,每个vm磁盘需要在退出原进程时进行后端文件的关闭操作,在启动新进程后进行后端文件的打开操作,如果采用一个线程进行多个vm磁盘中后端存储文件的关闭操作和打开操作,则会使用较长的时间,同时增加了升级的时间。因此在退出原服务进程的过程中暂停并保存原服务进程处理的io请求的时候,在多个线程中并行异步关闭存储设备中的文件;在启动新服务进程时,可以在多个线程中并行异步打开存储设备中的文件。这样实现了多线程的并行操作,提高了升级的速度。

实施例2

根据本申请实施例,还提供了一种升级方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例一所提供的方法实施例可以在物理设备或者类似的运算装置中执行。这种物理设备可以是现有的计算机,例如,个人电脑pc,或者也可以是服务器。随着技术的发展,当移动终端的计算能力逐渐加强的时候,移动终端也可以充当这种物理设备。物理设备可以基于现有的架构,例如,图5是根据本申请实施例2的一种升级方法的计算机终端的硬件结构框图。如图5所示,物理设备50可以包括一个或多个(图中仅示出一个)处理器502a、502b、……502n(处理器502可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器504、以及用于通信功能的输入/输出接口506。本领域普通技术人员可以理解,图5所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,物理设备50还可包括比图5中所示更多或者更少的组件,或者具有与图5所示不同的配置。

存储器504可用于存储应用软件的软件程序以及模块,如本申请实施例中的升级方法对应的程序指令/模块,处理器502通过运行存储在存储器504内的软件程序以及模块,从而执行各种功能应用、也可以执行各种服务以及数据处理。即实现上述的升级方法。存储器504可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器504可进一步包括相对于处理器502远程设置的存储器,这些远程存储器可以通过网络连接至物理设备50。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入/输出接口506用于经由一个网络接收或者发送数据。上述的网络具体实例可包括物理设备50的通信供应商提供的无线网络。在一个实例中,输入/输出接口406包括一个网络适配器(networkinterfacecontroller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,输入/输出接口506可以为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

上述的物理设备可以是单独的一台设备,上述物理设备也可以是服务器集群,或者是构成云计算平台的基础。

此处需要说明的是,在一些可选实施例中,上述图5所示的计算机设备(或移动设备)可以包括硬件元件(包括电路)、软件元件(包括存储在计算机可读介质上的计算机代码)、或硬件元件和软件元件两者的结合。应当指出的是,图5仅为特定具体实例的一个实例,并且旨在示出可存在于上述计算机设备(或移动设备)中的部件的类型。

在实施例1所述的运行环境下,本申请实施例提供了如图3所示的升级系统的升级方法。在以下实施例中涉及到后端存储服务,后端存储服务为运行在物理设备上用于接收并处理io请求的服务,该物理设备上运行了虚拟化平台,虚拟化平台上运行了一个或多个虚拟机,每个虚拟机都可能对该虚拟的磁盘提交io请求。在每个虚拟机上,可以分为系统磁盘和至少一个数据磁盘。对于这些磁盘均可能被虚拟机中的应用或服务访问,即虚拟机会提交对磁盘的io请求,以进行io操作。如图3所示,该方法包括如下步骤:

步骤s31,退出后端存储服务的原服务进程,其中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,该io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求,虚拟化平台运行在物理设备上,后端存储服务为运行在物理设备上用于接收并处理io请求的服务。

在本申请上述步骤中,上述io请求可能有多个io请求,此时均需要进行暂停并保存这些io请求。

步骤s33,在退出原服务进程后,启动升级后的新服务进程,其中,新服务进程用于重新执行暂停并保存的原服务进程处理的io请求。

本实施例提出的一种升级方法,实现在vm不停机的情况下,存储后端存储服务进程的热升级,不限制vm内部所部署的是什么应用,也实现多个vmio链路的并发暂停与恢复,降低vm之间的相互影响,新服务进程启动ready后主动恢复已暂停的设备,降低热升级对vmio的影响时间。

通过上述步骤,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

由上可知,本申请上述实施例通过在退出原服务进程后启动升级后的新服务进程,在新服务进程启动之后,可以恢复之前的io请求,从而达到了在升级过程中不需要停止虚拟机运行的技术效果。

此处需要说明的是,上述方案包括步骤“退出所述原服务进程的过程中暂停并保存所述原服务进程处理的io请求”,可以知晓,上述步骤在启动升级后就退出原服务进程,将未处理的请求进行了保存,且根据步骤“所述新服务进程用于重新执行暂停并保存的所述原服务进程处理的io请求”可知,启动新服务进程后由新服务进程对未处理的请求进行处理。也就是说,对于启动升级之后保存于旧的服务进程但并未处理的请求是由新服务进程处理的,新服务进程为升级后的服务进程,因此,上述方案最大程度的使用了升级后的新服务进程来处理请求。

还需要说明的是,由于本申请上述方案退出的和启动的均为服务进程,实例是一直运行的,并未终止的,并且由于上述方案是应用于虚拟机平台的后端服务升级方法,虚拟机平台可以运行多种软件或程序,因此相对于对单独的web服务器的升级来说,上述方案适用更多的场景和范围,具有更好的效果。

在本申请上述实施例中,在执行步骤s21之前,即在退出所述后端存储服务的原服务进程之前,上述方法还包括:

s35,将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置,其中,该虚拟块装置用于接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息。

在上述步骤中,上述磁盘的配置信息可以包括后端存储文件的id、磁盘大小、存储类型(分布式存储还是本地raid存储)等。

在一种可选的实施例中,在创建vm时,会创建每个磁盘及其对应的虚拟块装置,这些虚拟块装置,也保存着对应磁盘的详细配置,如后端存储文件的id、磁盘大小、存储类型(分布式存储还是本地raid存储)等,虚拟块装置同时维护着自己的minor(linux操作系统给每个设备的编号)编号,在正常运行时,虚拟块装置接收并转发io请求。

在执行步骤s31的过程中,即在退出所述原服务进程的过程中,在采用虚拟模块设备的情况下,还可以包括如下步骤:

s351,需要暂停所有的虚拟块装置。由于虚拟块装置中保存着配置信息,此时,暂停虚拟块装置可以使保存的这些配置信息不丢失。暂停虚拟块装置之后,这些虚拟块装置停机接收新的io请求,并且如果存在正在处理的io请求,可以将这些正在处理的io请求挂起。

在采用虚拟块装置的情况下,启动新服务进程时的步骤包括:

s353,新服务进程启动这些虚拟块装置即可。此时,虚拟块装置的配置保持不变,启动之后可以对io请求进行继续处理,接收新的io请求,并处理之前挂起的io请求。

在本申请上述实施例的升级过程中,虚拟块装置仍存储有自己的minor编号,并且保存着对应磁盘的配置信息,但会停止对io请求的处理,等升级完成后再恢复对io请求的处理,虚拟块装置停止处理io后,vm磁盘已经提交至虚拟块装置,但还没有返回处理结果的io都会暂时挂起,并且不再接收新的io请求,直到重新开始处理io,在后端存储完成该io请求以后,虚拟块装置才会将io请求的结果返回给vm磁盘,并且恢复接收新的io请求。

图5是根据本申请实施例2的一种可选的升级设备的示意图,结合图5所示的示例,在一种可选的实施例中,虚拟块装置作为io请求的入口,每个vm磁盘的io请求在经过后端驱动映射以后,都提交给其对应的虚拟块装置,虚拟块装置将io请求提交给io链路模块,并最终交由后端存储服务处理。

根据本申请上述实施例,在执行步骤s313,即新服务进行启动块设备的时候,可以采用如下两种方式来进行处理。

方式一:每个虚拟块装置查询后端新服务进程是否启动完成。

在一种可选的实施例中,可以预设一个轮巡时间,每个虚拟块装置根据预设以预设的轮巡时间作为查询的间隔时间,对后端新服务进程的启动情况进行查询,在任意一个虚拟块设备的查询结果为后端新服务进程已经启动完成的情况下,即可以启动虚拟块装置,继续执行挂起的io请求,并接收新的io请求。

方式二:新服务进程主动遍历所有的虚拟块装置。

此处需要说明的是,在上述两种处理方式中,方式一需要预设一个比较合理的轮巡时间,如果轮巡时间过长,会导致io请求挂起的时间长,如果间隔过短,则会到查询操作过多,增加虚拟块装置的运行负担。如果预设的轮巡时间不合理,则会影响新进程的启动,而方式二主动遍历所有虚拟块装置,以主动恢复整条io链路,可以更快的恢复io请求的处理。

根据本申请上述实施例,在执行步骤s21之前,即在退出所述后端存储服务的原服务进程之前,上述方法还可以包括如下步骤:

步骤s37,将接收到的io请求保存到队列中,并且在该io请求完成后,将其从队列中删除。

在上述步骤中,如果后端存储服务没有进行升级,则io请求按照预设的流程向后提交,在后端存储完成io请求后返回请求结果之后,就将已经完成的io请求从等待队列中删除。

根据本申请上述步骤,在队列中保存的io请求均是未处理完的io请求,达到了容易管理未处理完的io请求的技术效果。

在采用队列的方式来对io请求进行处理的情况下,在执行步骤s21的过程中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还可以包括如下步骤:

s371,保存队列中的io请求。

在上述步骤中,在后端存储服务进行升级的过程中,将所有正在处理但还没有返回处理结果的io请求保存在队列中,起到保护io现场的作用。io从虚拟块装置取出来以后,除了提交给io链路,同时也在可以在等待队列中保存一份。

在采用队列的方式来对io请求进行处理的情况下,在启动新服务进程的步骤还可以包括:重新提交所述队列中的io请求并进行处理。

在一种可选的实施例中,在后端存储服务进行热升级的情况下,后端存储服务进程已经退出,无法完成io请求,但等升级完成新存储服务进程启动时,等待队列中的io请求将被重新提交一遍,最终io请求仍会处理完并返回给vm磁盘。

通过本申请上述实施例,采用队列的方式进行处理,可以方便管理未处理完的io请求。在升级的时候保存该队列而并删除该队列,可以记录下未处理完毕的io请求,在升级之后启动新服务进程时重新提交该队列中的io请求即可。

在另一个可选的实施方式,可以采用io链路以及内存映射的方式进行处理。这种方式可以缩短io链路。

在该可选的实施方式中,vm中的应用读写磁盘时,io请求会经过前后端驱动到达物理机,通过触发的方式进行逻辑的处理。然后将io请求解析并拿到io的长度、偏移、操作、编号、相对地址等,然后进行内存映射。在内存映射时可以通过mmap等系统调用,将前后端驱动中这个磁盘对应的地址空间映射到物理设备中,从而拿到一个自己可以访问的地址空间,包括地址空间的起始地址和长度等,当vm磁盘io请求提交过来时,先从映射的地址空间中拿到请求的上下文,包括请求编号、偏移、大小、请求数据的相对地址等,根据请求的编号、相对地址以及地址空间的起始地址,计算得到存放这个请求数据的内存地址,从而不再需要将写请求的数据内容进行拷贝,降低io的latency(延时)。

io链路是一条io从内核态到用户态服务进程的通道,通过该通道以及内存映射,实现了io请求上下文、io内容的内存映射从而提高了性能,减少了拷贝,实现了通知机制。

根据本申请上述实施例,在执行步骤s21之前,即在退出所述后端存储服务的原服务进程之前,上述方法还可以包括如下步骤:

步骤s39,将接收到的io请求通过io链路进行处理,其中,每个io链路对应一个字符设备;通过打开字符设备的句柄进行io事件通知,并且,通过字符设备提供内存及并将io请求的上下文保存到内存的缓冲区中,使io请求的上下文对原服务进程可见。

在上述实施例中,字符设备用于表示在io传输过程中,以字符为单位进行传输的设备,在一种可选的实施例中,可以以特别文件方式在文件目录树中占据位置并拥有相应的结点,结点中的文件类型指明该文件时字符设备文件,可以使用与普通文件操作你命令对字符设备文件进行操作,例如打开、关闭、读、写等。字符设备的句柄用于标识不同的字符设备,在打开字符设备的句柄的情况下,每个io链路都可以进行io事件通知。

在将接收到的io请求通过io链路进行处理的情况下,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:

步骤s391,保留所述字符设备,关闭所述字符设备的句柄。

在将接收到的io请求通过io链路进行处理的情况下,启动所述新服务进程包括:

步骤s393,重新打开所述字符设备的句柄。

在该优选实施方式中,对于字符设备在退出原服务进程的时候,不删除该字符设备,保留字符设备,关闭字符设备的句柄,但需要删除内存和缓冲区,在启动新服务进程的时候,可以重新打开字符设备的句柄,分配内存并建立缓冲区。

步骤s395,通过字符设备将io请求的上下文保存映射到物理设备的内存中,使io请求的上下文对原服务进程可见。

在上述步骤中,将io请求的上下文保存映射到物理设备的内存中,在原服务进行退出后,重新启动新服务进程启动时,需要确保io请求的上下文与挂起前的上下文一致,因此,io请求的上下文对原服务进程可见。

步骤s397,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:销毁映射到物理设备的内存。

在一种可选的实施例中,可以采用函数munmap()来清除io请求映射在物理设备中的内存,如果消除映射陈宫,则函数的返回至为0,否则返回值为-1。

步骤s399,启动新服务进程还包括:通过字符设备重新进行内存映射。

在一种可选的实施例中,可以采用函数mmap()来重新建立内存映射,如果映射成功则返回映射区的内存启示地址,否则返回map_failed(-1)。使用内存映射文件处理存储于磁盘上的文件时,不需要再对文件执行io操作,也即在对文件进行处理时,不需要再对文件申请并分配缓存,由于取消了将文件数据加载至内存,数据从内存到文件的回写以及释放内存块等操作,使得在建立内存映射能够达到提高io请求的处理速度的技术效果。

根据本申请上述实施例,在io请求的上下文通过内存中的环形缓冲还进行管理的情况下,上述方案还包括:

步骤s3910,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:删除内存中的环形缓冲。

步骤s3913,启动新服务进程还包括:重新在内存中建立环形缓冲。

在上述实施例中,通过io链路模块实现与后面的io处理模块的交互,io链路模块提供一条io从内核态到用户态服务进程的通道,实现了io请求上下文、io内容的内存映射从而提交性能减少拷贝,也实现了ioring(环形缓冲)及其通知机制,每个链路创建时会创建并打开一个字符设备,打开这个字符设备对应的句柄实现了io到达事件的通知,这个字符设备同时也提供了一块内存及其映射的接口,这段共享的内存一个ioring管理io上下文的传递,映射给后端存储服务进程可见。热升级时暂停io链路时,监听句柄会暂时关闭,映射的内存和ioring会先销毁,但字符设备不会删除,恢复io链路时,会重新打开句柄,并分配共享的内存页并建立ioring通道。

根据本申请上述实施例,在执行步骤s31之前,即在退出后端存储服务的原服务进程之前,还包括如下步骤:

步骤s211,为每个虚拟机磁盘创建一个对应的io处理模块,其中,该io处理模块用于根据io请求的上下文映射出该io请求的数据内容,并交给存储设备进行处理。

在一个可选的实施方式中,可以对每个虚拟机磁盘进行独立的处理。例如,在创建vm磁盘时,每个vm磁盘会创建一个自身对应的io处理模块,在上述实施例中,io处理模块可以用于根据io请求的上下文映射得到io请求的数据内容,其中,io请求的上下文可以由io处理模块从io链路中获取,映射的到的io请求的数据内容可以提交至后端存储设备。

在另一种可选的实施例中,io处理模块在将io请求的数据内容提交至后端存储设备之前,还可以对io请求进行流控限速处理,例如,根据预先设置的限制条件判断是否允许就该虚拟机的io请求向存储设备提交,在判断结果为允许的情况下,才向存储设备提交所述io请求。如果限制条件不允许提交io请求,此时,可以拒绝该io请求,并提示现在受到了资源的限制。或者,作为一个相对友好的处理方式,可以在预定时间后再向存储设备提交该io请求。当再次提交的时候,可以不再判断该io请求是否符合预先设置的限制条件。或者,再次提交的时候依然根据预先设置的限制条件再次判断是否允许提交该io请求,如果不允许则继续等待预定时间后再提交。

在为每个虚拟机磁盘创建一个对应的io处理模块的情况下,在退出服务进程的过程中,还可以包括如下步骤:

步骤s3111,销毁io处理模块。

在上述实施例中,在退出服务进程的过程中,由于暂停了io链路,因此会同时销毁io处理模块,io请求不再会传递至后端存储模块进行处理。例如,可以将所有的io处理模块进行销毁,在启动新服务进程时,再重新创建io处理模块。

在为每个虚拟机磁盘创建一个对应的io处理模块的情况下,启动新服务进程还可以包括如下步骤:

步骤s3113,重新创建所述io处理模块。

在启动新服务进行时需要重新创建io处理模块,新创建的io处理模块会重新接收io事件并从环形缓冲中取出io请求。

关于本申请上述实施例,在退出所述原服务进程的过程中暂停并保存所述原服务进程处理的io请求包括:

步骤s313,在多个线程中并行异步关闭存储设备中的文件。

在一种可选的实施例中,可以采用后端文件管理模块负责后端存储文件的打开、关闭等管理。在vm磁盘创建时,需要打开其对应的后端文件(分布式文件系统或者本地raid存储里的文件)才能读写io请求,在io处理模块对io请求进行处理后,会提交到其对应的后端文件。在本申请上述事实了提出的升级方案中,io链路的暂停会暂时关闭后端存储文件,当io链路恢复时再重新打开后端存储文件。但一台物理机上可以创建多个vm磁盘,多个vm磁盘的打开和关闭的速度也会延长让io请求挂起的时间,为了加速后端存储文件关闭的操作,后端文件管理模块在收到关闭指令后,会在多个线程里并行异步的关闭后端存储文件,收到打开指令后,也会在多个线程里并行异步的重新打开后端文件,同时也提供了等待所有文件成功关闭的接口,以在所有文件成功关闭后返回预设指令,在这个接口返回预设指令后,可以确定原服务进程安全的退出了。

在退出所述原服务进程的过程中暂停并保存所述原服务进程处理的io请求包括:在多个线程中并行异步关闭存储设备中的文件的情况下,启动所述新服务进程包括:

步骤s3131,在多个线程中并行异步打开所述存储设备中的文件。

在一种可选的实施例中,为了加速后端存储文件打开的操作,在启动新服务进程后,后端文件管理模块会在多个线程里并行异步的关闭后端存储文件。

对于文件的关闭处理,可以使用一个线程进行关闭,但一个物理机可能部署有多个vm磁盘,每个vm磁盘需要在退出原进程时进行后端文件的关闭操作,在启动新进程后进行后端文件的打开操作,如果采用一个线程进行多个vm磁盘中后端存储文件的关闭操作和打开操作,则会使用较长的时间,同时增加了升级的时间。因此在退出原服务进程的过程中暂停并保存原服务进程处理的io请求的时候,在多个线程中并行异步关闭存储设备中的文件;在启动新服务进程时,可以在多个线程中并行异步打开存储设备中的文件。这样实现了多线程的并行操作,提高了升级的速度。

在上述实施例中,对于虚拟机的io请求所可能采用的各种技术均进行了考虑,并提供了相应的升级处理方法,上述的各个可选实施例可以单独实施,也可以结合在一起实施。

上述介绍了多种虚拟化平台,例如,vmware、virtualbox、virtualpc、xen、openvz、kvm。下面以xen为例进行说明,以xen为例的原因是:目前比较倾向于选择xen,因为它是对供应商和和客户来说都是可以接受的折衷方案。其他虚拟化平台上也可以采用相同的方式进行处理,在此不再赘述。

数据中心内部都由一个个集群组成,集群内部每个服务器上运行着多台vm,每个vm可以配置多块磁盘,每块磁盘独立提交读写io请求,升级后端软件时需要能同时并行处理多个vm的磁盘,io的暂停和恢复时间尽量短,让用户的io受影响最小。

本实施例中的虚拟化平台为xen虚拟化平台,每台物理机可以基于xen虚拟化虚拟出多个vm,vm的每块磁盘独立提交读写io请求,后端接入服务运行时能同时接收每个磁盘的前后端驱动下发的io请求,后端存储服务维护着所有vm磁盘对应的后端文件,这个后端存储服务是每个vm磁盘io的必经之路,它的热升级直接影响每个vm磁盘io的体验。

本实施例提出一种改进的虚拟机存储后端存储服务热升级装置,能实现存储后端存储服务的热升级,无论在vm磁盘空闲还是繁忙的时候,都可以在原服务进程退出时,将io链路安全暂停,在新服务进程启动时,重建io链路并正确重发等待中的io请求,同时并发处理一台物理机上的多个vm的多块磁盘io的暂停与恢复,恢复过程中主动建立io链路,将io暂停时间压缩到最短。

本实施例可以通过装置实现,本装置实现后端存储服务的热升级,下面结合4所示的示例,对本申请的一种优选的实施例进行描述。

在描述本申请的一种优选的实施例之前,先对服务升级过程中应用的模块进行介绍:

虚拟块装置:一个vm磁盘对应一个虚拟块装置,用于接收后端驱动转发的io请求,并维护该磁盘的后端存储相关配置;

io链路:从虚拟块装置取出io请求,并建立io请求与后端存储的io通道,实现ioring机制、io通知等;

等待队列:从虚拟块装置取出io请求发给后端存储后,等待队列里维护着等待后端存储完成的io请求;

io处理模块:从ioring里取出io请求,并提交给后端存储文件;

后端文件管理模块:管理所有后端文件的打开与关闭;

链路暂停与恢复模块:是整个热升级的组织者,用于协调上述模块,执行热升级中io链路的暂停与恢复。

上述模块中,虚拟块装置、等待队列、io链路都位于物理机的内核态,链路暂停与恢复、io处理、后端文件管理模块位于用户态,是后端存储服务进程的一部分。

首先,在后端存储服务需要升级时,会注册一个预设的特殊信号,在链路暂停与回复模块在接收到预设的特殊信号后,会暂停事件io通道,先停止io处理模块的事件监听并关闭昨天句柄、unmapioring内存,不再从ioring里取出io;然后停止虚拟块装置,并且清除ioring对应的内存映射项,此时,虚拟块设备中的没有处理完成的io请求会保留在等待队列中;最后关闭后端存储文件,等所有文件成功关闭后,后端存储服务进程才安全退出。

在退出新后端存储服务的原进程后,新服务进程会马上启动,启动后它会先遍历所有的正在升级后端存储服务的虚拟块装置,得到磁盘配置信息和设备minor编号,其中,配置信息是一个conf文件,conf文件中保存着后端存储文件id、磁盘大小、存储类型等等,后端文件管理模块根据这些配置打开后端文件,然后打开minor对应的字符设备得到监听句柄,在mmapioring的过程中会进入内核态重新建立ioring的映射项,并将保留在等待队列里的请求重新插入ioring、通知监听句柄、重启虚拟块装置请求队列,返回用户态后,再将监听句柄注册到io处理线程,恢复事件监听并开始处理io,保存在等待队列里的io,会重新提交到后端存储,完成后返回给vm。

图6是根据本申请实施例2的一种可选的升级方法的流程图,在一种可选的实施例中,结合图6所示的示例,对本申请的一种升级方法进行具体描述。

步骤s61,收到kill-10信号。

具体的,在上述步骤中,虚拟机的后端存储服务启动升级时,生成io通道控制指令,例如,io通道控制指令可以是一个特殊的信号,在该示例中,后端存储服务器注册的特殊符号为10,在接收到io通道控制指令kill-10信号后,链路暂停与回复模块开始暂停事件io通道。

步骤s62,停止io处理模块的事件监听。

具体的,在上述步骤中,io处理模块用于将所述字符设备的句柄进行注册监听io事件通知,并根据监听得到的所述io请求交给存储设备进行处理,停止io处理模块的事件监听后,io处理模块将不能将io请求提交至存储设备进行处理。

步骤s63,关闭字符设备监听句柄。

具体的,在上述步骤中,字符设备的句柄用于被监听以获得io事件通知,在每个io链路创建时就会建立对应的字符设备,关闭字符设备的监听句柄后,io请求将不能被监听到。

步骤s64,unmapioring不再从ring中取io。

在上述步骤中,字符设备在内存中的映射项不再从环形缓冲中中读取io请求。

步骤s65,停止虚拟块装置队列。

具体的,在退出后端存储服务的原服务进程之前,可以将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置,其中,虚拟块装置用于接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息。

在上述步骤中,在暂停虚拟块装置后,虚拟块装置保存配置信息,并暂停接收新的io请求。

步骤s66,清除内核里的ioring对应映射项。

在上述步骤中,销毁映射到所述物理设备的内存。

步骤s67,关闭后端存储文件。

在上述步骤中,关闭后端存储文件可以是在多个线程中并行异步关闭存储设备中的文件。

步骤s68,退出后端存储服务的原服务进程。

通过上述步骤s61至s67,退出原服务进程。

步骤s69,启动后端存储服务的新服务进程。

步骤s560,遍历虚拟块装置的配置信息得到磁盘conf文件和设备minor。

在上述步骤中,磁盘conf文件为磁盘的配置信息,conf文件中保存有后端存储文件id、磁盘大小、存储类型等信息,新服务进程主动遍历所有正在升级后端存储服务的虚拟块装置,得到磁盘配置信息以及设备minor编号。

步骤s611,解析conf文件得到配置。

上述步骤通过解析conf文件得到虚拟块的配置信息。

步骤s612,打开后端存储文件。

在上述步骤中,打开后端存储文件可以是在多个线程中并行异步打开所述存储设备中的文件。

步骤s613,打开minor对应字符设备得到监听句柄。

具体的,minor为linux操作系统为每个设备分配的编号,在上述步骤中,打开监听句柄,以使得io虚拟块开始重新监听io请求。

步骤s614,mmapioring。

具体的,mmap函数用于进入内核态重建内存的环形缓冲的映射项。

步骤s615,重新建立ioring。

上述步骤用于重新建立环形缓冲。

步骤s616,重新提交等待队列里的请求插入ioring,通知监听句柄。

在上述步骤中,将等待队列中之前暂停处理的io读写请求重新插入io链路中的环形缓冲,并通知字符设备开启监听句柄。

步骤s617,重启虚拟块装置请求队列。

在上述步骤中,重启虚拟块装置的请求队列,将将队列中的io请求重新提交。

步骤s618,将监听句柄注册到io处理模块。

具体的,在退出后端存储服务的原服务进程之前,方法还包括:为每个虚拟机磁盘创建一个对应的io处理模块,其中,该io处理模块用于将字符设备的句柄进行注册监听io事件通知,并根据监听得到的io请求交给存储设备进行处理。

在上述步骤中,将监听句柄重新注册到io处理模块中,能够使io处理模块重新开始监听io请求,并将监听到的io请求发送至存储设备。

步骤s619,开始监听并处理io。

通过上述步骤,在成功启动升级后的新的进程之后,监听并开始处理io请求,其中,保存在等待队列中的io请求,会重新提交至后端存储,后端存储完成对io请求的处理后返回给vm磁盘。

需要说明的是,为了确保升级过程中等待队列中的io请求重新提交不破坏数据的正确性,再重新提交等待队列中的io请求时,仍以io请求进入等待队列中的顺序为准。

通过本实施例同时服务多个vm磁盘的后端存储服务进程,能够安全快速的热升级,加快io处理链路暂停与恢复的过程,降低热升级对io的影响;io链路是基于共享内存的ioring,本装置同时涉及用户态和内核态之间的交互,优化模块间的交互流程,让整个后端存储服务进程安全平滑的完成热升级。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。

实施例3

根据本申请实施例,还提供了一种用于实施上述升级方法的装置,图7是根据本申请实施例3的一种升级装置的结构图,如图7所示,该装置700包括:

暂停模块702,用于退出后端存储服务的原服务进程,其中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求,虚拟化平台运行在物理设备上,后端存储服务为运行在物理设备上用于接收并处理io请求的服务;

恢复模块704,用于在退出原服务进程后,启动升级后的新服务进程,其中,新服务进程用于重新执行暂停并保存的原服务进程处理的io请求。

暂停模块702和恢复模块704实现了上述链路暂停与恢复模块的部分或全部功能。

通过上述模块,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

根据本申请上述实施例,在物理设备处理虚拟机的io请求的时候,会将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置,其中,该虚拟块装置用于接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息。通过虚拟块装置的处理,使得对虚拟机的io请求更加容易处理和管理。

在采用虚拟块装置的情况下,暂停模块702,用于暂停所有的虚拟块装置,其中,所有虚拟块装置保存配置信息,所有虚拟块装置暂停接收新的io请求,并且,对于将正在处理的io请求挂起;恢复模块704,用于启动所有的虚拟块装置。即在升级之后,启动新服务进程时,新服务进程启动这些虚拟块装置即可。此时,虚拟块装置的配置保持不变,启动之后可以对io请求进行继续处理,接收新的io请求,并处理之前挂起的io请求。

根据本申请上述实施例,当启动块设备的时,可以采用两种方式来进行处理。

第一种方式:让每个虚拟块装置查询后端新服务进程是否启动好。这种查询方式一般情况下会设置一个查询的时间间隔,如果间隔过长会导致io请求挂起的时间长,如果间隔过短,则会到查询操作过多,增加负担。因此,在这种方式中,需要设置一个比较合理的时间间隔。一旦设置的不合理,将出现问题。基于该方式所存在的问题,在实际实施时,不建议采用该方式。

第二种方式:新服务主动进程遍历所有的虚拟块装置。即恢复模块604,用于遍历所有的虚拟块装置。

这种遍历的方式可以更快的恢复io请求的处理。

根据本申请上述实施例,为了更好的处理io请求,可以采用队列的方式来对io请求进行处理,可以将接收到的io请求保存到队列中,并且在该io请求完成后,将其从队列中删除。这样在队列中保存的io请求均是未处理完的io请求,比较容易对未处理完的io请求进行管理。

在这种实施方式中,暂停模块702,用于保存队列中的io请求;恢复模块704,用于重新提交队列中的io请求并进行处理。

通过队列的方式进行处理,可以方便管理未处理完的io请求。在升级的时候保存该队列而并删除该队列,可以记录下未处理完毕的io请求,在升级之后启动新服务进程时重新提交该队列中的io请求即可。

根据本申请上述实施例,在将接收到的io请求通过io链路进行处理的情况下,其中,每个io链路创建时建立对应的字符设备;字符设备的句柄用于被监听以获得io事件通知,并且,通过字符设备提供内存及并将io请求的上下文保存到内存的缓冲区中,使io请求的上下文对原服务进程可见.

在该优选实施方式中,暂停模块602,用于保留字符设备,关闭字符设备的句柄;恢复模块704,用于重新打开字符设备的句柄。

在另一个可选的实施方式,可以采用io链路以及内存映射的方式进行处理。这种方式可以缩短io链路。

io链路是一条io从内核态到用户态服务进程的通道,通过该通道以及内存映射,实现了io请求上下文、io内容的内存映射从而提高了性能,减少了拷贝,实现了通知机制。

在该可选的实施方式中,vm中的应用读写磁盘时,io请求会经过前后端驱动到达物理机,通过触发的方式进行逻辑的处理。然后将io请求解析并拿到io的长度、偏移、操作、编号、相对地址等,然后进行内存映射。在内存映射时可以通过mmap等系统调用,将前后端驱动中这个磁盘对应的地址空间映射到物理设备中,从而拿到一个自己可以访问的地址空间,包括地址空间的起始地址和长度等,当vm磁盘io请求提交过来时,先从映射的地址空间中拿到请求的上下文,包括请求编号、偏移、大小、请求数据的相对直址等,根据请求的编号、相对地址以及地址空间的起始地址,计算得到存放这个请求数据的内存地址,从而不再需要将写请求的数据内容进行拷贝,降低io的latency。

根据本申请上述实施例,在通过字符设备将io请求的上下文保存映射到物理设备的内存中,使io请求的上下文对原服务进程可见的情况下,暂停模块,用于销毁映射到物理设备的内存;恢复模块,用于通过字符设备重新进行内存映射。

根据本申请上述实施例,在为每个虚拟机磁盘创建一个对应的io处理模块的情况下,其中,该io处理模块用于将字符设备的句柄进行注册监听io事件通知,并根据监听得到的io请求交给存储设备进行处理;暂停模块,用于销毁io处理模块;恢复模块,用于重新创建io处理模块。

根据本申请上述实施例,在为每个虚拟机磁盘创建一个对应的io处理模块的情况下,其中,该io处理模块用于根据io请求的上下文映射出该io请求的数据内容,并交给存储设备进行处理。

在该可选实施例中,暂停模块702,用于销毁io处理模块;恢复模块704,用于重新创建io处理模块。

使用多个io处理模块进行处理,可以是io处理模块之间互相不干扰。也可以通过io处理模块对io请求进行限制。例如,根据预先设置的限制条件判断是否允许就该虚拟机的io请求向存储设备提交,在判断结果为允许的情况下,才向存储设备提交所述io请求。如果限制条件不允许提交io请求,此时,可以拒绝该io请求,并提示现在受到了资源的限制。或者,作为一个相对友好的处理方式,可以在预定时间后再向存储设备提交该io请求。当再次提交的时候,可以不再判断该io请求是否符合预先设置的限制条件。或者,再次提交的时候依然根据预先设置的限制条件再次判断是否允许提交该io请求,如果不允许则继续等待预定时间后再提交。

根据本申请上述实施例,暂停模块702,用于在多个线程中并行异步关闭存储设备中的文件;恢复模块704,用于在多个线程中并行异步打开存储设备中的文件。这样实现了多线程的并行操作,提高了升级的速度。

对于文件的关闭处理,可以使用一个线程进行关闭,此时,关闭的速度比较慢,增加了升级的时间。在一个可选的实施方式中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求的时候,可以在多个线程中并行异步关闭存储设备中的文件;在启动新服务进程时,可以在多个线程中并行异步打开存储设备中的文件。

在上述实施例中,对于虚拟机的io请求所可能采用的各种技术均进行了考虑,并提供了相应的升级处理方法,上述的各个可选实施例可以单独实施,也可以结合在一起实施。

实施例4

根据本申请实施例,还提供了一种基于虚拟机的升级方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例提供了如图8所示的基于虚拟机的升级方法。图8是根据本申请实施例4的基于虚拟机的升级方法的流程图,如图8所示,该流程包括如下步骤:

步骤s802,启动升级虚拟机的后端存储服务,生成io通道控制指令。

在上述步骤中,在io请求经过虚拟化平台达到后端驱动时,后端驱动需要通过将io请求转发至一个后端存储服务进程,后端存储服务进程将io请求提交至后端存储,来提供后端存储服务,上述io通道控制指令用于控制停止处理当前的io请求。

在后端存储为io请求提供服务的过程中,由于数据中心后台软件的迭代、新功能的加入以及性能优化、缺陷修复等原因,需要对后端存储服务进行升级,基于上述任意一种原因,在需要对后端存储服务进行升级时,启动升级虚拟机的后端存储服务。

此处需要说明的是,上述启动升级虚拟机的后端存储服务的原因可以是上述任意一种,但不限于此,且触发启动升级虚拟机可以是在检测后台新的软件更新请求、新的性能优化请求时自动触发启动升级虚拟机的后端存储服务,也可以是用户在接收到软件更新请求、新的性能优化等提醒时手动启动升级虚拟机的后端存储服务。

在一种可选的实施例中,可以将启动升级虚拟机的后端存储服务生成的特殊符号作为io通道控制指令,例如,在后端存储服务升级时,注册了一个特殊信号10,在接收到kill-10的信号时,开始推出后端存储服务的原服务进程,其中,kill-10信号即为io通道控制指令。

步骤s804,根据io通道控制指令暂停处理当前的io读写请求,并退出后端存储服务的当前服务进程。

在上述步骤中,当前服务进程为旧的服务进程,即需要更新的后端存储服务运行时所产生的进程。

在一种可选的实施例中,在接收到io通道控制指令之后,停止读取新的io请求,将未处理的io请求保存在预设的队列中,并关闭后端存储文件,上述过程实施完毕后,再推出后端存储服务的当前服务进程。

步骤s806,在退出后端存储服务的当前服务进程之后,启动后端存储服务的新服务进程。

步骤s808,在后端存储服务升级后,使用新服务进程重新执行暂停处理的io读写请求。

在上述步骤中,在后端存储服务升级后,新服务进程不仅执行在退出旧的服务进程之前暂停的io请求,还重新启动接收并处理新的io请求。

本实施例提出的一种升级方法,实现在vm不停机的情况下,存储后端存储服务进程的热升级,不限制vm内部所部署的是什么应用,也实现多个vmio链路的并发暂停与恢复,降低vm之间的相互影响,新服务进程启动ready后主动恢复已暂停的设备,降低热升级对vmio的影响时间。

通过上述步骤,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

由上可知,本申请上述实施例通过在退出原服务进程后启动升级后的新服务进程,在新服务进程启动之后,可以恢复之前的io请求,从而达到了在升级过程中不需要停止虚拟机运行的技术效果。

根据本申请上述实施例,在执行步骤804中,即根据io通道控制指令暂停处理io读写请求,并退出后端存储服务的当前服务进程,包括:

步骤s8041,控制io处理模块停止读取io读写请求,其中,io处理模块为创建虚拟机的虚拟磁盘时所创建的模块,用于从io链路模块中读取io读写请求。

在一个可选的实施方式中,可以对每个虚拟机磁盘进行独立的处理。例如,在创建vm磁盘时,每个vm磁盘会创建一个自身对应的io处理模块,在上述实施例中,io处理模块可以用于根据io请求的上下文映射得到io请求的数据内容,其中,io请求的上下文可以由io处理模块从io链路中获取,映射的到的io请求的数据内容可以提交至后端存储设备。

在另一种可选的实施例中,io处理模块在将io请求的数据内容提交至后端存储设备之前,还可以对io请求进行流控限速处理,例如,根据预先设置的限制条件判断是否允许就该虚拟机的io请求向存储设备提交,在判断结果为允许的情况下,才向存储设备提交io请求。如果限制条件不允许提交io请求,此时,可以拒绝该io请求,并提示现在受到了资源的限制。或者,作为一个相对友好的处理方式,可以在预定时间后再向存储设备提交该io请求。当再次提交的时候,可以不再判断该io请求是否符合预先设置的限制条件。或者,再次提交的时候依然根据预先设置的限制条件再次判断是否允许提交该io请求,如果不允许则继续等待预定时间后再提交。

步骤s8043,停止虚拟块装置,并清除io链路模块映射的io读写请求的内存空间,其中,虚拟块装置对应于一个虚拟磁盘,用于接收并传输io读写请求,io链路模块为用于创建与后端存储关联的io通道。

在创建vm时,可以创建每个磁盘及其对应的虚拟块装置,这些虚拟块装置,也保存着对应磁盘的详细配置,如后端存储文件的id、磁盘大小、存储类型(分布式存储还是本地raid存储)等,虚拟块装置同时维护着自己的minor(linux操作系统给每个设备的编号)编号,在正常运行时,虚拟块装置接收并转发io请求,在停止虚拟块装置的情况下,未处理的io请求可以保存于预设队列中,而不被传输或转发。

步骤s8045,关闭后端存储的文件,并启动后端存储服务的当前服务进程。

在一种可选的实施例中,可以采用后端文件管理模块来关闭后端存储的文件。在本申请上述事实了提出的升级方案中,退出原服务进程后会暂时关闭后端存储文件,但一台物理机上可以创建多个vm磁盘,多个vm磁盘依次关闭的速度也会延长让io请求挂起的时间,为了加速后端存储文件关闭的操作,后端文件管理模块在收到关闭指令后,会在多个线程里并行异步的关闭后端存储文件,同时也可以提供等待所有文件成功关闭的接口,以在所有文件成功关闭后返回预设指令,在这个接口返回预设指令后,可以确定原服务进程安全的退出了。

根据本申请上述实施例,在执行步骤808中,在后端存储服务升级后,使用新服务进程重新执行暂停处理的io读写请求,包括:

步骤s8081,遍历升级后的后端存储服务对应的虚拟块装置,重新打开已经关闭的后端存储文件。

在一种可选的实施例中,可以采用后端文件管理模块打开后端存储文件。在vm磁盘创建时,需要打开其对应的后端文件(分布式文件系统或者本地raid存储里的文件)才能读写io请求,在io处理模块对io请求进行处理后,会提交到其对应的后端文件。但一台物理机上可以创建多个vm磁盘,多个vm磁盘依次打开的速度也会延长让重新启动新服务进程的时间,为了加速后端存储文件的开启操作,后端文件管理模块在收到打开指令后,在多个线程里并行异步的重新打开后端文件。

此处需要说明的是,如果采用每个虚拟块装置查询后端新服务进程是否启动完成的方式,则需要预设一个比较合理的轮巡时间,如果轮巡时间过长,会导致io请求挂起的时间长,如果间隔过短,则会到查询操作过多,增加虚拟块装置的运行负担。如果预设的轮巡时间不合理,则会影响新进程的启动,而采用上述新服务进程主动遍历所有的虚拟块装置的方式,以主动恢复整条io链路,可以更快的恢复io请求的处理。

步骤s8083,重新启动io链路模块来重建与后端存储关联的io通道。

在上述实施例中,通过io链路模块实现与后面的io处理模块的交互,io链路模块提供一条io从内核态到用户态服务进程的通道,实现了io请求上下文、io内容的内存映射从而提交性能减少拷贝,也实现了ioring(环形缓冲)及其通知机制,每个链路创建时会创建并打开一个字符设备,打开这个字符设备对应的句柄实现了io到达事件的通知,这个字符设备同时也提供了一块内存及其映射的接口,这段共享的内存一个ioring管理io上下文的传递,映射给后端存储服务进程可见。热升级时暂停io链路时,监听句柄会暂时关闭,映射的内存和ioring会先销毁,但字符设备不会删除,恢复io链路时,会重新打开句柄,并分配共享的内存页并建立ioring通道。

在一种可选的实施例中,在启动新服务进程之后,虚拟块装置作为io请求的入口,每个vm磁盘的io请求在经过后端驱动映射以后,都提交给其对应的虚拟块装置,虚拟块装置将io请求提交给重新启动的io链路模块,并最终交由后端存储服务处理。

步骤s8085,在恢复虚拟块装置请求等待队列之后,将等待队列中之前暂停处理的io读写请求重新插入io链路模块。

在上述步骤中,通过将将等待队列中之前暂停处理的io读写请求重新插入io链路模块,来使得io链路模块可以将等到队列中之前暂停处理的io请求重新传输至后端存储文件来进行处理。

步骤s8087,通知io处理模块重新监听,并重新从io链路模块中取出之前暂停处理的io读写请求提交给后端存储文件。

在重新启动新服务进程后,需要接收新的io请求,因此通知io处理模块重新监听io请求事件,并重新开始处理在退出原服务进程之前为完成的io请求。

实施例5

根据本实施例,还提供了一种基于虚拟机的升级装置。

图9是根据本申请实施例5的一种基于虚拟机的升级装置的结构框图,如图9所示,该装置900包括如下单元:

第一启动模块902,用于启动升级虚拟机的后端存储服务,生成io通道控制指令。

在上述装置中,在io请求经过虚拟化平台达到后端驱动时,后端驱动需要通过将io请求转发至一个后端存储服务进程,后端存储服务进程将io请求提交至后端存储,来提供后端存储服务,上述io通道控制指令用于控制停止处理当前的io请求。

在后端存储为io请求提供服务的过程中,由于数据中心后台软件的迭代、新功能的加入以及性能优化、缺陷修复等原因,需要对后端存储服务进行升级,基于上述任意一种原因,在需要对后端存储服务进行升级时,启动升级虚拟机的后端存储服务。

此处需要说明的是,上述启动升级虚拟机的后端存储服务的原因可以是上述任意一种,但不限于此,且触发启动升级虚拟机可以是在检测后台新的软件更新请求、新的性能优化请求时自动触发启动升级虚拟机的后端存储服务,也可以是用户在接收到软件更新请求、新的性能优化等提醒时手动启动升级虚拟机的后端存储服务。

退出模块904,用于根据所述io通道控制指令暂停处理当前的io读写请求,并退出所述后端存储服务的当前服务进程。

第二启动模块906,用于在退出所述后端存储服务的当前服务进程之后,启动所述后端存储服务的新服务进程。

执行模块908,用于在所述后端存储服务升级后,使用所述新服务进程重新执行所述暂停处理的所述io读写请求。

在上述步骤中,在后端存储服务升级后,新服务进程不仅执行在退出旧的服务进程之前暂停的io请求,还重新启动接收并处理新的io请求。

本实施例提出的一种升级方法,实现在vm不停机的情况下,存储后端存储服务进程的热升级,不限制vm内部所部署的是什么应用,也实现多个vmio链路的并发暂停与恢复,降低vm之间的相互影响,新服务进程启动ready后主动恢复已暂停的设备,降低热升级对vmio的影响时间。

通过上述装置,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

由上可知,本申请上述实施例通过在退出原服务进程后启动升级后的新服务进程,在新服务进程启动之后,可以恢复之前的io请求,从而达到了在升级过程中不需要停止虚拟机运行的技术效果。

此处需要说明的是,上述第一启动模块902,退出模块904,第二启动模块906和执行模块908对应于实施例3中的步骤s802至步骤s808,四个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,上述退出模块904包括:

第一停止模块910,用于控制io处理模块停止读取所述io读写请求,其中,所述io处理模块为创建所述虚拟机的虚拟磁盘时所创建的模块,用于从io链路模块中读取io读写请求。

第二停止模块912,用于停止虚拟块装置,并清除所述io链路模块映射的所述io读写请求的内存空间,其中,所述虚拟块装置对应于一个虚拟磁盘,用于接收并传输所述io读写请求,所述io链路模块为用于创建与后端存储关联的io通道。

关闭模块914,用于关闭所述后端存储的文件,并启动所述后端存储服务的当前服务进程。

此处需要说明的是,上述第一停止模块910,第二停止模块912和关闭模块914对应于实施例3中的步骤s8041至步骤s8045,三个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,上述执行模块908包括:

遍历模块916,用于遍历所述升级后的后端存储服务对应的虚拟块装置,重新打开已经关闭的后端存储文件。

重启模块918,用于重新启动所述io链路模块来重建与所述后端存储关联的io通道。

插入模块920,用于在恢复所述虚拟块装置请求所述等待队列之后,将所述等待队列中之前暂停处理的io读写请求重新插入所述io链路模块。

通知模块922,用于通知所述io处理模块重新监听,并重新从所述io链路模块中取出所述之前暂停处理的io读写请求提交给所述后端存储文件。

此处需要说明的是,上述遍历模块916,重启模块918,插入模块920和通知模块922对应于实施例3中的步骤s8081至步骤s8087,四个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

实施例6

本申请的实施例可以提供一种物理设备,该物理设备可以是物理设备群中的任意一个物理设备。可选地,在本实施例中,随着移动终端的运算能力的提高,上述物理设备也可以替换为移动终端等终端设备。

可选地,在本实施例中,上述物理设备可以位于计算机网络的多个网络设备中的至少一个网络设备。

在本实施例中,上述计算机终端可以执行应用程序的漏洞检测方法中以下步骤的程序代码:退出后端存储服务的原服务进程,其中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求;在退出原服务进程后,启动升级后的新服务进程,其中,新服务进程用于重新执行暂停并保存的原服务进程处理的io请求。

可选地,图10是根据本发明实施例6的一种计算机终端的结构框图。如图10所示,该计算机终端a可以包括:一个或多个(图中仅示出一个)处理器1002、存储器1004以及外设接口1006。

其中,存储器可用于存储软件程序以及模块,如本申请实施例中的升级方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的升级方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至物理设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

在本实施例中,上述物理设备或者处理器可以执行升级方法中以下步骤的程序代码:

可选的,上述处理器还可以执行如下步骤的程序代码:退出后端存储服务的原服务进程,其中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,该io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求;这里的io请求可能有多个io请求,此时均需要进行暂停并保存这些io请求。

在退出原服务进程后,启动升级后的新服务进程,其中,新服务进程用于重新执行暂停并保存的原服务进程处理的io请求。在新服务进程启动之后,可以恢复之前的io请求,从而可以做到不需要停止虚拟机再进行升级。

通过上述步骤,采用在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,然后在升级后启动新服务进程继续处理io请求的方式,通过暂停保存io请求并在升级后继续处理io请求,这样可以避免停止vm,尽量减少升级对用户所带来的影响,从而实现了后端存储服务的热升级,进而解决了采用冷升级的方式对vm的后端存储服务进行升级所导致的服务中断的技术问题。

在某种情况下,在物理设备处理虚拟机的io请求的时候,会将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置,其中,该虚拟块装置用于接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息。通过虚拟块装置的处理,使得对虚拟机的io请求更加容易处理和管理。

在采用虚拟块装置的情况下,在进行升级的时候,需要暂停所有的虚拟块装置。由于虚拟块装置中保存着配置信息,此时,暂停虚拟块装置可以使保存的这些配置信息不丢失。暂停虚拟块装置之后,这些虚拟块装置停机接收新的io请求,并且如果存在正在处理的io请求,可以将这些正在处理的io请求挂起。

在升级之后,启动新服务进程时,新服务进程启动这些虚拟块装置即可。此时,虚拟块装置的配置保持不变,启动之后可以对io请求进行继续处理,接收新的io请求,并处理之前挂起的io请求。

启动块设备的时候,可以采用两种方式来进行处理。

第一种方式:让每个虚拟块装置查询后端新服务进程是否启动好。这种查询方式一般情况下会设置一个查询的时间间隔,如果间隔过长会导致io请求挂起的时间长,如果间隔过短,则会到查询操作过多,增加负担。因此,在这种方式中,需要设置一个比较合理的时间间隔。一旦设置的不合理,将出现问题。基于该方式所存在的问题,在实际实施时,不建议采用该方式。

第二种方式:新服务进程主动遍历所有的虚拟块装置。这种遍历的方式可以更快的恢复io请求的处理。

作为一个可选的实施方式,为了更好的处理io请求,可以采用队列的方式来对io请求进行处理,可以将接收到的io请求保存到队列中,并且在该io请求完成后,将其从队列中删除。这样在队列中保存的io请求均是未处理完的io请求,比较容易对未处理完的io请求进行管理。

在这种实施方式中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求的过程中,保存该队列中的io请求。在升级结束之后,启动新服务进程时可以重新提交队列中的io请求并进行处理。

通过队列的方式进行处理,可以方便管理未处理完的io请求。在升级的时候保存该队列而并删除该队列,可以记录下未处理完毕的io请求,在升级之后启动新服务进程时重新提交该队列中的io请求即可。

在另一个可选的实施方式,可以采用io链路以及内存映射的方式进行处理。这种方式可以缩短io链路。

在该可选的实施方式中,vm中的应用读写磁盘时,io请求会经过前后端驱动到达物理机,通过触发的方式进行逻辑的处理。然后将io请求解析并拿到io的长度、偏移、操作、编号、相对地址等,然后进行内存映射。在内存映射时可以通过mmap等系统调用,将前后端驱动中这个磁盘对应的地址空间映射到物理设备中,从而拿到一个自己可以访问的地址空间,包括地址空间的起始地址和长度等,当vm磁盘io请求提交过来时,先从映射的地址空间中拿到请求的上下文,包括请求编号、偏移、大小、请求数据的相对直址等,根据请求的编号、相对地址以及地址空间的起始地址,计算得到存放这个请求数据的内存地址,从而不再需要将写请求的数据内容进行拷贝,降低io的latency。

io链路是一条io从内核态到用户态服务进程的通道,通过该通道以及内存映射,实现了io请求上下文、io内容的内存映射从而提高了性能,减少了拷贝,实现了通知机制。使用了io链路的时候,可以将接收到的io请求通过io链路进行处理,其中,每个io链路创建时建立对应的字符设备;字符设备的句柄用于被监听以获得io事件通知。

在该优选实施方式中,对于字符设备在退出原服务进程的时候,不删除该字符设备,保留字符设备,关闭字符设备的句柄,在启动新服务进程的时候,可以重新打开字符设备的句柄。

可选的,上述处理器还可以执行如下步骤的程序代码:通过字符设备将io请求的上下文保存映射到物理设备的内存中,使io请求的上下文对原服务进程可见;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:销毁映射到物理设备的内存;启动新服务进程还包括:通过字符设备重新进行内存映射。

可选的,上述处理器还可以执行如下步骤的程序代码:在io请求的上下文通过内存中的环形缓冲进行管理的情况下,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:删除内存中的环形缓冲;启动新服务进程还包括:重新在内存中建立环形缓冲。

在另外一个可选的实施方式中,还可以对每个虚拟机磁盘进行独立的处理。例如,可以为每个虚拟机磁盘创建一个对应的io处理模块,其中,该io处理模块用于将字符设备的句柄进行注册监听io事件通知,并根据监听得到的io请求交给存储设备进行处理;

在该可选实施例中,在退出服务进程的过程中,可以将所有的io处理模块进行销毁,在启动新服务进程时,再重新创建io处理模块。

使用多个io处理模块进行处理,可以是io处理模块之间互相不干扰。也可以通过io处理模块对io请求进行限制。例如,根据预先设置的限制条件判断是否允许就该虚拟机的io请求向存储设备提交,在判断结果为允许的情况下,才向存储设备提交io请求。如果限制条件不允许提交io请求,此时,可以拒绝该io请求,并提示现在受到了资源的限制。或者,作为一个相对友好的处理方式,可以在预定时间后再向存储设备提交该io请求。当再次提交的时候,可以不再判断该io请求是否符合预先设置的限制条件。或者,再次提交的时候依然根据预先设置的限制条件再次判断是否允许提交该io请求,如果不允许则继续等待预定时间后再提交。

对于文件的关闭处理,可以使用一个线程进行关闭,此时,关闭的速度比较慢,增加了升级的时间。在一个可选的实施方式中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求的时候,可以在多个线程中并行异步关闭存储设备中的文件;在启动新服务进程时,可以在多个线程中并行异步打开存储设备中的文件。这样实现了多线程的并行操作,提高了升级的速度。

这些代码也可以保存在存储器中。

本领域普通技术人员可以理解,物理设备也可以是智能手机(如android手机、ios手机等)、平板电脑、掌声电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

实施例6

本申请的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例1所提供的升级方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络中物理设备中的任意一个物理设备中,或者位于移动终端群中的任意一个移动终端中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:退出后端存储服务的原服务进程,其中,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求,该io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘的io请求;这里的io请求可能有多个io请求,此时均需要进行暂停并保存这些io请求。

在退出原服务进程后,启动升级后的新服务进程,其中,新服务进程用于重新执行暂停并保存的原服务进程处理的io请求。在新服务进程启动之后,可以恢复之前的io请求,从而可以做到不需要停止虚拟机再进行升级。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在退出后端存储服务的原服务进程之前,方法还包括:将每个虚拟机磁盘进行映射并分别对应一个虚拟块装置,其中,虚拟块装置用于接收对应的虚拟机磁盘的io请求,并用于保存该虚拟机磁盘对应的存储设备的磁盘的配置信息;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:暂停所有的虚拟块装置,其中,所有虚拟块装置保存配置信息,所有虚拟块装置暂停接收新的io请求,并且,对于将正在处理的io请求挂起;启动升级后的新服务进程包括:新服务进程启动所有的虚拟块装置。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:新服务进程启动所有的虚拟块装置包括:新服务进程主动遍历所有的虚拟块装置。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在退出后端存储服务的原服务进程之前,方法还包括:将接收到的io请求保存到队列中,并且在io请求完成后,将其从队列中删除;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:保存队列中的io请求;启动新服务进程包括:重新提交队列中的io请求并进行处理。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在退出后端存储服务的原服务进程之前,方法还包括:将接收到的io请求通过io链路进行处理,其中,每个io链路创建时建立对应的字符设备;字符设备的句柄用于被监听以获得io事件通知;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:保留字符设备,关闭字符设备的句柄;启动新服务进程包括:重新打开字符设备的句柄。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:通过字符设备将io请求的上下文保存映射到物理设备的内存中,使io请求的上下文对原服务进程可见;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:销毁映射到物理设备的内存;启动新服务进程还包括:通过字符设备重新进行内存映射。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在io请求的上下文通过内存中的环形缓冲进行管理的情况下,在退出原服务进程的过程中暂停并保存原服务进程处理的io请求还包括:删除内存中的环形缓冲;启动新服务进程还包括:重新在内存中建立环形缓冲。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在退出后端存储服务的原服务进程之前,方法还包括:为每个虚拟机磁盘创建一个对应的io处理模块,其中,该io处理模块用于将字符设备的句柄进行注册监听io事件通知,并根据监听得到的io请求交给存储设备进行处理;在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:销毁io处理模块;启动新服务进程包括:重新创建io处理模块。

可选地,在本实施例中,存储介质还被设置为存储用于执行以下步骤的程序代码:在退出原服务进程的过程中暂停并保存原服务进程处理的io请求包括:在多个线程中并行异步关闭存储设备中的文件;启动新服务进程包括:在多个线程中并行异步打开存储设备中的文件。

这些代码可以通过c语言或者c++等语言完成。其他语言也可以实现这些代码,并起到相应的效果,在此不再一一赘述。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1