公开/公告号CN112395050A
专利类型发明专利
公开/公告日2021-02-23
原文格式PDF
申请/专利权人 深信服科技股份有限公司;
申请/专利号CN202011373888.5
申请日2020-11-30
分类号G06F9/455(20060101);G06F11/14(20060101);
代理机构44285 深圳市深佳知识产权代理事务所(普通合伙);
代理人张金香
地址 518055 广东省深圳市南山区学苑大道1001号南山智园A1栋一层
入库时间 2023-06-19 09:58:59
技术领域
本申请涉及虚拟机技术领域,特别涉及一种虚拟机备份方法、虚拟机备份装置、电子设备及计算机可读存储介质。
背景技术
虚拟化环境中,对虚拟机进行备份是业务保障的重要机制。在虚拟机的运行存储出现故障、或者虚拟机被病毒入侵时,可以通过虚拟机的备份文件实现快速恢复,避免数据丢失和业务长时间中断。相关技术在对虚拟机进行备份时备份速度较慢,远远小于存储吞吐速度,因此所需的备份时间较长,备份效率较低。
发明内容
有鉴于此,本申请的目的在于提供一种虚拟机备份方法、虚拟机备份装置、电子设备及计算机可读存储介质,提高了数据读取速度和数据写入速度,提高了虚拟机备份的速度。
为解决上述技术问题,本申请提供了一种虚拟机备份方法,包括:
若检测到目标协程,则更新目标虚拟机对应的偏移信息;所述目标协程为多个协程中任意一个处于空闲状态的所述协程;
基于所述偏移信息,利用所述目标协程读取对应的待备份数据;
利用所述目标协程将所述待备份数据写入目标位置。
可选地,所述更新目标虚拟机对应的偏移信息,包括:
若所述目标虚拟机处于全量备份状态,则确定所述目标协程的目标读取阈值;
基于所述目标读取阈值对所述偏移信息进行更新。
可选地,所述更新目标虚拟机对应的偏移信息,包括:
若所述目标虚拟机处于增量备份状态,则确定所述目标协程的目标读取阈值;
基于所述目标读取阈值和所述目标虚拟机对应的增量位图,对所述偏移信息进行更新。
可选地,还包括:
对所述增量位图进行备份,得到备份位图;
若检测到虚拟机备份错误,则利用所述备份位图进行数据回滚操作。
可选地,还包括:
获取与目标待备份数据对应的修改指令;
生成所述目标待备份数据对应的二次备份数据,并根据所述修改指令对所述二次备份数据进行修改;
在所述目标虚拟机备份完毕后,利用多个所述协程将所述二次备份数据同步至所述目标虚拟机对应的备份镜像。
可选地,在检测到目标协程之后,在更新目标虚拟机对应的偏移信息之前,还包括:
判断所述偏移信息是否小于所述目标虚拟机对应的数据体积;
若否,则停止更新所述偏移信息;
若是,则执行所述更新目标虚拟机对应的偏移信息的步骤。
可选地,所述利用所述目标协程将所述待备份数据写入目标位置,包括:
利用所述目标协程将所述待备份数据写入缓冲区;
若检测到目标写入协程,则判断所述缓冲区中是否存在所述目标位置相邻的待备份数据;所述目标写入协程为多个写入协程中任意一个处于空闲状态的所述写入协程;
若存在所述目标位置相邻的待备份数据,则生成对应的合并数据,并利用所述目标写入协程将所述合并数据写入所述目标位置;
若不存在所述目标位置相邻的待备份数据,则利用所述目标写入协程将所述缓冲区内的任意一个所述待备份数据写入所述目标位置。
本申请还提供了一种虚拟机备份装置,包括:
更新模块,用于若检测到目标协程,则更新目标虚拟机对应的偏移信息;所述目标协程为多个协程中任意一个处于空闲状态的所述协程;
读取模块,用于基于所述偏移信息,利用所述目标协程读取对应的待备份数据;
写入模块,用于利用所述目标协程将所述待备份数据写入目标位置。
本申请还提供了一种电子设备,包括存储器和处理器,其中:
所述存储器,用于保存计算机程序;
所述处理器,用于执行所述计算机程序,以实现上述的虚拟机备份方法。
本申请还提供了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现上述的虚拟机备份方法。
本申请提供的虚拟机备份方法,若检测到目标协程,则更新目标虚拟机对应的偏移信息;目标协程为多个协程中任意一个处于空闲状态的协程;基于偏移信息,利用目标协程读取对应的待备份数据;利用目标协程将待备份数据写入目标位置。
可见,该方法在对目标虚拟机进行备份时,在单个线程中建立多个用于进行数据读写的协程,目标协程可以为其中的任意一个处于空闲状态的协程。在检测到目标协程后,说明有协程处于空闲状态,想要读取数据,因此修改偏移信息。偏移信息用于划分已被读取的数据和未被读取的数据,在目标协程未真正开始读取数据前先修改偏移信息,可以避免目标协程读取数据时,其他的协程同样来读取数据而造成的数据读取重复的问题。在修改后利用目标协程读取其对应的待备份数据,在目标协程读取待备份数据的过程中,其他的协程同样可以执行上述的步骤进行数据读取;或者可以写入已读取的数据,实现虚拟机备份的并发处理,提高数据读取和写入的速度,进而提高虚拟机备份的速度。相应的,目标协程在将待备份数据读取完毕后,将其写入对应的目标位置。在目标协程写入数据的过程中,其他的协程可以进行数据的读取或写入。多个协程并发处理,大大提高了数据读取速度和数据写入速度,提高了虚拟机备份的速度,减少了备份时间,解决了相关技术存在的备份时间较长,备份效率较低的问题。
此外,本申请还提供了一种虚拟机备份装置、电子设备及计算机可读存储介质,同样具有上述有益效果。
附图说明
为了更清楚地说明本申请实施例或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的一种虚拟机备份方法流程图;
图2为本申请实施例提供的一种修改指令执行过程流程图;
图3为本申请实施例提供的一种读取效果图;
图4为本申请实施例提供的一种写入效果图;
图5为本申请实施例提供的一种初始化过程流程图;
图6为本申请实施例提供的一种备份过程中修改指令执行过程流程图;
图7为本申请实施例提供的一种控制协程工作流程图;
图8为本申请实施例提供的一种监控协程工作流程图;
图9为本申请实施例提供的一种协程工作流程图;
图10为本申请实施例提供的一种虚拟机备份装置的结构示意图;
图11为本申请实施例提供的一种虚拟机备份方法所适用的一种硬件组成框架示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
相关技术,均采用单线程的方式,同一线程从虚拟机磁盘中读出一个IO(Input/Output,输入/输出)数据后,就将该IO数据写入备份存储下的备份镜像中,读写之间是耦合在一起的。线程需要读完一个IO数据后再进行一次写IO操作,写IO完成后再执行一次读IO操作。例如qemu(虚拟操作系统模拟器,一种虚拟机)/kvm(Kernel-based VirtualMachine,一种虚拟机)的虚拟机热备机制(开机备份),均使用单深度读写不分离的IO模型进行备份。因此相关技术不能充分利用分布式存储系统的性能,导致备份速度慢,无法满足需求。对虚拟机的备份即为对虚拟机中数据的备份,实测在将虚拟机进行备份时,备份速度只能达到20MB/s,备份10T数据需要145个小时。而存储系统的随机读写IO吞吐量实际可以达到200MB/s,相关技术的备份速度远达不到存储系统的瓶颈,不能充分利用存储性能的问题。
为了解决上述问题,由于在一定的IO深度范围内(例如16深度范围),IO速率基本可随深度的增长而线性增长,因此本申请采用了多深度的IO模型实现对存储性能的充分利用,提高虚拟机备份速度。基于此,本申请在单线程中创建多个协程,各个协程并发执行,相互独立地执行数据的读取和写入,进而提高虚拟机的备份速度。
请参考图1,图1为本申请实施例提供的一种虚拟机备份方法流程图。该方法包括:
S101:若检测到目标协程,则更新目标虚拟机对应的偏移信息。
在本实施例中,可以利用指定的电子设备执行本实施例提供的虚拟机备份方法中的全部或部分步骤,该电子设备可以为计算机或服务器,例如可以为具有条带化功能的服务器,任何可以实现多协程工作的设备均可以为该被指定的电子设备。更具体的,在一种实施方式中,该电子设备中除了用于执行虚拟机备份工作的多个协程外,还可以存在对整个虚拟机备份工作进行公职各个协程工作的控制协程。该控制协程对各个协程的工作进行调度和监控,即该控制协程执行虚拟机备份方法中的各个步骤,实现多协程并发工作的功能,进而提高虚拟机备份速度。
需要说明的是,本申请中的目标协程为多个协程中任意一个处于空闲状态的协程。目标协程为处于空闲状态的协程,即目标协程没有读取数据或写入数据;目标协程可以为多个协程中的任意一个,即在任意一个协程没有读取数据或写入数据时,均可以将其确定为目标协程。通过对目标协程进行检测,可以实现各个协程的并发处理。在本实施例中,处于空闲状态的协程的具体数量不做限定,由于协程的数量为多个,因此处于空闲状态的协程可以为一个或多个。进一步的,本实施例并不限定目标协程的确定方式。在一种实施方式中,若检测到一个处于空闲状态的协程时,则可以直接将其确定为目标协程。在另一种实施方式中,若检测到多个处于空闲状态的协程时,可以按照预设顺序一次将各个处于空闲状态的协程确定为目标协程,预设顺序的具体内容不做限定,例如可以为各个协程的编号顺序,或者可以为各个协程转为空闲状态的时间先后顺序。
进一步,本实施例并不限定目标协程的检测方式,即并不限定如何确定协程是否处于空闲状态。在一种可行的实施方式中,可以存在多个分别与各个协程对应的状态标签,状态标签可以反映各个协程的工作状态,协程可以根据工作情况主动修改该状态标签。在某一协程将已经读取的数据写入完毕后,可以将状态标签修改为表示处于空闲状态的形式,以便被识别为空闲状态。状态标签的具体形式不做限定,例如可以为一个标志位,标志位可以存在多种状态,例如可以用0表示空闲,用1表示读取,用2表示写入。在另一种可行的实施方式中,各个协程与控制协程之间具有通道,可以进行通信,某一协程在写入完毕后,可以向控制协程发送写入完毕信息,控制协程在接收到该协程发送的写入完毕信息后,确定其处于空闲状态。在检测到目标协程后,可以利用目标协程继续读取数据,以便在其他协程读取数据或写入数据时利用目标协程进行并行处理。在利用目标协程读取数据之前,需要修改目标虚拟机对应的偏移信息。
目标虚拟机即为需要被备份的虚拟机,其具体形式不做限定,对目标虚拟机进行备份即为对目标虚拟机中数据进行备份。偏移信息与目标虚拟机相对应,用于划分目标虚拟机中已被备份的数据和未被备份的数据,其具体形式不做限定。在想要利用目标协程读取数据之前,需要先更新偏移信息。由于目标协程读取数据需要一定的时间,在目标协程读取数据时,可能有其他的协程转变为空闲状态,被确定为新的目标协程。若未修改偏移信息,则新的目标协程与旧的目标协程将读取到相同的数据,造成数据的重复读取,也会导致数据写入错误。相关技术仅利用单个线程进行数据读写,不会出现上述问题,而本申请利用多个协程进行数据读写,则可能会出现上述问题。为了解决上述问题,本实施例在检测到目标协程后,在利用目标协程读取数据前,先对偏移信息进行修改,在修改后再利用目标协程读取数据。虚拟机备份一般按照存储地址由低到高或由高到低的连续的方式进行,因此偏移信息可以为游标形式,记录已备份的数据和未备份的数据的连接位置。需要说明的是,各个协程读取数据的能力可以相同也可以不同,即各个协程在每次读取数据时,可以读取相同大小的数据,或者可以读取不同大小的数据。因此在对偏移信息进行修改时,可以进行相同的修改,例如将偏移信息在原有基础上增大预设大小,例如256KB;或者可以进行不同的修改,例如可以根据协程与读取阈值的对应关系确定目标协程对应的目标读取阈值,并将偏移信息在原有基础上增大目标读取阈值,例如256KB或512KB。在一种优选的实施方式中,各个协程对应的读取阈值均相同,且该读取阈值与数据修改的粒度相同。例如当对虚拟机中的数据进行修改时,以256KB为单位进行修改,则协程在读取数据时,可以一次读取256KB的数据,以便在需要时(例如进行增量备份时)进行准确地数据备份,避免对未发生变化的数据进行备份,提高备份速度。
S102:基于偏移信息,利用目标协程读取对应的待备份数据。
在对偏移信息修改后,可以利用目标协程读取目标协程对应的待备份数据。待备份数据为目标虚拟机中未被备份的数据中的一部分,其具体内容不做限定。需要说明的是,目标协程在读取待备份数据时,需要基于偏移信息执行,由于在S101步骤中已经对偏移信息进行了修改,因此存在一部分已经被偏移信息记录为已经被备份的,但是实际并没有被备份的数据。基于偏移信息可以确定该部分数据,该部分数据即为待备份数据。具体的,本实施例并不限定待备份数据的具体确定方式,在一种可行的实施方式中,还存在与偏移信息对应的历史偏移信息,历史偏移信息用于记录偏移信息在每次更新前的值,若偏移信息发生更新,则可以更新历史偏移信息。在确定待备份数据时,可以直接利将历史偏移信息和偏移信息中间的数据确定为待备份数据。在另一种可行的实施方式中,可以根据协程对应的读取阈值和偏移信息确定待备份数据。在确定待备份数据时,以偏移信息为基点向已被备份的数据的方向以读取阈值为单位进行划分,则得到的数据区间即对应于待备份数据。例如当偏移信息为512KB时,读取阈值为256KB时,以512KB为基点向0KB方向划分256KB,则得到的数据区间为[257KB,512KB],则待备份数据即为第257KB到第512KB的数据。在确定待备份数据后,可以利用目标协程读取待备份数据,待备份数据的读取方式本实施例不做限定,可以参考相关技术。在利用目标协程读取待备份数据的过程中,其他协程可以读取数据,或者可以写入数据,或者可以在写入数据后处于空闲状态,并被确定为新的目标协程执行S101步骤。即在执行S102步骤时,还可以并行执行S101步骤或S103步骤,各个协程之间相互独立,互不影响。
S103:利用目标协程将待备份数据写入目标位置。
在对待备份数据读取完毕后,可以利用目标协程将待备份数据写入待备份数据对应的目标位置。可以理解的是,目标位置与待备份数据相对应,其具体为待备份数据的写入位置,例如可以为待备份数据在备份镜像中的相对位置,备份镜像为目标虚拟机的镜像。本实施例并不限定备份镜像的具体生成方式,例如可以创建初始备份镜像,并将该该初始备份镜像挂载为nbd设备,将该nbd设备(Network Block Device,网络块设备)确定为备份镜像。本实施例并不限定目标位置的具体确定方式,在一种可行的实施方式中,由于在利用目标协程读取待备份数据时,基于偏移数据确定了待备份数据,而偏移数据用于划分已被备份的数据和未被备份的数据,因此在确定待备份数据时同样可以确定该待备份数据在目标虚拟机全部数据中的位置,将该位置对应到备份镜像中,即可得到目标位置。在确定目标位置之后可以利用目标协程将待备份数据写入到目标位置处,完成对待备份数据的备份。待备份数据的具体写入方式本实施例不做限定,可以参考相关技术。与S102步骤相似的,在利用目标协程写入待备份数据时,其他协程可以读取数据,或者可以写入数据,或者可以在写入数据后处于空闲状态,并被确定为新的目标协程。
应用本申请实施例提供的虚拟机备份方法,在对目标虚拟机进行备份时,在单个线程中建立多个用于进行数据读写的协程,目标协程可以为其中的任意一个处于空闲状态的协程。在检测到目标协程后,说明有协程处于空闲状态,想要读取数据,因此修改偏移信息。偏移信息用于划分已被读取的数据和未被读取的数据,在目标协程未真正开始读取数据前先修改偏移信息,可以避免目标协程读取数据时,其他的协程同样来读取数据而造成的数据读取重复的问题。在修改后利用目标协程读取其对应的待备份数据,在目标协程读取待备份数据的过程中,其他的协程同样可以执行上述的步骤进行数据读取;或者可以写入已读取的数据,实现虚拟机备份的并发处理,提高数据读取和写入的速度,进而提高虚拟机备份的速度。相应的,目标协程在将待备份数据读取完毕后,将其写入对应的目标位置。在目标协程写入数据的过程中,其他的协程可以进行数据的读取或写入。多个协程并发处理,大大提高了数据读取速度和数据写入速度,提高了虚拟机备份的速度,减少了备份时间,解决了相关技术存在的备份时间较长,备份效率较低的问题。
基于上述实施例,本实施例将对上述实施例中的若干步骤进行具体的阐述。其中,在更新偏移信息前,还可以判断对目标虚拟机的备份是否完成。具体的,S101步骤中,在检测到目标协程之后,在更新目标虚拟机对应的偏移信息之前,还可以包括:
步骤11:判断偏移信息是否小于目标虚拟机对应的数据体积。
由于目标虚拟机的数据体积有限,因此需要在对目标虚拟机备份完毕后停止进行数据更新。因此在检测到目标协程后,先判断偏移信息是否小于目标虚拟机对应的数据体积。数据体积为目标虚拟机中所有数据的总体积,若偏移信息小于数据体积,则说明还存在部分数据没有被备份,这种情况下可以进入步骤13;若偏移信息不小于数据体积,则说明目标虚拟机已经全部备份完毕,这种情况下可以进入步骤12。
步骤12:若不小于目标虚拟机对应的数据体积,则停止更新偏移信息。
若偏移信息不小于目标虚拟机的数据体积,则目标虚拟机的全部数据均被备份,此时可以通过停止更新偏移信息的方式停止虚拟机备份过程。具体的,由于未更新偏移信息,因此不存在待备份数据,进而无法对待备份数据进行读取和写入。
可以理解的是,上述方式仅为停止虚拟机备份过程的一种具体方式,在实际应用中,还可以采用其他方式停止虚拟机备份过程。例如可以在确定偏移信息不小于数据体积后将目标协程关闭,以关闭协程的方式停止虚拟机备份过程。
步骤13:若小于目标虚拟机对应的数据体积,则执行更新目标虚拟机对应的偏移信息的步骤。
若偏移信息小于数据体积,说明仍然存在部分数据未被备份,因此可以执行更新目标虚拟机对应的偏移信息的步骤,以便利用目标协程对目标虚拟机进行备份。
应用本申请实施例提供的虚拟机备份方法,目标虚拟机的数据可能并不是单独存放,而是与其他虚拟机的数据等其他数据相连,例如逻辑地址上的相连,因此在利用多个协程进行目标虚拟机的备份时,可以利用偏移信息判断是否完成了对目标虚拟机的备份,具体方式即为将偏移信息与数据体积进行比较。在偏移信息不小于数据体积时,说明目标虚拟机的全部数据均已被备份,因此可以通过停止更新偏移信息的方式结束对目标虚拟机的更新,避免将其他数据当作目标虚拟机的数据,造成数据备份错误。
基于上述实施例,在一种可能的实施方式中,对目标虚拟机的备份为全量备份,即对目标虚拟机对应的全部数据均进行备份。在这种情况下,更新目标虚拟机对应的偏移信息的步骤,可以包括:
步骤21:若目标虚拟机处于全量备份状态,则确定目标协程的目标读取阈值。
在更新偏移信息前,可以先判断目标虚拟机的备份状态。若目标虚拟机处于全量备份状态,即表明对目标虚拟机的备份为全量备份,本实施例并不限定对目标虚拟机的状态的具体确认方式。例如可以设定状态标志位,利用状态标志位对目标虚拟机的状态进行标识,状态标志位可以采用数字形式,或者可以采用其他字符形式。例如当状态标志位为1时,表明目标虚拟机为全量备份状态。目标读取阈值即为目标协程对应的数据读取单位,其具体大小不做限定。
步骤22:基于目标读取阈值对偏移信息进行更新。
在确定目标虚拟机为全量备份状态后,基于目标读取阈值对偏移信息进行更新即可。由于全部数据均需要备份,因此仅需要对偏移信息按照备份的顺序进行更新。可以理解的是,若目标虚拟机第一次进行备份,则需要进行全量备份。
在另一种可能的实施方式中,对目标虚拟机的备份为增量备份,即并不对全部数据进行备份,而是对其中部分数据进行备份。该部分数据的具体内容不做限定,其一般为在上次备份后发生变化的数据,例如新增的数据或被修改的数据。在这种情况下,更新目标虚拟机对应的偏移信息的步骤,可以包括:
步骤31:若目标虚拟机处于增量备份状态,则确定目标协程的目标读取阈值。
在目标虚拟机处于增量备份状态的情况下,同样需要确定目标协程对应的目标读取阈值。与全量备份不同的是,在增量备份时,还需要基于增量位图(bitmap)对偏移信息进行更新。
步骤32:基于目标读取阈值和目标虚拟机对应的增量位图,对偏移信息进行更新。
具体的,增量位图用于记录目标虚拟机中需要备份的数据,例如在上次备份过后被修改过的数据,或者可以为上次备份过后新增的数据。可以理解的是,增量备份一般为非首次备份,在首次备份后,为了减少后续备份过程所需的时间,可以不对未发生变化的数据进行备份,仅对发生过变化的数据进行备份,因此需要利用增量位图对需要备份的数据进行记录。在一种优选的实施方式中,增量位图中包括多个标志位,每个标志位对应于一个单位的数据,一个单位的数据可以被称为一簇数据,其同样是数据修改的最小单元。各个协程的目标读取阈值与一簇数据的大小相同,这样可以实现仅对发生变化的数据进行备份的效果。
在更新偏移信息时需要基于目标读取阈值和增量位图进行,即根据增量位图确定需要更新的数据部分,并在确定后从中提取目标读取阈值大小的数据作为待备份数据,并基于此对偏移信息进行更新。例如,当更新前的偏移信息为256KB时,增量位图中的每个标志位对应256KB的数据,增量位图为[1,0,1,1,…],在更新偏移信息时,先利用增量位图确定需要备份的数据。具体的,可以利用偏移信息在增量位图中定位,例如偏移信息为256KB时,说明从增量位图中第二位开始进行是否需要备份的判断。由于第二位为0,因此可以确定第257KB到第512KB的数据不需要备份,第513KB到第768KB的数据需要备份,目标读取阈值为256KB,因此可以将偏移信息更新为768KB。在另一种情况中,目标读取阈值为512KB,此时可以将偏移信息更新为1024KB。
在另一种实施方式中,还可以在偏移信息更新完毕后对增量位图进行更新,例如增量位图为[1,0,1,1,…],在第一次更新偏移信息时将其由0更新为256KB,此时可以将增量位图更新为[0,0,1,1,…]。在下一次更新偏移信息时,可以不需要利用当前的偏移信息在增量位图中定位,而是可以直接从增量位图的首位进行筛选,检测到第3位为1,且目标读取阈值为256KB,则可以将偏移信息更新为768KB。在另一种情况中,目标读取阈值为512KB,此时可以将偏移信息更新为1024KB。
应用本申请实施例提供的虚拟机备份方法,可以在更新偏移信息时确定目标虚拟机的备份状态,即判断目标虚拟机为全量备份状态或增量备份状态。根据目标虚拟机的状态选择合适的方式进行偏移信息的更新,进而满足全量备份或增量备份的需求。
基于上述实施例,在采用增量备份的过程中可以对增量位图进行更新。在这种情况下,可以对增量位图进行备份,以便在备份错误时进行数据回滚。具体的,还可以包括:
步骤41:对所述增量位图进行备份,得到备份位图。
本实施例并不限定对增量位图进行备份的具体方式,例如可以将增量位图拷贝一份后,生成该拷贝得到的位图与增量位图之间的对应关系,在对应关系生成并记录后当拷贝得到的位图确定为备份位图。需要说明的是,步骤41应当在备份开始前执行,即在增量位图没有更新前对其进行备份。
步骤42:若检测到虚拟机备份错误,则利用所述备份位图进行数据回滚操作。
需要说明的是,本实施例并不限定是否发生虚拟机备份错误的检测方式,例如可以检测各个协程是否正常运行,若存在协程没有正常运行,例如无法正常读取数据或写入数据,则确定发生虚拟机备份错误。在检测到虚拟机备份错误后,则需要重新开始备份,由于增量位图在先前的备份过程中已经被更新过,其中的某些标志位已经被修改,因此继续利用增量位图进行备份则会导致数据不一致问题。为了避免上述问题,可以利用先前得到的备份位图进行数据回滚,即对增量位图进行数据回滚,使增量位图恢复被更新前的状态,以便重新利用增量位图进行虚拟机备份。而备份位图还可以继续保留,以便在再次发生虚拟机备份错误时再次进行数据回滚操作。
需要说明的是,在检测到虚拟机备份错误后进行数据回滚实际上属于一种虚拟机备份控制操作。在其他可行的实施方式中,还可以协程运行状态监测、虚拟机备份取消、备份限速等控制操作,本实施例对此不做限定。
应用本申请实施例提供的虚拟机备份方法,可以在增量备份前对增量位图进行备份,以便在发生虚拟机备份错误后,利用备份位图对增量位图进行数据回滚操作,重新利用增量位图进行虚拟机备份,避免出现数据不一致问题。
基于上述实施例,在一种可行的实施方式中,在待备份数据写入目标位置时,可以将其写入缓冲区,并利用写入协程将待备份数据写入目标位置,以实现待备份数据的读写分离。具体的,S103步骤可以包括:
步骤51:利用目标协程将待备份数据写入缓冲区。
缓冲区具体可以为环形缓冲区,其可以位于缓存中,以便进行快速读写。目标协程在读取待备份数据后,可以将其写入缓冲区,当其写入缓冲区后即可处于空闲状态,以便重新读取数据。缓冲区中的待备份数据可以由多个写入协程写入,即由多个写入协程将缓冲区中的待备份数据写入到对应的目标位置。写入协程的工作方式与上述的协程的工作方式相同,区别在于写入协程从缓冲区中读数据,向目标位置写数据,而协程从目标虚拟机数据的原始存储位置读数据,向缓冲区写数据。通过将读写进行分离,可以灵活地设置写入协程的数量和协程的数量。
步骤52:若检测到目标写入协程,则判断缓冲区中是否存在目标位置相邻的待备份数据。
需要说明的是,目标写入协程为多个写入协程中任意一个处于空闲状态的写入协程。目标写入协程的具体检测方式可以参考对目标协程的检测方式,本实施例在此不再赘述。在检测到目标写入协程后,可以判断缓冲区中是否存在目标位置相邻的待备份数据。目标位置相邻即为一个待备份数据对应的目标位置与另一个待备份数据对应的目标位置首尾相连,例如当其中一个目标位置0KB到256KB,另一个目标位置为257KB到512KB,则这两个目标位置即为相邻。
步骤53:若存在目标位置相邻的待备份数据,则生成对应的合并数据,并利用目标写入协程将合并数据写入目标位置。
若存在目标位置相邻的待备份数据,则可以将其进行合并,生成对应的合并数据,并利用目标写入协程将合并数据写入目标位置。通过对待备份数据进行合并,可以将小IO合并为大IO,大IO的写入速度更快,因此使得待备份数据的写入速度更快。通过提高写入速度,可以在虚拟机备份速度受到写入速度限制的情况下进一步提高虚拟机备份速度,减少虚拟机备份所需的时间。
步骤54:若不存在目标位置相邻的待备份数据,则利用目标写入协程将缓冲区内的任意一个待备份数据写入目标位置。
若不存在目标位置相邻的待备份数据,则可以利用目标写入协程将任意一个待备份数据写入目标位置,完成对待备份数据的写入。
应用本申请实施例提供的虚拟机备份方法,可以利用缓冲区和写入协程对虚拟机备份过程进行读写分离,并在检测到存在目标位置相邻的待备份数据时生成对应的合并数据,以便提高写入速度,进而提高虚拟机备份速度。
基于上述实施例,在对目标虚拟机进行备份时,可能会获取到对目标虚拟机进行数据修改的修改指令,若该修改指令对应的数据已经被备份,则可以直接执行;若其对应的数据还未被备份,为了保证数据一致性,该部分数据会被锁定,无法写入,因此修改指令无法被执行,也无法对该修改指令进行响应,造成响应时间过长的问题。为了解决上述问题,请参考图2,图2为本申请实施例提供的一种修改指令执行过程流程图,包括:
S201:获取与目标待备份数据对应的修改指令。
修改指令具体可以为数据更新指令,即对目标待备份数据进行更新,此时目标待备份数据为目标虚拟机已有的但还未被备份过的数据。在另一种可能的情况中,修改指令具体为数据新增指令,此时目标待备份数据为目标虚拟机还未拥有的数据,因此该数据必然不可能被备份过。
S202:生成目标待备份数据对应的二次备份数据。
S203:根据修改指令对二次备份数据进行修改,并响应修改指令。
在获取到修改指令后,为了防止出现数据不一致问题无法直接对其执行,此时可以生成目标待备份数据对应的二次备份数据,并在二次备份数据上执行修改指令,即根据修改指令对二次备份数据进行修改。具体的,当目标待备份数据为目标虚拟机已有的但还未被备份过的数据时,其对应的二次备份数据即为该数据本身,即将该数据复制一份后,在复制得到的二次备份数据上执行修改指令。当目标待备份数据为目标虚拟机还未拥有的数据时,其对应的二次备份数据即为与该数据大小相同的空白数据,根据修改指令对二次备份数据进行修改的过程即为将目标待备份数据写入二次备份数据的过程。在对二次备份数据修改完毕后,可以对修改指令进行响应,避免造成响应时间过长的问题。
S204:在目标虚拟机备份完毕后,利用多个协程将二次备份数据同步至目标虚拟机对应的备份镜像。
在目标虚拟机备份完毕后,可以利用多个协程将二次备份数据同步至备份镜像,彻底完成对修改指令的执行。同步的具体过程本实施例不再赘述,可以参考上述实施例。
应用本申请实施例提供的虚拟机备份方法,可以在获取到针对目标待备份数据的修改指令后在二次备份数据上执行,避免造成响应时间过长和数据不一致的问题,同时在目标虚拟机备份完毕后进行二次备份数据的同步,保证数据的一致性。
经过实测,在利用fio工具(一种IO性能测试工具)进行虚拟机备份测试时,相关技术的数据读取速度为70MB/s,数据写入速度为67MB/s。请参考图3,图3为本申请实施例提供的一种读取效果图。在利用8个IO深度进行虚拟机备份时,即在利用8个协程进行虚拟机备份时,数据读取速度可以达到370MB/s。请参考图4,图4为本申请实施例提供的一种写入效果图。在利用8个IO深度进行虚拟机备份时,数据写入速度可以达到310MB/s。备份速度的提升可以达到4~5倍。请参考表1,表1为虚拟机备份速度与集群读取速度对照表,可以看出,在写入无压力的情况下,采用多深度下(即采用多个协程的情况下)进行虚拟机备份时,备份速度几乎可以达到集群读取速度的上限,可以充分利用集群的性能。
表1备份速度与集群读取速度对照表
基于上述各个实施例,本实施例将说明一个具体的虚拟机备份过程。整体过程为:虚拟机对外提供qmp接口(qemu monitor protocol,通过该接口,可以对虚拟机实例的整个生命周期进行管理),外部创建备份镜像后将备份镜像挂载为nbd设备,然后调用虚拟机的qmp接口触发备份任务。虚拟机进程创建备份任务,读取虚拟机的磁盘数据,并将数据写入nbd设备中,并通过nbd设备的服务端将数据写入备份镜像。具体的,请参考图5,图5为本申请实施例提供的一种初始化过程流程图。在本实施例中可以利用qemu表示虚拟机备份进程,其仅包括一个线程。在进行虚拟机备份之前,可以创建备份镜像,并对其做nbd挂载,以便电子设备对其进行读写,具体创建和挂载过程可以参考相关技术,在此不做赘述。在检测到备份请求后,即当备份请求到来后,可以对bitmap即位图进行相关的初始化操作。例如若为增量备份,该初始化操作可以为生成备份位图;或者若为全量备份,该初始化操作可以为生成对应的新的位图。当然初始化操作还可以为其他内容,本实施例对此不做限定。在初始化结束后,可以对管理结构体BackupBlockJob进行初始化,使原本只适用于单协程的BackupBlockJob适用多协程。具体初始化过程不做限定,例如可以增加协程状态、当前磁盘备份偏移(即偏移信息)、协程锁等信息,用于管理整个备份任务。在一种情况中,初始化后的BackupBlockJob结构体可以如下所示:
在对BackupBlockJob结构体初始化完成后,可以创建备份主协程backup_run,即控制协程,其可以控制整个备份流程,具体可以直接或通过其他协程(例如监控协程)对备份流程进行控制。同时还可以创建sf_backup_bitmap_sync协程对bitmap进行操作。然后创建多个do_backup_co协程,即协程,用于进行具体的读写操作。在创建完成后运行所有协程,为了便于理解,后续将协程称为子协程或备份IO处理协程,开始进行虚拟机备份。创建多个子协程,即do_backup_co协程,只负责IO读写。子协程之间通过BackupBlockJob中的backup_cluster_offs(即偏移信息)指定当前要备份的IO簇地址,各子协程之间可以按顺序提交读IO请求,实现多深度、顺序备份的效果。
请参考图6,图6为本申请实施例提供的一种备份过程中修改指令执行过程流程图。首先在业务IO写函数注册热拷贝协程回调,即在进行虚拟机备份时允许其执行业务IO(即修改指令)。在备份过程中获取到目标虚拟机的写IO请求时,创建热拷贝协程,然后判断写IO请求对应的簇是否已经备份,若已经备份,则可以直接执行IO。若还未备份,则将IO将写的簇数据读出并写入临时文件,即生成对应的二次备份文件,并将hbitmap(即增量位图)标记该部分已备份并在二次备份文件上执行IO。在执行完毕后可以对其进行响应。
请参考图7,图7为本申请实施例提供的一种控制协程流程图。在本实施例中,控制协程即主协程可以通过监控协程对整个备份过程进行监控和控制。或者说,监控协程和主协程共同对整个备份过程进行控制。具体的,在初始化操作执行时,注册业务IO写请求回调函数before_write,以便在备份过程中执行业务IO。初始化hbitmap,即增量位图,其具体为标记备份区域的只读位图。执行监控协程,需要说明的是,图7中的监控协程do_backup_state_monitor_co并不是上述提到的控制协程,其仅用于监视各个协程的工作状态。执行监控协程后等待备份结束并执行监控备份状态,还可以执行限制备份速度等控制操作。具体的,子协程执行过程中,监控协程检测当前备份任务是否有取消操作、计算当前的备份速度并监视其他子协程的状态,还可以设置相关信号变量以通知其他协程执行对应操作。而各个子协程执行过程中,可以将自身的IO状态通过设置相应信号变量的方式通知监控协程,并检测监控协程的相关信号,执行限速操作或及时退出备份。在备份完成后,若备份过程中没有执行业务IO,则在备份结束后可以断开qemu-nbd,即断开挂载的nbd设备,执行backup_complete清理操作,结束虚拟机备份过程。若执行了业务IO,或者在backup_complete清理操作中发现存在临时文件,则可以先将热备过程中临时文件的数据写入备份镜像后断开qemu-nbd,执行backup_complete清理操作。
请参考图8,图8为本申请实施例提供的一种监控协程工作流程图。监控协程do_backup_state_montior_co可以根据控制协程的要求释放协程锁,允许各个备份IO处理协程运行,从而保证主协程已将各个条件初始化成功才进行IO备份。在运行过程中,检测各个子协程(即备份IO处理协程)运行状态是否正常。若正常,则检测是否存在备份任务取消信号,若不存在备份任务取消信号,则检测而所有的子协程是否均工作结束(例如是否均处于空闲状态)。若不是,且若需要进行备份限速,则可以根据备份限速值计算子协程需要暂停多久,并通过对子协程加上协程锁的方式进行备份速度的控制。在上述过程执行完毕后,监控协程可以暂时切出,即暂时停止工作,切出时长即为检测周期,若切出时长为4ms,即检测周期即为4ms。若存在子协程状态出错,或存在备份任务取消信号,或所有的子协程均已工作结束,则可以通知所有子协程退出并等待其执行结束(即成功退出)。然后检测各个子协程最后的执行状态,判断是否成功完成备份,即判断备份是否正常结束,若存在子协程的状态不正常,若为1,即正在运行,则说明任务失败,若均正常,则说明任务正常结束,任务成功。将该结果反馈给主协程backup_run,以便执行后续操作。
具体的,备份取消逻辑,即取消虚拟机备份任务的过程可以为:外部通过调用qmp接口设置备份job状态为cancel(即取消)。监控协程运行过程中检测job的状态(即判断是否检测到备份任务取消信号),检测到取消状态后退出循环,通知子协程退出。子协程循环运行过程中检测监控协程通知退出信号,检测到则子协程退出循环。若子协程运行状态异常,即子协程执行IO操作过程中出现IO错误,则该子协程退出,同时修改子协程对应的子协程状态,标志出现IO异常。监控协程检测到有子协程出现IO异常,则退出循环,通知其他子协程也退出。所有子协程退出后,主协程执行bitmap回滚处理,即利用备份位图对增量位图进行回滚,退出备份任务,备份失败。
进一步,在需要进行备份限速时,监控协程统计当前限速时间窗口内的备份数据量,并计算子协程需要yield(即切出,停止工作)的时间,监控协程在yield前对子协程加协程锁,使其yield达到指定时间。子协程执行IO备份前需要先加协程读锁,加锁成功说明当前监控协程不要求进行限速,可进行IO备份,加锁失败说明当前监控协程通知进行限速,IO备份协程一直yield直到加锁成功,从而实现对备份任务进行限速。限速的目的在于,在某些情况下需要对虚拟机的备份速度进行限速,避免备份过程占用太大的存储性能导致影响虚拟机的正常业务。
请参考图9,图9为本申请实施例提供的一种协程工作流程图。各个do_backup_co协程,即备份IO处理协程在被创立后,等待监控协程开始运行并释放协程锁。首先检测主协程是否通知退出备份,具体可以为主协程通过监控协程发出备份任务取消信号,若检测到则退出并设置子协程状态,以便监控协程判断最终的备份执行结果。若未通知退出,则视图加读锁,若发生限速,则无法成功加锁,若成功加读锁后即可备份偏移信息即backup_cluster_offs以便确定待备份数据。然后修改偏移信息,在修改完毕后确定待备份数据(即当前偏移的数据),对其进行备份,即读取该数据并写入数据。在工作完成后判断磁盘备份是否结束,即判断虚拟机备份是否结束。若结束则退出当前子协程并设置子协程状态,若未结束则重新执行是否退出备份任务的检测。
下面对本申请实施例提供的虚拟机备份装置进行介绍,下文描述的虚拟机备份装置与上文描述的虚拟机备份方法可相互对应参照。
请参考图10,图10为本申请实施例提供的一种虚拟机备份装置的结构示意图,包括:
更新模块110,用于若检测到目标协程,则更新目标虚拟机对应的偏移信息;目标协程为多个协程中任意一个处于空闲状态的协程;
读取模块120,用于基于偏移信息,利用目标协程读取对应的待备份数据;
写入模块130,用于利用目标协程将待备份数据写入目标位置。
可选地,更新模块110,包括:
第一阈值确定单元,用于若目标虚拟机处于全量备份状态,则确定目标协程的目标读取阈值;
第一更新单元,用于基于目标读取阈值对偏移信息进行更新。
可选地,更新模块110,包括:
第二阈值确定单元,用于若目标虚拟机处于增量备份状态,则确定目标协程的目标读取阈值;
第二更新单元,用于基于目标读取阈值和目标虚拟机对应的增量位图,对偏移信息进行更新。
可选地,还包括:
位图备份模块,用于对增量位图进行备份,得到备份位图;
回滚模块,用于若检测到虚拟机备份错误,则利用备份位图进行数据回滚操作。
可选地,还包括:
修改指令获取模块,用于获取与目标待备份数据对应的修改指令;
二次备份模块,用于生成目标待备份数据对应的二次备份数据;
修改指令执行模块,用于根据修改指令对二次备份数据进行修改,并响应修改指令;
同步模块,用于在目标虚拟机备份完毕后,利用多个协程将二次备份数据同步至目标虚拟机对应的备份镜像。
可选地,还包括:
体积判断模块用于判断偏移信息是否小于目标虚拟机对应的数据体积;
停止更新模块,用于若不小于目标虚拟机对应的数据体积,则停止更新偏移信息;
相应的,更新模块110为若检测到目标协程,且偏移信息小于目标虚拟机对应的数据体积,则更新目标虚拟机对应的偏移信息的模块。
可选地,写入模块130,包括:
缓冲区写入单元,用于利用目标协程将待备份数据写入缓冲区;
相邻判断单元,用于若检测到目标写入协程,则判断缓冲区中是否存在目标位置相邻的待备份数据;目标写入协程为多个写入协程中任意一个处于空闲状态的写入协程;
合并写入单元,用于若存在目标位置相邻的待备份数据,则生成对应的合并数据,并利用目标写入协程将合并数据写入目标位置;
直接写入单元,用于若不存在目标位置相邻的待备份数据,则利用目标写入协程将缓冲区内的任意一个待备份数据写入目标位置。
下面对本申请实施例提供的电子设备进行介绍,下文描述的电子设备与上文描述的虚拟机备份方法可相互对应参照。
请参考图11,图11为本申请实施例提供的一种电子设备的结构示意图。其中电子设备100可以包括处理器101和存储器102,还可以进一步包括多媒体组件103、信息输入/信息输出(I/O)接口104以及通信组件105中的一种或多种。
其中,处理器101用于控制电子设备100的整体操作,以完成上述的虚拟机备份方法中的全部或部分步骤;存储器102用于存储各种类型的数据以支持在电子设备100的操作,这些数据例如可以包括用于在该电子设备100上操作的任何应用程序或方法的指令,以及应用程序相关的数据。该存储器102可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,例如静态随机存取存储器(Static Random Access Memory,SRAM)、电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、只读存储器(Read-OnlyMemory,ROM)、磁存储器、快闪存储器、磁盘或光盘中的一种或多种。
多媒体组件103可以包括屏幕和音频组件。其中屏幕例如可以是触摸屏,音频组件用于输出和/或输入音频信号。例如,音频组件可以包括一个麦克风,麦克风用于接收外部音频信号。所接收的音频信号可以被进一步存储在存储器102或通过通信组件105发送。音频组件还包括至少一个扬声器,用于输出音频信号。I/O接口104为处理器101和其他接口模块之间提供接口,上述其他接口模块可以是键盘,鼠标,按钮等。这些按钮可以是虚拟按钮或者实体按钮。通信组件105用于电子设备100与其他设备之间进行有线或无线通信。无线通信,例如Wi-Fi,蓝牙,近场通信(Near Field Communication,简称NFC),2G、3G或4G,或它们中的一种或几种的组合,因此相应的该通信组件105可以包括:Wi-Fi部件,蓝牙部件,NFC部件。
电子设备100可以被一个或多个应用专用集成电路(Application SpecificIntegrated Circuit,简称ASIC)、数字信号处理器(Digital Signal Processor,简称DSP)、数字信号处理设备(Digital Signal Processing Device,简称DSPD)、可编程逻辑器件(Programmable Logic Device,简称PLD)、现场可编程门阵列(Field ProgrammableGate Array,简称FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述实施例给出的虚拟机备份方法。
下面对本申请实施例提供的计算机可读存储介质进行介绍,下文描述的计算机可读存储介质与上文描述的虚拟机备份方法可相互对应参照。
本申请还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述的虚拟机备份方法的步骤。
该计算机可读存储介质可以包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本领域技术人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应该认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系属于仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语包括、包含或者其他任何变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
机译: 数据库信息备份方法和恢复方法,电子设备和计算机可读存储介质
机译: 视图处理方法和装置,电子设备和计算机可读存储介质,图像处理方法和装置,电子设备和计算机可读存储介质
机译: 虚拟机,电子设备和非暂时性计算机可读存储介质的通信方法