发明内容
本申请旨在至少解决相关技术中的技术问题之一。
本申请实施例提供一种应用于分布式系统的延迟加载方法及装置,至少能够提高热点数据块的读取效率,从而降低虚拟机启动时的读写延时。
本申请采用如下技术方案。
一种应用于分布式系统的延迟加载方法,包括:
根据来自块设备主节点的下载子块的请求,从镜像中心下载虚拟机镜像的数据块到相应的快照子块;
在所述下载的过程中,通过分析所述快照子块中数据块的读取情况,确定所述快照子块的热点数据块,并将所述热点数据块发送至至少一个缓存服务节点。
其中,所述通过分析所述快照子块中数据块的读取情况,确定所述快照子块的热点数据块,包括:记录延迟加载期间所述快照子块中数据块的读取次数和读取频率中至少之一;根据所述快照子块中数据块的读取次数和读取频率中至少之一,确定延迟加载期间所述快照子块的热点数据块。
其中,所述根据所述快照子块中数据块的读取次数和读取频率中至少之一,确定延迟加载期间所述快照子块的热点数据块,至少包括如下之一:
将所述快照子块中数据块的读取次数与预先设定的读取次数阈值比较,所述读取次数超过所述读取次数阈值时,确定所述数据块为热点数据块;
将所述快照子块中数据块的读取频率与预先设定的读取频率阈值比较,所述读取频率超过所述读取频率阈值时,确定所述数据块为热点数据块;
将所述快照子块中数据块的读取次数与预先设定的读取次数阈值比较,并将所述快照子块中数据块的读取频率与预先设定的读取频率阈值比较,所述读取次数超过所述读取次数阈值且所述读取频率超过所述读取频率阈值时,确定所述数据块为热点数据块。
其中,所述将所述热点数据块发送至至少一个缓存服务节点,包括:根据所述快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法为所述快照子块分配至少一个缓存服务节点,并将所述快照子块的热点数据块送至所述至少一个缓存服务节点。
其中,所述方法还包括:接收到来自块设备服务节点的针对所述热点数据块的读请求时,至少向所述块设备服务节点返回对应所述热点数据块的第一标识,所述第一标识表示所述热点数据块已被发送至缓存服务节点,以便所述块设备服务节点后续向所述至少一个缓存服务节点获取相应快照子块的热点数据块。
一种应用于分布式系统的延迟加载装置,包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行上述延迟加载方法的步骤。
一种应用于分布式系统的延迟加载方法,包括:
接收块设备主节点发送的子块传输请求;
根据所述子块传输请求,从至少一个缓存服务节点获取相应快照子块的热点数据块,并从快照服务节点获取相应快照子块中除所述热点数据块之外的数据块,以获取到所述快照子块的所有数据块;
将所述快照子块的所有数据块共享至相应虚拟机块设备的子块。
其中,所述从至少一个缓存服务节点获取相应快照子块的热点数据块之前,还包括:在接收到来自所述快照服务节点的第一标识之后,直接向所述至少一个缓存服务节点请求相应的热点数据块,所述第一标识表示所述热点数据块已被发送至缓存服务节点。
其中,所述从至少一个缓存服务节点获取相应快照子块的热点数据块之前,还包括:向所述快照服务节点请求所述热点数据块,并接收来自所述快照服务节点的所述第一标识。
其中,所述从至少一个缓存服务节点获取相应快照子块的热点数据块,包括:根据所述快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法确定对应所述快照子块的至少一个缓存服务节点,并向所述至少一个缓存服务节点获取所述快照子块的热点数据块。
一种应用于分布式系统的延迟加载装置,包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行上述延迟加载方法的步骤。
一种应用于分布式系统的延迟加载方法,包括:
将来自至少一个快照服务节点的至少一个快照子块的热点数据块缓存在内存;
接收来自至少一个块设备服务节点的读请求,从内存中读取相应快照子块的热点数据块并返回给所述至少一个块设备服务节点。
其中,所述将来自至少一个快照服务节点的至少一个快照子块的热点数据块缓存在内存,包括:
利用预先设置的缓存容器将所述热点数据块缓存;
其中,所述缓存容器为预先分配的预定大小的内存缓存区。
其中,所述从内存中读取相应快照子块的热点数据块并返回给所述至少一个块设备服务节点之后,还包括:接收来自块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。
一种应用于分布式系统的延迟加载装置,包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行上述延迟加载方法的步骤。
一种应用于分布式系统的延迟加载方法,包括:
分布式的快照服务节点分别从镜像中心下载虚拟机镜像的数据块到相应的快照子块;
在所述下载虚拟机镜像的过程中,分布式的快照服务节点分别确定相应快照子块的热点数据块,并将所述热点数据块分发至分布式的缓存服务节点;
所述下载虚拟机镜像完成后,分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,以将相应快照子块的所有数据块共享至相应虚拟机块设备的子块;
其中,所述分布式的快照服务节点分别确定相应快照子块的热点数据块,包括:所述分布式的快照服务节点分别记录延迟加载期间所述快照子块中数据块的读取次数和读取频率中至少之一;并根据所述快照子块中数据块的读取次数和读取频率中至少之一,确定延迟加载期间所述快照子块的热点数据块。
其中,所述将所述热点数据块分发至分布式的缓存服务节点,包括:所述分布式的快照服务节点分别根据相应快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法为相应快照子块分配至少一个缓存服务节点,并将相应快照子块的热点数据块送至所述至少一个缓存服务节点。
其中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,包括:分布式的块设备服务节点分别在接收到来自所述分布式的快照服务节点的第一标识之后,直接向分布式的缓存服务节点请求相应快照子块的热点数据块,所述第一标识表示所述快照子块的热点数据块已被发送至缓存服务节点。
其中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块之前,还包括:分布式的块设备服务节点分别向分布式的快照服务节点请求相应快照子块的热点数据块,分布式的快照服务节点至少向所述分布式的块设备服务节点返回对应所述热点数据块的所述第一标识,以便所述分布式的块设备服务节点后续向分布式的缓存服务节点获取相应快照子块的热点数据块。
其中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,包括:分布式的块设备服务节点分别根据相应快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法确定相应快照子块的至少一个缓存服务节点,并向该至少一个缓存服务节点获取相应快照子块的热点数据块。
其中,所述将所述热点数据块分发至分布式的缓存服务节点之后,还包括:分布式的缓存服务节点分别将来自分布式的快照服务节点的热点数据块缓存在内存;所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,包括:分布式的缓存服务节点分别接收来自分布式的块设备服务节点的读请求,从内存中读取相应快照子块的热点数据块并返回给分布式的块设备服务节点。
其中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块之后,还包括:分布式的缓存服务节点分别接收来自块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。
一种分布式系统,包括:
分布式的缓存服务节点,用于实现虚拟机镜像中热点数据块的分布式缓存;
分布式的快照服务节点,用于从镜像中心下载虚拟机镜像的数据块到相应的快照子块;在所述下载虚拟机镜像的过程中,确定相应快照子块的热点数据块,并将所述热点数据块分发至所述分布式的缓存服务节点;
分布式的块设备服务节点,用于所述下载虚拟机镜像完成后,向所述分布式的缓存服务节点获取相应快照子块的热点数据块,以将相应快照子块的所有数据块共享至相应虚拟机块设备。
其中,还包括:
块设备主节点,用于向所述分布式的快照服务节点发送下载子块的请求;以及,用于向所述分布式的块设备服务节点发送子块传输请求;
所述分布式的快照服务节点,具体用于在接收到所述下载子块的请求时,从镜像中心下载虚拟机镜像的数据块到相应的快照子块;
所述分布式的块设备服务节点,具体用于在接收到所述子块传输请求时,向所述分布式的缓存服务节点获取相应快照子块的热点数据块。
其中,所述块设备主节点,还用于在所述分布式的块设备服务节点将所述虚拟机镜像的所有数据块共享至虚拟机块设备后,向所述分布式的缓存服务节点发送通知;所述分布式的缓存服务节点,还用于接收来自所述块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述第一种延迟加载方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述第二种延迟加载方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述第三种所述延迟加载方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述第四种延迟加载方法的步骤。
本申请包括以下优点:
本发明实施例中,通过将快照子块的数据切分成小的数据块,并将数据块分配到缓存服务节点,由该缓存服务节点来处理该数据块的读取请求,从而将单点的大批量数据读取分散到存储集群内的多个缓存服务节点上去,提高了大批量数据读取的并发能力,从而降低虚拟机启动时的读写延时,使得大量虚拟机同时启动的过程能够更快完成。
当然,实施本申请的任一产品必不一定需要同时达到以上所述的所有优点。
具体实施方式
下面将结合附图及实施例对本申请的技术方案进行更详细的说明。
需要说明的是,如果不冲突,本申请实施例以及实施例中的各个特征可以相互结合,均在本申请的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在一个典型的配置中,客户端或服务器的计算设备可包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存(memory)。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。内存可能包括模块1,模块2,……,模块N(N为大于2的整数)。
计算机可读介质包括永久性和非永久性、可移动和非可移动存储介质。存储介质可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM),快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本文术语解释如下:
虚拟机块设备(block device),也可称为虚拟机磁盘或块设备,是利用物理机器或其集群提供的物理磁盘资源形成的虚拟磁盘。
日志结构块设备(LSBD,log structured block device),也可称为日志结构的虚拟机磁盘,是基于日志方式构建的虚拟机块设备。
快照(Snapshot),也可称为磁盘快照,本文所述快照均是指虚拟机块设备或其子块的快照。
硬链接技术(HardLink),用于多文件之间共享数据。
磁盘镜像,用于以延迟加载方式创建虚拟机磁盘(即虚拟机块设备)的快照。
延迟加载,虚拟机启动时磁盘的数据从一个磁盘快照上缓慢加载,无需加载完成,虚拟机就可以运行。
镜像中心,负责存储和管理虚拟机镜像的存储系统。
本申请可适用于存储计算分离的云计算架构。图1为本申请所适用的示例性云计算架构示意图。如图1所示,该存储计算分离的云计算架构可以包括块设备存储集群(EBS,Elastic Block Sevice)、镜像中心(Image Center)存储集群和计算集群。
其中,计算集群提供虚拟机(VM)资源,计算集群可以包括多个计算节点和交换机,每个计算节点可以为多个虚拟机资源提供物理资源。块设备存储集群(EBS,Elastic BlockSevice)负责提供虚拟机块设备的存储资源,可以包括交换机和多个存储节点,每个存储节点可为多个虚拟机块设备(即磁盘(Disk))提供物理资源;镜像中心存储集群负责存储磁盘镜像(Image),可以包括交换机和多个存储节点,每个存储节点可以为多个虚拟机块设备的磁盘镜像提供物理资源。实际应用中,每个存储节点、计算节点分别可以通过物理机或其集群实现。这里,磁盘镜像被分成相同大小的数据块(block),并作为延迟加载(lazyload)的单元,数据块越小,延迟加载的效果越好。当虚拟机启动时,虚拟机需要读写某个数据块时,如果该数据块还没有被加载,那么虚拟机需要从镜像中心存储集群读取磁盘镜像内快照的该数据块并写入磁盘中,也就是从磁盘镜像启动虚拟机。
如图2所示,磁盘镜像的数据被分成等长的数据块(block),每个数据块按照顺序被分配一个序号(BlockIndex)(即1、2、……、M,M为不小于2的整数),这些数据块分别对应虚拟机块设备的相应数据块,磁盘镜像延迟加载的过程中镜像中心以数据块为存储单位。
本申请所述的虚拟机块设备可切分为多个子块。具体来讲,该虚拟机块设备可以按照逻辑区块地址(LBA,Logical Block Address)切分为多个子块(segment),每个子块存放相应逻辑区块地址区间的数据块;每个子块包括多个数据文件,每个子块中的数据块会被分配到这些数据文件以进行保存。举例来说,该虚拟机块设备可以为下文所述的日志结构块设备。除此之外,该虚拟机块设备还可以是其他类型。
一种实现方式中,本申请所述的虚拟机块设备可以为日志结构块设备。该日志结构块设备采用底层分布式存储的扁平化的日志文件(flat log file)保存数据,该扁平化的日志文件只能追加写,不能覆盖写。日志结构块设备被按照逻辑区块地址切分成多个子块,以提升并发处理能力。每个子块中可以保存索引文件(Index file)和数据文件(datafile),索引文件用于存储因子块数据修改而产生的元数据(metadata),描述了数据块(即一段逻辑区块地址的开始和结束)到数据文件的映射关系,数据文件用于存储因子块数据修改而产生的数据(data),每个子块的数据块被分配到这些数据文件中。索引文件和数据文件均为扁平化的日志文件,即一个文件(索引文件和/或数据文件)写完以后就跳转(seal),然后创建下一个新的文件继续写。如图3所示,为日志结构块设备的示例性结构。
本申请所述的快照是指上述虚拟机块设备的快照。虚拟机块设备的快照实质上相当于一个虚拟机块设备,同样包括多个子块,每个子块存储相应逻辑区块地址区间的数据块。快照的子块中同样包含索引文件(index file)和数据文件,快照与虚拟机块设备可通过硬链接技术(hardlink)共享同一个数据文件(data file),快照子块的索引文件可以由虚拟机块设备相应子块的索引文件合并(compation)而成。图4为日志结构块设备及其快照的示例性结构。
本申请中,虚拟机块设备可通过分布式系统管理,该分布式系统可以包括:块设备主节点(Block Master)、分布式的块设备服务节点(Block Server)、分布式的快照服务节点(snapshot server)。其中,块设备主节点负责管理虚拟机块设备的元数据(devicemetadata)和快照的元数据(snapshot metadata)。块设备服务节点负责为虚拟机块设备和快照的子块服务,每个块设备服务节点可以管理一个虚拟机块设备的一个或多个子块,一个虚拟机块设备的一个子块同时只能被一个块设备服务节点管理,快照服务节点负责为快照的子块服务,每个快照服务节点可以管理一个虚拟机块设备快照的一个或多个子块,一个虚拟机块设备快照的一个子块同时只能被一个快照服务节点管理。实际应用中,上述分布式系统可以通过由多个相互耦合的物理机组成的集群实现,块设备主节点、每个块设备服务节点、每个快照服务节点分别可以通过一台物理机或多台相互耦合的物理机实现。
从磁盘镜像启动虚拟机,首先需要将磁盘镜像的数据从镜像中心下载到块设备存储集群(EBS),这个过程就是虚拟机块设备的延迟加载。在延迟加载完成之前,虚拟机块设备的任何一个逻辑区块地址的数据读操作都由负责这个逻辑区块地址延迟加载的服务器来处理。
如果在短时间内从同一个磁盘镜像启动大量虚拟机,这些虚拟机在启动过程中都需要访问同一块磁盘中相同逻辑区块地址的数据,当某些逻辑区块地址的数据成为虚拟机访问的热点数据时,负责这些逻辑区块地址内数据的延迟加载的服务器会受到极大的读数据压力,进而引起单点性能下降,导致虚拟机启动过程中的读写延迟大幅提高,虚拟机读写会产生大量毛刺,以至于影响虚拟机的正常工作。
针对延迟加载过程中大量虚拟机读取同一个逻辑区块地址的数据时因单点读取压力大而造成读写延迟大幅提高的问题,本申请提出了如下技术方案,该技术方案利用分布式缓存机制将单点的大批量数据分散到存储集群内的缓存上,通过这些缓存来实现热点数据的延迟加载,从而解决单点服务器读数据压力过大而导致虚拟机启动时读写延迟大幅提高的问题,提高块设备存储集群的大批量数据读取并发能力,最终使得大量虚拟机同时启动的过程更快完成。
下面对本申请技术方案的实现方式进行说明。
实施例一
一种应用于分布式系统的延迟加载方法,如图5所示,可以包括:
步骤501,根据来自块设备主节点的下载子块的请求,从镜像中心下载虚拟机镜像的数据块到相应的快照子块;
步骤502,在所述下载的过程中,通过分析所述快照子块中数据块的读取情况,确定所述快照子块的热点数据块,并将所述热点数据块发送至至少一个缓存服务节点(CacheServer),以实现所述虚拟机镜像中热点数据的分布式缓存。
本实施例中,从镜像中心下载虚拟机镜像的数据块到相应的快照子块时,采用与镜像数据块相同大小的数据块存入相应的快照子块,以便提高延迟加载期间数据块的读取效率。实际应用中,镜像中心存放的镜像数据块一般为2MB,鉴于此,本实施例中,快照服务节点也将快照子块切分为2MB的存储单位来存放虚拟机镜像的数据块,以提高延迟加载期间数据块的读取效率,进而解决单点服务器读数据压力大的问题。
本实施例的一种实现方式中,所述通过分析所述快照子块中数据块的读取情况,确定所述快照子块的热点数据块,可以包括:记录延迟加载期间所述快照子块中数据块的读取次数和读取频率中至少之一;根据所述快照子块中数据块的读取次数和读取频率中至少之一,确定延迟加载期间所述快照子块的热点数据块。
在上述实现方式中,可以根据预先设定的读取次数阈值与当前记录的读取次数确定相应数据块是否为热点数据块,也可以根据预先设定的读取频率阈值与当前记录的读取频率确定相应数据块是否为热点数据块。
具体的,可以通过如下之一来确定热点数据块:
将所述快照子块中数据块的读取次数与预先设定的读取次数阈值比较,所述读取次数超过所述读取次数阈值时,确定所述数据块为热点数据块;所述读取次数未超过所述读取次数阈值时,则所述数据块不是热点数据块;
将所述快照子块中数据块的读取频率与预先设定的读取频率阈值比较,所述读取频率超过所述读取频率阈值时,确定所述数据块为热点数据块;所述读取频率未超过所述读取频率阈值时,则所述数据块不是热点数据块;
将所述快照子块中数据块的读取次数与预先设定的读取次数阈值比较,并将所述快照子块中数据块的读取频率与预先设定的读取频率阈值比较,所述读取次数超过所述读取次数阈值且所述读取频率超过所述读取频率阈值时,确定所述数据块为热点数据块;所述读取次数未超过所述读取次数阈值或所述读取频率未超过所述读取频率阈值时,则所述数据块不是热点数据块。
实际应用中,上述读取次数是指延迟加载期间一个数据块的累计读取次数,即自延迟加载的开始时刻到最近一次读取时刻的时长内该数据块被块设备服务节点请求的次数;上述读取频率可以是延迟加载期间一个数据块的平均读取频率,即自延迟加载的开始时刻到最近一次读取时刻的时长内该数据块被块设备服务节点请求的频率的平均值。上述读取次数阈值和读取频率阈值分别可以是预先配置的固定值,也可以是客户端提供的预设值,还可以是经过预定算法计算得到的值。对此,本文不予限制。
除上述实现方式之外,还可采用其他方式来确定快照子块中哪些数据块是热点数据块。对此,本文不予限制。
本实施例中,还可以在接收到来自块设备服务节点的针对所述热点数据块的读请求时,至少向所述块设备服务节点返回对应所述热点数据块的第一标识,所述第一标识表示所述热点数据块已被发送至缓存服务节点,以便所述块设备服务节点后续向所述至少一个缓存服务节点获取相应快照子块的热点数据块。
下面以一个示例来详细说明本实施例中确定数据块为热点数据块的示例性实现方式以及第一标识的示例性实现方式。
示例1
比如,数据块在快照服务节点中是否为热点数据的数据结构可以定义为如下:
#DEFINE SNAPSHOT_SEGMENT_BLOCKS 256//注:每个快照子块一共可存256个数据块,共512MB;
#DEFINE SNAPSHOT_BLOCK_REQUEST_THRESHOLD 100_//注:累计读取次数。这个读取次数的阈值可以通过给快照服务节点设置相应的标记(flag)来动态配置。
#DEFINE SNAPSHOT_BLOCK_REQUEST_THRESHOLD_ENABLE true//是否启用累计读取次数检查;
#DEFINE SNAPSHOT_BLOCK_REQUEST_FREQUENCY 16//注:表示快照数据块的读取频率(次/秒),计算从延迟加载开始到最新一次读取的平均读取频率,以该平均读取频率作为该数据块的读取频率。这个读取频率的阈值可以通过给快照服务节点设置相应的标记(flag)来动态配置。
#DEFINE SNAPSHOT_BLOCK_REQUEST_FREQUENCY_ENABLE true//是否启用读取频率检查
struct snapshotserver_block_access_data
{
uint64_t lazyload_start_time;//延迟加载的开始时刻
uint32_t block_id[SNAPSHOT_SEGMENT_BLOCKS];//数据块ID
uint16_t access_count[SNAPSHOT_SEGMENT_BLOCKS];//延迟加载期间的访问次数,如果超过SNAPSHOT_BLOCK_ACCESS_THRESHOLD则成为热点数据;
bool in_cache[SNAPSHOT_SEGMENT_BLOCKS];//当数据块的累计读取次数或(和)读取频率超过对应的阈值、并且快照服务节点成功将数据块发送给缓存服务节点后,该变量被置为true。后续快照服务节点收到该数据块的读请求,发现in_cache为true则返回SNAPSHOT_BLOCK_IN_CACHE给块设备服务节点。
}
其中,SNAPSHOT_BLOCK_IN_CACHE为第一标识的一种示例性表示方式。实际应用中,第一标识还可以其他方式表示,对此,本文不予限制。
本实施例的一种实现方式中,所述将所述热点数据块发送至至少一个缓存服务节点,可以包括:根据所述快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法为所述快照子块分配至少一个缓存服务节点,并将所述快照子块的热点数据块送至所述至少一个缓存服务节点。这样,快照服务节点可以按照分布式一致性哈希(hash)算法将子块的热点数据块分配并发送到特定的缓存服务节点(CacheServer)。
下面一个示例来详细说明按照分布式一致性哈希算法分配缓存服务节点的示例性实现方式。
示例2
本示例中,快照服务节点利用一致性哈希算法来为特定数据块寻找目标缓存服务节点的流程,可以包括:
步骤1,对于快照子块的每个数据块,对快照ID+数据块ID(block ID)按照哈希算法得到一个32位整数的哈希值(key):
本步骤的计算过程举例如下:
Hash(snapshot1+block1)=key1;
Hash(snapshot1+block2)=key2;
Hash(snapshot2+block1)=key3;
……
Hash(snapshotX+blockY)=keyZ。
步骤2,对所有缓存服务节点,对其标识ID(比如,IP地址)按照同样的哈希算法得到一个哈希值(key),每个缓存服务节点将负责一个哈希值区间(key range),该哈希值区间为缓存服务节点自身的哈希值到下一个缓存服务节点的哈希值之间的区间;
本步骤的计算过程举例如下:
Hash(CacheServer0)=keyA;
Hash(CacheServer1)=keyB;
……
Hash(CacheServerY)=keyN;
步骤3,通过查找比较即可得到上面的key1/key2/key3/…/keyZ所对应的缓存服务节点(即数据块落在这个缓存区间)。
如图6所示的示例中,缓存数据块cacheblock2落在缓存服务节点0上,缓存数据块cacheblock0和缓存数据块cacheblockX落在缓存服务节点1上,缓存数据块cacheblock1落在缓存服务节点Y上。其中,X为不小于2的整数,Y为不小于1的整数。这里,缓存数据块即为热点数据块。
一种应用于分布式系统中快照服务节点的延迟加载装置,可以包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行上述延迟加载方法的步骤。
需要说明的是,本实施例所述延迟加载装置的上述结构仅为其基础架构。实际应用中,该延迟加载装置还可包括其他部件,比如,总线、通信电路、输入部件、输出部件等。当然,除此之外,上述延迟加载装置还可包括其他部件。
本实施例中延迟加载装置的具体技术细节可参照上述方法部分。
本实施例中,延迟加载方法及延迟加载装置分别可以通过分布式系统中的快照服务节点来实现。
下面对本实施例的技术效果进行说明。
相关技术中,每个快照服务节点负责从镜像中心下载一个快照子块。快照子块的大小(size)小于虚拟机块设备的子块容量,以增加并行下载速度,例如:虚拟机块设备的子块大小为32GB,快照子块大小为512MB。镜像中心存放的镜像数据块的更小,一般为2MB,一个快照子块会包含256个数据块。每个快照服务节点都有一个线程池,可以同时处理多个快照子块的延迟加载,其中每个子块会按照其子块秘钥(segment key)或子块ID(segmentID)分配给指定的唯一线程,该线程会同时处理子块数据下载和延迟加载的读取请求。对于延迟加载期间来自块设备服务节点的大量并发数据读取请求,该线程也只能将相应请求都保存在队列,逐个依次处理,因此延迟加载期间的读请求处理效率比较低。
而本实施例中,快照服务节点将快照子块的数据切分成小的数据块(大小为2MB),记录每个数据块(大小为2MB)在延迟加载期间的读取次数和/或读取频率,一旦访问读取次数和/或读取频率超过相应的预定阈值(即读取次数阈值或读取频率阈值)即视该数据块为热点数据,快照服务节点将该数据块发送给至少一个缓存服务节点(为使效果更佳,一般为多个缓存服务节点),并将该数据块标记为热点数据块。对于该热点数据块接下来的首次读取,快照服务节点可以在从本地将该热点数据块返回给块设备服务节点的同时附带第一标识(比如,SNAPSHOT_BLOCK_IN_CACHE),以便块设备服务节点收到该第一标识后,后续向相应的至少一个缓存服务节点请求该热点数据块,这样,热点数据块的所有读请求都将直接转发给缓存服务节点而不是发给快照服务节点,从而提高延迟加载期间读请求的处理效率,进而解决延迟加载期间单点读取压力大的问题。
本实施例中,快照服务节点将快照子块的热点数据块分配到至少一个缓存服务节点,由该缓存服务节点来处理该数据块的读取请求,从而降低快照服务节点的压力,提高整个快照数据读取的并发性能。
实施例二
一种应用于分布式系统的延迟加载方法,如图7所示,可以包括:
步骤701,接收块设备主节点发送的子块传输请求;
步骤702,根据所述子块传输请求,从至少一个缓存服务节点获取相应快照子块的热点数据块,并从快照服务节点获取相应快照子块中除所述热点数据块之外的数据块,以获取到所述快照子块的所有数据块;
步骤703,将所述快照子块的所有数据块共享至相应虚拟机块设备的子块。
本实施例的一种实现方式中,所述从至少一个缓存服务节点获取相应快照子块的热点数据块之前,还可以包括:在接收到来自所述快照服务节点的第一标识之后,直接向所述至少一个缓存服务节点请求相应的热点数据块,所述第一标识表示所述热点数据块已被发送至缓存服务节点。这样,块设备服务节点可以通过从快照服务节点获取第一标识来鉴别所请求的数据是否为热点数据块,进而针对热点数据块直接向缓存服务节点请求,不再向快照服务节点请求,从而降低延迟加载期间某些快照服务节点的压力,提高整个延迟加载期间数据读取的效率。
这里,所述从至少一个缓存服务节点获取相应快照子块的热点数据块之前,还可以包括:向所述快照服务节点请求所述热点数据块,并接收来自所述快照服务节点的所述第一标识。这样,块设备服务节点可以在向快照服务节点请求数据块的同时获取到第一标识,数据读取效率更高。
本实施例的一种实现方式中,从所述缓存服务节点获取相应快照子块的热点数据块,可以包括:根据所述快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法确定对应所述快照子块的至少一个缓存服务节点,并向所述至少一个缓存服务节点获取所述快照子块的热点数据块。
实际应用中,块设备服务节点在处理热点数据块的读取请求时根据与实施例一中快照服务节点同样的哈希算法找到相应的缓存服务节点,具体细节可参照实施例一的示例2。
实际应用中,块设备服务节点可以通过定义一个数据结构来处理快照子块在延迟加载期间针对热点数据块的读请求。
比如,用于处理快照子块在延迟加载期间针对热点数据块的读请求的数据结构可以定义为如下:
其中,该数据结构中还保存了用于寻找热点数据块所属的缓存服务节点的哈希值(hash key),这样可以避免同一数据块的每次读请求都重新计算其哈希值,从而进一步提高延迟加载期间读请求的处理效率。
一种应用于分布式系统中块设备服务节点的延迟加载装置,可以包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行本实施例所述延迟加载方法的步骤。
需要说明的是,本实施例所述延迟加载装置的上述结构仅为其基础架构。实际应用中,该延迟加载装置还可包括其他部件,比如,总线、通信电路、输入部件、输出部件等。当然,除此之外,上述延迟加载装置还可包括其他部件。
本实施例中延迟加载装置的具体技术细节可参照上述方法部分。
本实施例中,延迟加载方法及延迟加载装置分别可以通过分布式系统中的块设备服务节点来实现。
实施例三
一种应用于分布式系统的延迟加载方法,如图8所示,可以包括:
步骤801,将来自至少一个快照服务节点的至少一个快照子块的热点数据块缓存在内存;
步骤802,接收来自至少一个块设备服务节点的读请求,从内存中读取相应快照子块的热点数据块并返回给所述至少一个块设备服务节点。
本实施例的一种实现方式中,所述将来自快照服务节点的热点数据块缓存,包括:利用预先设置的缓存容器将所述热点数据块缓存;其中,所述缓存容器为预先分配的预定大小的内存缓存区,该内存缓存区用于存放所述热点数据块。
在上述实现方式中,缓存服务节点设置一种缓存容器(cache container),每个缓存容器预先分配一定大小(比如:1GB)的内存缓存区(buffer)以缓存数据块。在接收到来自快照服务节点的热点数据块后,如果现有的缓存容器都满,缓存服务节点可以初始化新的缓存容器。
比如,对于每个快照的每个数据块,缓存服务节点可以通过一个std::map结构来标识其存放的缓存位置:std::map<cacheserver_cache_block,cacheserver_cache_offset>。
具体的,缓存服务节点可以采用如下方式定义自己缓存的数据块(block)的数据结构:
#DEFINE CACHE_CONTAINER_BLOCKS 512
#DEFINE CACHE_CONTAINER_SIZE(CACHE_CONTAINER_BLOCKS*2*1024*1024)//默认1GB。可以存放CACHE_CONTAINER_BLOCKS个2MB的数据块。
struct cacheserver_cache_container
{
uint16_t container_id;//缓存容器ID
bool cached[CACHE_CONTAINER_BLOCKS];
void*cache_data;//指向一块CACHE_CONTAINER_SIZE大小的内存,每个cacheserver_cache_container在初始化时会一次性申请内存。
}
struct cacheserver_cache_offset
{
uint16_t container_id;
uint16_t offset;//该offset值为0~(CACHE_CONTAINER_BLOCKS-1),标明在该缓存容器里的位置;
}
struct cacheserver_cache_block
{
uint64_t snapshot_id;//数据块所属的快照
uint32_t block_id;//数据块在快照内的ID
}。
本实施例的一种实现方式中,所述从内存中读取相应快照子块的热点数据块并返回给所述块设备服务节点之后,还可以包括:接收来自块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。一般来说,每个缓存服务节点可能缓存一个或多个快照子块的热点数据块,每个快照子块的热点数据块也可能通过一个或多个缓存服务节点来缓存。在某个或某些快照子块中的所有数据块都共享至相应虚拟机块设备的子块之后,块设备主节点可以通知相应的一个或多个缓存服务节点释放这个或这些快照子块的热点数据块,一个或多个缓存服务节点可以根据块设备主节点的通知释放这个或这些快照子块的热点数据块。如此,可以及时释放缓存服务节点的内存,供其他快照子块的热点数据块使用,有利于提高资源利用率。
本实施例中,在分布式系统中部署一组分布式的缓存服务节点,该缓存服务节点是一个分布式缓存组件,通过该缓存服务节点处理延迟加载期间对快照中热点数据块的读取请求,数据临时存放在内存中,没有磁盘读取的IO延时,可提高分布式系统大批量数据并发读取的IO性能。
一种应用于分布式系统中缓存服务节点的延迟加载装置,可以包括:
存储有计算机程序的存储器;
处理器,配置为读取所述计算机程序以执行本实施例所述延迟加载方法的步骤。
需要说明的是,本实施例所述延迟加载装置的上述结构仅为其基础架构。实际应用中,该延迟加载装置还可包括其他部件,比如,总线、通信电路、输入部件、输出部件等。当然,除此之外,上述延迟加载装置还可包括其他部件。
本实施例中延迟加载装置的具体技术细节可参照上述方法部分。
实施例四
一种分布式系统的延迟加载方法,如图9所示,可以包括:
步骤901,分布式的快照服务节点分别从镜像中心下载虚拟机镜像的数据块到相应的快照子块;
步骤902,在所述下载虚拟机镜像的过程中,分布式的快照服务节点分别确定相应快照子块的热点数据块,并将所述热点数据块分发至分布式的缓存服务节点,以实现所述虚拟机镜像中热点数据块的分布式缓存;
步骤903,所述下载虚拟机镜像完成后,分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,以将相应快照子块的所有数据块共享至相应虚拟机块设备的子块。
本实施例中,可以在创建虚拟机的过程中,首先以延迟加载的方式,从镜像中心(Image Center)把镜像(Image)下载到块设备存储集群(EBS),形成用于延迟加载的快照(Lazyload Snapshot),如此,下载镜像由一组快照服务节点分布式并发完成,可以提高延迟加载的速度。
本实施例中,在用于延迟加载的快照下载完成之前,每个快照服务节点即时将下载的部分数据块(即热点数据块)分散到一组缓存服务节点并在其内存中缓存,这些热点数据块的读取操作可以由这组缓存服务节点而不是快照服务节点完成,从而提高延迟加载期间读请求的处理效率。
一种实现方式中,所述分布式的快照服务节点可以分别记录延迟加载期间所述快照子块中数据块的读取次数和读取频率中至少之一;并根据所述快照子块中数据块的读取次数和读取频率中至少之一,确定延迟加载期间所述快照子块的热点数据块。。该实现方式中,快照服务节点可以通过将所述快照子块中数据块的读取次数和读取频率中之一或两项与其对应的预定阈值(即读取次数阈值和读取频率阈值中之一或两项)进行比较,确定所述数据块是否为热点数据块。该过程的具体技术细节可参照实施例一。
本实施例中,所述分布式的快照服务节点分别可以根据相应快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法为相应快照子块分配至少一个缓存服务节点,并将相应快照子块的热点数据块送至所述至少一个缓存服务节点。一种实现方式中,该过程的具体技术细节可参照实施例一中的示例2。
本实施例中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块,可以包括:分布式的块设备服务节点分别根据相应快照子块的快照标识和数据块标识、以及所有缓存服务节点的标识,按照分布式一致性哈希算法确定相应快照子块的至少一个缓存服务节点,并向该至少一个缓存服务节点获取相应快照子块的热点数据块。
本实施例中,分布式的块设备服务节点分别可以在接收到来自所述分布式的快照服务节点的第一标识之后,直接向分布式的缓存服务节点请求相应快照子块的热点数据块,所述第一标识表示所述快照子块的热点数据块已被发送至缓存服务节点。这里,可以在分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块之前,分布式的块设备服务节点分别可以向分布式的快照服务节点请求相应快照子块的热点数据块,分布式的快照服务节点至少向所述分布式的块设备服务节点返回对应所述热点数据块的所述第一标识,以便所述分布式的块设备服务节点后续向分布式的缓存服务节点获取相应快照子块的热点数据块。
本实施例中,所述将所述热点数据块分发至分布式的缓存服务节点之后,还可以包括:分布式的缓存服务节点分别将来自分布式的快照服务节点的热点数据块缓存在内存。相应的,分布式的缓存服务节点分别可以接收来自分布式的块设备服务节点的读请求,从内存中读取相应快照子块的热点数据块并返回给分布式的块设备服务节点。如此,通过将数据临时存放在内存中,减少磁盘读取的IO延时,可进一步提高分布式系统大批量数据并发读取的IO性能。
本实施例中,可以在用于延迟加载的快照下载完成之后,快照数据被送至到虚拟机磁盘(即虚拟机块设备),同时缓存服务节点可以释放这些数据的缓存。一种实现方式中,所述分布式的块设备服务节点分别向分布式的缓存服务节点获取相应快照子块的热点数据块之后,还可以包括:分布式的缓存服务节点分别接收来自块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。如此,可使得缓存服务节点及时释放内存空间,供其他快照子块的热点数据块使用,可进一步提高数据读取的效率,同时还可提高内存的资源利用率。
一种分布式系统,可以包括:
分布式的缓存服务节点,用于实现虚拟机镜像中热点数据块的分布式缓存;
分布式的快照服务节点,用于从镜像中心下载虚拟机镜像的数据块到相应的快照子块;在所述下载虚拟机镜像的过程中,确定相应快照子块的热点数据块,并将所述热点数据块分发至所述分布式的缓存服务节点;
分布式的块设备服务节点,用于所述下载虚拟机镜像完成后,向所述分布式的缓存服务节点获取相应快照子块的热点数据块,以将相应快照子块的所有数据块共享至相应虚拟机块设备。
一种实现方式中,上述分布式系统还可以包括:块设备主节点,可用于向所述分布式的快照服务节点发送下载子块的请求;以及,用于向所述分布式的块设备服务节点发送子块传输请求;所述分布式的快照服务节点,具体可以用于在接收到所述下载子块的请求时,从镜像中心下载虚拟机镜像的数据块到相应的快照子块;所述分布式的块设备服务节点,具体可以用于在接收到所述子块传输请求时,向所述分布式的缓存服务节点获取相应快照子块的热点数据块。
一种实现方式中,所述块设备主节点,还可以用于在所述分布式的块设备服务节点将所述虚拟机镜像的所有数据块共享至虚拟机块设备后,向所述分布式的缓存服务节点发送通知;所述分布式的缓存服务节点,还可以用于接收来自所述块设备主节点的通知,并释放所述通知所指示快照子块的热点数据块。
本实施例在分布式系统中加入分布式缓存机制,通过一组分布式的缓存服务节点来处理延迟加载期间热点数据块的读取操作,提高了分布式系统在延迟加载期间的读操作并发性能,解决了相关技术中延迟加载时局部热点数据读取性能的瓶颈问题。
实际应用中,缓存服务节点、块设备服务节点、快照服务节点分别可以部署在同一个物理机或者不同的物理机上。一种实现方式中,可以在集群的每个物理机上都同时部署缓存服务节点、块设备服务节点、快照服务节点。
下面以日志结构块设备为例说明本实施例。
如图10所示,为本实施例分布式系统的示例性架构。该示例性架构中,包含一个块设备节点(BM,Block Master)、分别对应两个块设备子块的两个块设备服务节点(BS,BlockServer)、分别对应两个快照子块的两个快照服务节点(SS,SnapshotServer)、以及两个缓存服务节点(CacheServer)。其中,块设备主节点负责管理日志结构块设备的元数据(LSBDmetadata),块设备服务节点负责为日志结构块设备的子块(segment)服务,快照服务节点负责日志结构块设备快照的子块下载,缓存服务节点负责提供块设备延迟加载时的分布式缓存服务。
如图10所示,日志结构块设备延迟加载的流程可以包括:
步骤1,块设备主节点向各快照服务节点发出下载子块(download segment)的请求;
步骤2,各快照服务节点分别从镜像中心下载数据到相应的快照子块。
这里,快照的子块数据保存在底层分布式文件系统中,同时该快照子块的在延迟加载期间一直处于打开状态,可以随时直接读取数据块。
步骤3,各快照服务节点在下载快照子块数据的同时,也会并发处理块设备服务节点发过来的对相应快照子块中数据块的读取请求。
这里,各快照服务节点会记录并更新延迟加载期间相应快照子块内所有数据块的读取情况,如果某个数据块成为热点数据,则将其发送到缓存服务节点进行分布式缓存,缓存服务节点将该热点数据临时存储在内存中。
步骤4,各块设备服务节点在处理读写客户端(client)的数据读取操作时,首先尝试向相应的快照服务节点发送请求,如果返回错误(比如网络超时或者目标快照服务节点暂时无法处理等),则进行IO重试;如果相应的快照服务节点成功返回数据块的同时附带了表示该数据块是热点数据的标识(比如,上文的第一标识),则块设备服务节点后续将所有对该数据块的读请求都转发给相应的缓存服务节点;
步骤5,延迟加载完成后,块设备主节点向各个块设备服务节点发出子块传输(segment import)的请求;
步骤6,各个块设备服务节点把相应快照子块的日志文件(log file)通过硬链接技术共享至相应的块设备子块,并向块设备主节点返回表示成功输入子块的消息(比如,成功输入子块的消息);
本步骤中,如果不成功将会一直重试,直至成功输入子块。
步骤7,块设备主节点收到来自所有块设备服务节点的成功输入子块的消息后,通知所有缓存服务节点释放对应相应快照子块的所有缓存的数据块(Cache Block)。
需要说明的是,本实例的执行流程仅为示例性实现方式。实际应用中,可基于应用场景的不同或应用对象的不同,调整上述流程中各步骤的具体实现方式、以及各步骤的执行顺序。
实施例五
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例一至四中任一所述延迟加载方法的步骤。
一种实现方式中,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例一所述延迟加载方法的步骤。该计算机可读存储介质可通过分布式系统的快照服务节点实现,该快照服务节点可通过物理机或其集群实现。
另一种实现方式中,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现实施例二所述延迟加载方法的步骤。该计算机可读存储介质可通过分布式系统的块设备服务节点实现,该块设备服务节点可通过物理机或其集群实现。
另一种实现方式中,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现实施例三所述延迟加载方法的步骤。该计算机可读存储介质可通过分布式系统的缓存服务节点实现,该缓存服务节点可通过物理机或其集群实现。
另一种实现方式中,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现实施例四所述延迟加载方法的步骤。该计算机可读存储介质可通过分布式系统来实现,该分布式系统可通过物理机或其集群实现。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件(例如处理器)完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,例如通过集成电路来实现其相应功能,也可以采用软件功能模块的形式实现,例如通过处理器执行存储于存储器中的程序/指令来实现其相应功能。本申请不限制于任何特定形式的硬件和软件的结合。
以上显示和描述了本申请的基本原理和主要特征和本申请的优点。本申请不受上述实施例的限制,上述实施例和说明书中描述的只是说明本申请的原理,在不脱离本申请精神和范围的前提下,本申请还会有各种变化和改进,这些变化和改进都落入要求保护的本申请范围内。