一种基于容器的负载均衡分布式编译系统和方法与流程

文档序号:20510636发布日期:2020-04-24 18:29阅读:481来源:国知局
一种基于容器的负载均衡分布式编译系统和方法与流程

本发明涉及分布式编译领域,尤其涉及一种基于容器的负载均衡分布式编译系统和方法。



背景技术:

随着软件项目规模几何数字的增长,百万行代码的系统比比皆是。虽然现在计算机运行速度已不断提高,但完全编译整个软件项目工程可能需要几十分钟,甚至几个小时或更久。这对开发人员来说,极为不便,很浪费时间。

为解决此问题,加快编译速度,一般采用分布式编译。但由于分布式编译对环境一致性的依赖,导致每台参与分布式编译架构的计算机,都必须有同样的编译环境,这在现实开发流程中,并不能完全保证。所以,为搭建统一的开发环境,得花费不少时间和精力。

若存在一种能把原始环境一模一样的复制过来技术,不仅方便而且会从根本上解决问题。这便是所谓的带着环境安装。目前,有两种带着环境安装的解决方案:虚拟机和容器。但虚拟机存在资源占用多、冗余步骤多和启动慢的缺点。而容器具有启动速度快(秒级),占用磁盘空间小,部署快,可共享文件等特点。

因此,需要一种改进的基于容器的负载均衡分布式编译方法,以实现快速、可靠、一致地部署开发环境,解决分布式编译中为搭建统一开发环境而花费大量时间和精力的问题。



技术实现要素:

有鉴于现有技术的上述缺陷,本发明的目的是提供一种基于容器的负载均衡分布式编译系统和方法,实现分布式编译中统一的开发环境的快速部署,来优化分布式编译环境。

为实现上述目的,本发明提出了以下方案:

1、一种基于容器的负载均衡分布式编译系统,包括设置于同一本地网络的编译集群,所述编译集群包括开发主机、服务器和多台宿主机;

所述开发主机执行:

(1)使用docker构建容器,在容器中部署开发所需的环境;

(2)将容器保存为镜像,并将所述镜像推送到服务器的docker本地仓库进行共享;

所述服务器执行:

(1)共享docker本地仓库中的镜像;

(2)通过运行程序dmucs的机器,把编译任务合理的派发到本地网络中的宿主机;

所述宿主机执行:

(1)从服务器的docker本地仓库中拉取镜像;

(2)运行镜像,启动容器,搭建开发环境;

(3)完成编译任务输出目标文件;将目标文件发送给开发主机。

进一步的,所述镜像的构建通过dockerimage模块执行,所述dockerimage模块用于指定搭建开发环境所需安装的应用程序;生成配置文件dockerfile,所述dockerimage模块根据配置文件dockerfile内容,来定制镜像;所述配置文件dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,每一条指令的内容用于描述该层的构建。

进一步的,所述配置文件dockerfile生成的具体步骤:

新建空目录,并创建一个名为dockerfile的文件;

编写dockfile内容,即编写安装开发环境所需的应用程序和配置环境的指令;

所述dockfile内容包括:

安装distcc,用于多机器编译;安装后会得到两个二进制文件distccd和distcc:distccd主要负责网络数据处理,distcc调用g++进行编译;

配置distcc,设置监听的网络和用于分布式编译的宿主机;

启动distccd服务,distccd服务仅在服务器端、宿主机端启动;

安装dmucs,dmucs安装后得到一个二进制文件loadavg;程序dmucs负责负载均衡的调度工作,根据宿主机的负载情况和硬件实力,合理优化调度资源;

配置dmucs,指定调度机的ip,由ip所在的机器进行编译负载的调度管理;即通过ip指定编译集群中的一台机器为调度机;宿主机上的编译程序,把编译负载情况发送给调度机上的调度程序,作为调度机调度时的参考信息;

启动loadavg服务,loadavg服务会定期发送宿主机的平均负载情况给调度机,供调度决策使用;

启动调度程序dmucs。

2、一种基于容器的负载均衡分布式编译方法,包括以下步骤:

s1,在开发主机上构建容器,在容器中部署开发所需的环境;

s2,在开发主机上将容器保存为镜像,所述镜像被推送到服务器的docker本地仓库进行共享;

s3,宿主机从服务器上的docker本地仓库中获取镜像,并将其拉取到本地,然后运行,得到各自的容器,在宿主机部署与开发主机相同的开发环境;

