一种基于关联度的Docker容器注册表预取方法与流程

文档序号:20917052发布日期:2020-05-29 13:40阅读:163来源:国知局
一种基于关联度的Docker容器注册表预取方法与流程

本发明涉及云计算容器技术领域,具体涉及一种基于关联度的docker容器注册表预取方法。



背景技术:

容器技术是一种类似于沙盒机制的运行环境隔离技术,用户可以在容器中创建运行操作系统,实现操作系统级的虚拟化。同传统的虚拟机相比,容器技术通过共享内核资源的方式,实现轻量级的应用运行隔离。

现如今,随着云计算和大数据规模的日益扩大,例如google和ibm等公司在其云计算系统中使用容器来创建独立环境。docker是linux平台上一款轻量级容器管理引擎,相对虚拟机可以降低资源和时间的开销,在共享底层内核的基础上实现了轻量级的应用隔离环境,不仅具有良好的性能和安全优势,而且帮助用户提升ci/cd的效率,使得应用和服务的打包,发布和协调更为灵活和快速。

docker容器注册表是docker生态系统中的核心组件——无状态的集中式服务,可以提供镜像的存储和转发。docker容器注册表中每一个镜像存储库包含特定应用程序或系统镜像所有版本构成的镜像组,用户使用docker引擎通过restful接口连接到注册表,在请求中包含用户名、存储库名和标记的组合来标志特定的镜像,对其镜像推送和拉取操作。同时注册表存储着每个镜像的元数据,用以检查镜像信息,保证其安全性和稳定性。

在实际项目部署过程中,企业通常利用docker容器注册表来解决容器镜像的存储问题。据统计,大型容器公共注册表dockerhub至少存储数百tb数据,并按每天1500个公共存储库的速度增加,其他私人镜像存储库也不断更新。随着用户请求速率的提升,注册表的整体性能降低,后端存储有限的带宽不足以支撑短时间高并发的拉取请求,进而导致用户拉取镜像的延迟会变高,限制了容器部署的启动时间,与容器技术高效、敏捷的设计初衷相违背,甚至加大了系统部署的稳定性和安全性。因此,对于将部分镜像预取到注册表缓存的工作就显得尤为重要。



技术实现要素:

本发明的主要目的是为了解决现有技术中的上述缺陷,提出了一种基于关联度的docker容器注册表预取方法,在请求未命中时发出关联镜像层计算并实施预取,提高缓存命中率。

本发明的目的可以通过采取如下技术方案达到:

一种基于关联度的docker容器注册表预取方法,docker容器注册表所接受的请求会按照图1中的镜像结构提取器、拉取请求处理器和关联镜像层计算器进行处理,并预取回相关镜像层。所述的缓存预取方法,可适用于所有完全托管的docker容器注册表,分别包括下列步骤:

s1、在docker引擎将镜像推送至docker容器注册表中后,镜像结构提取器读取镜像元数据,将镜像层信息存入本地;

s2、当docker容器注册表接收到docker引擎发送的镜像拉取请求时,拉取镜像处理器根据请求信息对本地镜像层缓存进行检索,以决定是否进行镜像层相关性计算操作;

s3、当请求没有命中镜像层缓存时,关联镜像层计算器根据请求所属的预取窗口信息,从镜像结构数据库中计算相关镜像层,并查询本地镜像层缓存,向后端存储预取缓存中缺失的相关镜像层。

进一步地,所述的步骤s1中,docker容器注册表接收到镜像,镜像结构提取器收集信息的过程如下:

s11、图2为镜像结构图,其中镜像的元数据文件包含例如父镜像id、默认参数、创建日期,以及每个镜像层的digest等镜像基本信息,首先从镜像层字段中提取所有镜像层的sha-256摘要值;

s12、以镜像名为键,各镜像层sha-256摘要值构成的集合为值的字典数据结构存入镜像结构数据库中。

进一步地,所述的步骤s2中,当注册表接收到镜像拉取请求时,根据缓存内容判断是否执行相关镜像层计算,主要步骤如下:

s21、对于每一个到达docker容器注册表的请求,判断请求方法名是否为http中的get方法,并将包含get方法的请求加入对应的预取窗口;其中,http中的get方法为现有技术中公知常用方法;

s22、当镜像层缓存不为空时,检索请求所对应的镜像层是否存储于镜像层缓存中;

s23、当请求命中镜像层缓存时,docker容器注册表将该镜像层传回docker引擎,并由lru算法提高此镜像在缓存队列中的优先级,若请求没有命中缓存区时,将请求对应的镜像层信息发送至关联镜像层计算器,然后触发关联镜像层预取操作。

进一步地,图3表示docker镜像位于注册表后端的存储结构,每一个镜像存储库是由特定应用程序或系统镜像的所有版本构成,所述的相关镜像层计算器通过利用docker镜像结构的空间局部特性,按照在镜像存储库中的存储位置对镜像层关联等级划分成三个等级,分别是无关联镜像层、弱关联镜像层和强关联镜像层,同时根据请求所属的预取窗口信息按优先级进行搜索,其中,搜索的优先级如下:无关联<弱关联<强关联。所述的步骤s3过程如下:

s31、当请求没有命中镜像层缓存时,相关镜像层计算器收到拉取请求处理器发送的请求信息,查看请求所属的预取窗口;

s32、根据预取窗口中包含的历史请求序列,按照预先设定的优先级,结合镜像结构数据库和关联度模型计算请求对应镜像层的关联距离,最终得出具有相关性的镜像层,如果搜索不到有关联的镜像层,则清空预取窗口的历史请求并保留最后一个拉取请求;

s33、当搜索结束后,在镜像层缓存中对比搜索到的相关镜像层,向后端存储发出请求,将不存在于缓存的相关镜像层预取回本地,如果缓存饱和,则通过lru算法对缓存进行替换。

进一步地,所述的预取窗口是由于注册表中镜像仓库的独立性而为每一个镜像仓库设置一个预取窗口,用以保存针对此镜像仓库的未命中请求,以便关联镜像层计算器查询预期窗口中请求对应的镜像层是否产生关联。

进一步地,所述的lru算法是在注册表缓存中维护一个镜像层队列,当请求命中时,提高对应镜像层优先级;请求未命中触发预取时,注册表缓存的空余空间大小不足,lru算法将不断从缓存中剔除最近最少使用的镜像层,直到将关联镜像层存储。

进一步地,所述的渐进式计算是关联镜像层计算器在搜索相关镜像层的计算方法,当预取窗口中请求对应的若干镜像层是无关联时,则无关联镜像层;弱关联时则计算若干镜像层所属镜像的最大公共子集;强关联时则计算出若干镜像层所属镜像的其他镜像层。

本发明相对于现有技术具有如下的优点及效果:

(1)本发明尽可能准确的计算出镜像层之间的关联程度,采用渐进式预取的方法,避免了过度拉取导致的网络流量浪费和命中率损失。

(2)本发明通过对docker镜像和注册表的研究,提出了利用镜像层空间局部性的关联镜像层预取方法,降低了用户拉取请求的延迟,提高了注册表缓存的命中率,加快了容器的启动速度。

(3)本发明对镜像的操作独立于原有代码,没有对原有代码进行修改,保证了原本注册表的稳定运行。

附图说明

图1是本发明公开的一种基于关联度的docker容器注册表预取方法的系统架构图;

图2是本发明公开的一种基于关联度的docker容器注册表预取方法的镜像结构图;

图3是本发明公开的一种基于关联度的docker容器注册表预取方法的注册表中镜像层存储图。

具体实施方式

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

实施例

如图1所示,是一种基于关联度的docker容器注册表预取方法的系统架构图,应用在docker容器注册表中,针对用户拉取镜像过程中发生的高延迟问题采用了预取相关镜像层以提高缓存对未来请求的命中率。同时对预取操作可能产生的误差流量问题采用了渐进式计算策略以降低不必要的网络开销。同时对这种缓存预取算法进行基准测试,从多角度评估本发明对注册表的性能影响。本发明的关键技术主要分为三个部分:

1)镜像结构提取。如图2所示,一个镜像由若干镜像层组成,每一层的所有信息均记录在镜像元数据文件中。当注册表接收到docker引擎上传的镜像元数据时,镜像结构提取器解析元数据中镜像层字段,将结构信息以镜像名为键,各镜像层sha-256摘要值构成的集合为值的字典数据结构存入镜像结构数据库中。

2)拉取请求处理。若注册表接收到非get方法的请求时,按原代码执行注册表操作;若注册表接收到包含get方法的请求,将请求加入对应镜像仓库的预取窗口。首先启动拉取请求处理操作,如图1所示,检测在注册表镜像层缓存中由lru维护的镜像层队列里是由存在请求对应的镜像层,如果存在则表示请求命中缓存,lru算法更新镜像层维护队列,注册表将该镜像层传回docker引擎,否则此次请求未命中,拉取请求处理器将镜像层信息发送到关联镜像层计算器,注册表将计算出用户未来可能拉取的相关镜像层。

3)关联镜像层计算及预取。如图1所示,当用户拉取请求没有命中缓存时,关联镜像层计算器收到该镜像层信息,利用docker镜像层的空间局部性,结合预取窗口中包含的历史请求序列,按照预先设定的优先级,从镜像结构数据库中计算与此请求对应镜像层具有相关性的镜像层。首先介绍关联度模型的计算方法,本发明通过计算用户未来可能拉取的镜像层,从而提高docker容器注册表的命中率,为了描述这一问题,将两个镜像层之间的关联的镜像层个数定义为关联距离c,即公式1:

其中,d表示两个镜像层之间的存储距离,由于镜像结构是按照由底至顶的顺序被存储,则通过两个镜像层的序号差求得,t表示拉取镜像层的请求的时间戳,p表示拉取对应镜像层的流行度。此模型用于计算弱关联,且c最大不能超多d,即两个镜像层及其之间的镜像层,而强关联则获得其对应所属的整个镜像。

结合图3对三种关联等级的搜索举例说明,若镜像存储库2的预取窗口为<1>,注册表镜像缓存为<1>,注册表接收到拉取镜像存储库2中5号镜像层的请求,请求未命中缓存并放入存储库2的预取窗口组成<1,5>,此时<1,5>对应的镜像层集合是iojs、perl和pypy三个镜像的子集,则镜像层1号和镜像层5号是弱关联,将1号镜像和5号镜像的相关数据代入关联度模型,假设计算俩镜像的关联距离为4,则可知关联镜像层集合为<1,2,3,5>,并将注册表缓存中缺失的2号、3号和5号镜像层预取回缓存中。若镜像存储库2的预取窗口为<1,5>,注册表缓存为<1,2,3,5>,注册表接收到拉取镜像存储库2中14号镜像层的请求,请求未命中缓存并放入存储库2的预取窗口组成<1,5,14>,<1,5,14>对应的镜像层集合仅属于perl镜像,则1号、5号和14号镜像层是强关联,计算得出关联镜像层集合为<2,3,6,9,13>,并将注册表缓存中缺失的6号、9号、13号、14号镜像预取回缓存中。若镜像存储库1的预取窗口为空,镜像存储库2的预取窗口为<1,5,14>,注册表缓存为空,注册表接受到拉取镜像存储库1中4号镜像层,请求未命中缓存并放入存储库1的预取窗口组成<4>,优先搜索弱关联镜像得到仓库1中1号和2号镜像层,而存储库1的<4>与仓库2的<1,5,14>是无关联的,则不考虑。如果缓存饱和,则通过lru算法对缓存进行替换,直到相关镜像层放入缓存。

综上所述,本实施例公开了一种基于关联度的docker容器注册表预取方法,该方法通过镜像结构提取器收集镜像层之间的组合关系,经拉取请求处理器依据请求信息在缓存中搜索以触发预取操作,最后由关联镜像层计算器合理利用镜像层的空间局部性得到关联镜像层,并预取到注册表缓存中,提高了注册表整体的请求命中率,降低用户拉取镜像的延迟,进而加快容器的部署速度。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

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