s4,通过运行程序dmucs的机器,把编译任务合理的派发到本地网络中的宿主机,所述运行程序dmucs的机器的ip通过配置dmucs指定;

s5,宿主机完成编译任务输出目标文件;将目标文件发送给开发主机。

进一步的,所述s1包括以下步骤:

s11,安装docker软件;

s12,添加用户到docker用户组;

s13,编写dockerfile配置文件来定制开发环境的镜像,即安装项目开发所需的应用程序和配置参数。

进一步的,所述s3具体包括以下步骤:

s31,安装docker软件;

s32,添加用户到docker用户组;

s33,从服务器的docker本地仓库中拉取镜像;

s34,运行镜像,启动容器,搭建开发环境。

与现有技术相比,本发明的优点是:

本发明的基于容器的负载均衡分布式编译方法和系统,基于本地网络(局域网)构建,应用docker应用容器引擎可以快速、可靠、一致地部署编译环境,即将环境、依赖以及程序打包成一个容器,并在统一的容器环境下运行,从而大幅度提高了项目前期部署环境的时间,减少因换机器所产生的搭建环境的时间消耗,也不用考虑因环境和缺少库带来的各种问题,使得开发者从硬件部署和管理问题中解脱出来,大大节约了开发环境的配置时间,从而提高应用版本的生成效率。

附图说明

图1是本发明的基于容器的负载均衡分布式编译方法的总体架构方案;

图2是本发明的开发主机使用docker搭建开发环境和镜像创建;

图3是本发明的宿主机使用docker搭建开发环境。

具体实施方式

为进一步说明各实施例,本发明提供有附图。这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点。图中的组件并未按比例绘制,而类似的组件符号通常用来表示类似的组件。

现结合附图和具体实施方式对本发明进一步说明。

本发明公开了一种基于容器的负载均衡分布式编译方法的总体架构方案,如图1所示。该总体架构方案基于docker应用容器引擎构建,包括容器(container),镜像(image),仓库(repository)三大核心组件,在物理结构上,涉及在同一本地网络内的开发主机、服务器和用于编译的机器(即宿主机)。

首先,我们在自己的开发主机上先构建容器a,这样便可部署好开发所需的环境。构建方法通过dockerfile自动构建,当然也可手动构建。

其次,因镜像是容器的静态形式,容器是镜像的运行态。所以,将容器保存为镜像,然后推送到服务器的docker本地仓库进行共享。

最后,宿主机从服务器上的docker本地仓库中获取镜像,并将其拉取到本地,然后运行,便可得到各自的容器,即部署好的和开发主机相同的开发环境。这些容器之间互不影响,相互隔离。从而完成分布式编译环境的架构。

下面对总体架构方案中的各个模块介绍下:

dockerimage模块:用于指定搭建开发环境所需安装的应用程序,根据配置文件dockerfile内容,来定制镜像。它是一个文本文件,其内包含了一条条的指令(instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。具体步骤:

新建空目录,并创建一个名为dockerfile的文件;

编写dockfile内容,即编写安装开发环境所需的应用程序和配置环境的指令,下面以搭建负载均衡分布式开发环境为例:

安装distcc,它是开源工具,进行多机器编译;安装后得到两个二进制文件distccd和distcc:distccd是一个守护进程,每个宿主机上都需要安装这个守护进程,用来处理distcc发送过来的各种计算资源,distcc是一个类似客户端的程序,通过调用g++进行编译,可以让c/c++代码在很多宿主机上进行分布式的编译;

配置distcc,设置监听的网络和宿主机;

启动distccd服务(在服务器端和宿主机启动);

安装dmucs,程序dmucs负责负载均衡的调度工作,根据宿主机的负载情况和硬件实力,合理优化调度资源。安装后得到一个二进制文件loadavg,它会定期发送宿主机的平均负载情况给调度机所在机器,供调度决策使用;

配置dmucs,指定调度机的ip地址;宿主机上的编译程序,需要把编译负载情况发送给调度器上的调度程序,作为它调度时的参考信息;dmucs可以安装在任意一台机器上,不参与实际的编译过程。

在参与distcc编译的机器(即宿主机)上启动loadavg进程,向启动dmucs进程的机器发送本机负载情况;

启动loadavg服务;

启动调度程序dmucs;

其他所需应用程序软件的安装,根据实际项目需要搭建。

2、开发主机(client):这台计算机上有项目、工程文件、源代码,平时我们在这台机器上编写代码,要编译的对象也是在这台机器上。所以,以这台计算机上的开发环境为基准,使用docker搭建开发环境的镜像,然后将镜像推送到服务器docker的镜像仓库中去。本例以android-ndk为例编写配置文件dockerfile,详细流程如下:

(1)安装docker软件。

(2)添加用户到docker用户组,免去每次输入docker都需要sudo的问题。

(3)编写dockerfile配置文件来定制开发环境的镜像,即安装项目开发所需的应用程序和配置参数等;docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源和运行时准备的一些配置参数(如环境变量、用户等)。镜像的定制实际是定义每一层所添加的配置、文件,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变,只发生在自己这层。它由多层文件系统联合组成。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。此例子中列出搭建开发分布式开发环境,所需要安装的应用程序软件。

(4)创建镜像,并将镜像推送到服务器的docker本地仓库存放。

(5)生成容器并运行容器。开发主机在该开发环境下进行项目生成、代码编写和承担部分编译工作。

(6)停止容器。

2、服务器(server&scheduler):负责派送任务到编译的机器(即宿主机)。通过程序dmucs所在的机器,在本实施例中,程序dmucs所在的机器为服务器,把编译任务合理的派发到本地网络中的宿主机的编译程序上。

在服务器上同样运行与开发主机一致的开发环境,下载已注册的镜像,通过镜像启动一个容器,将docker本地仓库存放在容器的/tmp/registry目录下,同时指定本地一个目录挂载到容器的/tmp/registry;这样避免容器删除导致的存放于容器中的镜像丢失。

3、分布式编译的机器(即宿主机):在宿主机上使用docker搭建开发环境,流程如下:

安装docker软件;

添加用户到docker用户组,免去每次输入docker都需要sudo的问题;

从服务器的docker本地仓库中拉取镜像;

运行镜像则启动容器,搭建开发环境。

分布式编译的实施:

当在一个局域网(即本地网络)中,若干机器完成分布式编译环境的架构,形成一分布式编译集群,则可以开始进行分布式编译;

调度程序dmucs所在的机器即服务器(server),负责把任务合理的派发到已寻找到的有资源的宿主机上;

被分配到编译任务的宿主机运行gethost命令进行编译;

编译结束后,gethost释放所分配的宿主机;并将编译结果发送给开发主机。

仿真及结果

以gcc负载均衡的分布式编译为例进行说明:

在一个局域网(即本地网络)中,包括一分布式编译集群,集群中有6台机器,开发主机1台(ip为192.168.1.55),且有项目代码,服务器1台(ip为192.168.1.66),同个本地网络中负责编译的机器(宿主机),一共有4台,ip分别为192.168.1.11,192.168.1.12,192.168.1.13,192.168.1.14。并假设现在存在10个编译任务。

集群中的所有机器,先使用docker镜像搭建统一的开发环境,如安装gcc、clang(clang是一个c语言、c++、objective-c语言的轻量级编译器)、distcc、dmucs和make等;

开发机(client)通过distcc服务,发起10个并行编译任务;

服务器(server)启动loadavg服务,根据loadavg服务提供的各个负责编译的机器(即宿主机)的承担能力和负载情况,寻找出合适的编译资源;一般,dmucs会首先将任务优先分配到高性能的宿主机,若高性能的宿主机上的负载饱和,余下的编译任务将分配到低性能的宿主机上;

在本应用中,由于协调耗费的资源较小,在本应用中仅需要一台服务器用于负责负载均衡工作。同时为了保证负载均衡服务器的持续可用性,编译集群中可以有一台机器充当备份服务器。如果当负载均衡的那台服务器服务宕机,将切换为备份服务器。

通过本发明的基于容器的负载均衡分布式编译方法可以快速、可靠、一致地部署编译环境,即将环境、依赖以及程序打包成一个容器,在其他环境直接运行这个容器即可。从而,大幅度提高了项目前期部署环境的时间,减少因换机器所产生的搭环境的时间消耗,也不用再考虑因环境和缺少库,带来的各种问题,能节约下大量的宝贵时间去做更有利于项目的事情。同时,本发明的基于容器的负载均衡分布式编译方法通过容器技术,避免开发人员出现本地运行正常,由于环境问题,交付的时候发现一堆问题。

本发明基于容器的负载均衡分布式编译方法,使得开发者从硬件部署和管理问题中解脱出来,大大节约了开发环境的配置时间,从而提高应用版本的生成效率。

尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。

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