基于ZeroMQ的多机分布式计算的通信框架设计方法与流程

文档序号:15744087发布日期:2018-10-23 22:47阅读:366来源:国知局

本发明涉及一种基于ZeroMQ的多机分布式计算的通信框架设计方法,属于分布式计算系统领域。



背景技术:

根据分布式计算系统的起源,最先2002年以前芯片上的晶体管集成密度成指数上升,性能保持1.5倍增长,但是渐渐的随着晶体管密度的上升,空气散热已经无法解决散热问题,芯片制造商提出与其制造出单块性能更快的芯片不如在单块芯片上集成更多的计算核心—由此出现了多核CPU。从多核CPU的出现引出了单机的并行计算以及我们现在普遍涉及的分布式计算和云计算。由于随着计算机性能的一步步提高,信息技术的快速发展,人们产生的数据越来越多,人们已经进入了大数据时代,从而每天从人们产生的这些庞大的数据中寻找有用的信息及相关的天文和科学计算成为促进分布式计算和云计算的快速发展的动力。人们也借助信息技术的快速发展通过海量的数据攻克了许多由于前人因为计算能力有限而无法解决的问题。而且由于分布式系统的快速发展,从而使得把大数据处理相关技术变得非常亲民,让更多企业客户使用分布式系统可以处理高并发请求响应以及海量数据等。让更多企业客户体验到了分布式系统带来的便利。

随着分布式计算系统和从海量数据中获得有用信息的互相促进与发展,双方都在信息技术中硬件系统的支撑下得到了跨越式的前进。由于分布式计算系统是由多台计算机和通信的软件通过计算机网络连接而成。正因为分布式系统时建立在网络之上的软件系统,所以分布式系统具有高度的内聚性和透明性。而且分布式系统可以应用在不同的工作平台上如PC机、工作站、局域网、广域网上。

分布式系统最大的特点之一是可扩展性,它能够适应需求变化而扩展,应对企业的业务增长而带来的计算需求可以通过增加服务器的数量来增强分布式系统的整体处理能力。分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务。尤其是高并发或者大数据量的任务。分布式计算系统是由独立的服务器通过网络的松散耦合组成的。每个服务器都是都是一台单独的PC机,通过内部网络连接而成,每个节点之间通讯有一定的网络开销,所以要尽可能的减少节点之间的通讯,因为网络传输之间的瓶颈,所以提升每个服务器性能对于整体提升分布式系统的计算能力效果不大,因此分布式系统中的每个节点一般不采用高性能服务器,而是采用性能一般的普通PC服务器,提升分布式系统的整体性能要通过横向扩展即增加服务器数量,而不是纵向扩展即单个节点的服务器的性能。

分布式系统另一个最大的特点是廉价高效,由成本低廉的PC服务器组成集群,在性能方面能够达到或超越大型机的处理性能,但是在成本上远远低于大型机。这也是分布式系统最吸引人之处。

但是分布式系统也有它的缺点存在,如:

1.故障排除难度高;

由于分布在多台服务器上,故障排除及诊断问题难度较高。

2.软件支持少;

更少的软件支持是分布式系统的主要缺点。

3.网络基础设施成本高;

网络基础设置问题,包括传输、高负载、信息丢失等问题。

4.安全性问题;

开放式系统的特性让计算机分布式系统存在着数据的安全性和共享的风险问题。



技术实现要素:

本发明要解决的技术问题是提供一种基于ZeroMQ的多机分布式计算的通信框架设计方法,是基于ZeroMQ官方给出的只有一个Client单机多线程模型基础上,研究了解其线程间的通讯原理,并在适用于线程与线程之间Client、Server和Broker Server三者的通讯方式改进为适合多机之间的进程与进程之间的通讯方式,并根据分布式系统中每个Worker要做的具体工作内容重新改写中间代理服务器,之后根据上述内容写出每个模块的伪代码,再用Python语言实现各个功能模块的伪代码,并分别根据不同环境中修改源代码进行程序调试。实现一个在多个服务器和多个客户端上运行的分布式计算系统,并能包含数据冗余及负载均衡等相关功能。该发明方法可以作为分布式计算系统的设计及底层数据传输及负载均衡的方法的参照方案。

本发明采用的技术方案是:一种基于ZeroMQ的多机分布式计算的通信框架设计方法,包括如下步骤:

Step1、查阅当下分布式计算通信消息中间件设计中的主流技术,分别为RabbitMQ、ActiveMQ和ZeroMQ;

Step2、基于ZeroMQ的消息中间件技术针对官方给出的单机多线程MT模型,并在一台装有Centos7的服务器上测试运行官方给出的单机多线程分布式计算通信模型中,分析线程间和多服务器间中由Client提交到Broker Server,之后将数据流和区别任务类型的特定标识转发给Worker Server,最后将结果根据标识逆传输回Client中的数据传输机制及原理;

Step3、在步骤Step2的基础上,进行不同地理位置的多机分布式计算框架模型设计及实现,具体步骤如下:

Step3.1、选取处在同一个局域网的5台系统为Centos7的服务器,记录其IP地址,作为多机分布式计算框架模型的实验设备,分布在不同地理位置的主机通过ZeroMQ消息中间件技术实现分布式计算中基于Socket间的数据传递;

Step3.2、再在多机模型的基础上,用消息中间件技术ZeroMQ实现该分布式计算系统中Client、Broker Server、Worker之间的任务提交、任务分配及计算结果回收的数据内容Socket传送技术,以及数据负载均衡和Client和Worker数量灵活伸缩的技术。

具体地,所述的Step3.2的具体步骤如下:

Step3.2.1、根据ZeroMQ官方文档里面提供的Figure 20Multithreaded Server单机多线程的分布式计算模型,在此基础上将其改进为多个服务器跨主机的分布式计算模型,并实现由多个Client和Worker Server绑定到Broker Server,由Broker Server根据分布式计算规模实现Client和Worker数量的弹性伸缩和之间数据传输的负载均衡控制功能模块;

Step3.2.2、根据Step3.2.1中制定的多个服务器跨主机的分布式计算模型编写Client、Worker Server、Broker Server端伪代码;

Step3.2.3、将Step3.2.2中的伪代码用Python语言实现;

Step3.2.4、在Step3.2.3实现的代码的基础上,将其中涉及数据传输的Bind和Connect地址转换为在单个服务器上运行的分布式计算系统需要的具体Socket号,之后在PC机上运用python环境或者Centos7的Linux服务器环境下调试运行Step3.2.3实现的程序代码;

Step3.2.5、在Step3.2.3实现的代码的基础上,将其中涉及的Bind和Connect地址转换为在多主机上运行的分布式计算系统需要的IP+Socket地址,然后在实验室的局域网中选取至少两台服务器或者PC机作为不同地理位置的多机分布式计算系统模型的试验机器,并调试及运行实现的代码。

本发明的有益效果是:分布式系统普及能够帮助用户和企业以较低的成本能够获得高并发处理请求及海量数据处理的能力,同时由于普通的分布式系统底层消息通讯方式大多数都是基于TCP连接,所以有三次握手协议,导致分布式系统之间的每个节点互相通讯时占用了大量时间及带宽,这对于分布式系统所要求的及时性是一种很大的损失,彻底违背了分布式系统所要实现的高可用性高并发性的初衷,基于TCP连接的都是点对点连接,不支持节点间广播和多播通信,而且Client和Server角色有明显划分,根据某些系统要求实现角色互相转换也很麻烦,但是ZeroMQ消息中间件不需要独立的消息服务器,部署简单,性能强大,不仅能实现1:1通信,也能实现1:N、N:M通信,支持超过20种编程语言,支持线程间通信、进程间通信、多节点广播通信及跨主机通信。所以在ZeroMQ官方给出的单个主机多线程通信的基础上进行改进,创新一个以ZeroMQ为底层消息传输的多个主机进行通信的跨主机分布式计算系统模型,最终实现一个在多个服务器和多个客户端上运行的分布式计算系统,并能包含数据冗余及负载均衡等相关功能。该发明方法可以作为分布式计算系统的设计及底层数据传输及负载均衡的方法的参照方案。

附图说明

图1是本发明的总体流程图;

图2是ZeroMQ官方给出的只有一个Client的单机多线程分布式模型;

图3是基于ZeroMQ官方给出的只有一个Client的单机多线程模型改进的多客户端多服务器的多机分布式计算系统模型。

具体实施方式

下面结合附图和具体实施例,对本发明进行进一步说明:

实施例1:如图1-3所示,一种基于ZeroMQ的多机分布式计算的通信框架设计方法,包括如下步骤:

Step1、查阅当下分布式计算通信消息中间件设计中的主流技术,分别为RabbitMQ、ActiveMQ和ZeroMQ;

Step2、基于ZeroMQ的消息中间件技术针对官方给出的单机多线程MT模型,并在一台装有Centos7的服务器上测试运行官方给出的单机多线程分布式计算通信模型中,分析线程间和多服务器间中由Client提交到Broker Server,之后将数据流和区别任务类型的特定标识转发给Worker Server,最后将结果根据标识逆传输回Client中的数据传输机制及原理;

Step3、在步骤Step2的基础上,进行不同地理位置的多机分布式计算框架模型设计及实现,具体步骤如下:

Step3.1、选取处在同一个局域网的5台系统为Centos7的服务器,记录其IP地址,作为多机分布式计算框架模型的实验设备,分布在不同地理位置的主机通过ZeroMQ消息中间件技术实现分布式计算中基于Socket间的数据传递;

Step3.2、再在多机模型的基础上,用消息中间件技术ZeroMQ实现该分布式计算系统中Client、Broker Server、Worker之间的任务提交、任务分配及计算结果回收的数据内容Socket传送技术,以及数据负载均衡和Client和Worker数量灵活伸缩的技术。

进一步地,所述的Step3.2的具体步骤如下:

Step3.2.1、根据ZeroMQ官方文档里面提供的Figure 20Multithreaded Server单机多线程的分布式计算模型,在此基础上将其改进为多个服务器跨主机的分布式计算模型,并实现由多个Client和Worker Server绑定到Broker Server,由Broker Server根据分布式计算规模实现Client和Worker数量的弹性伸缩和之间数据传输的负载均衡控制功能模块;

Step3.2.2、根据Step3.2.1中制定的多个服务器跨主机的分布式计算模型书写Client、Worker Server、Broker Server端伪代码;

Step3.2.3、将Step3.2.2中的伪代码用Python语言实现;

Step3.2.4、在Step3.2.3实现的代码的基础上,将其中涉及数据传输的Bind和Connect地址转换为在单个服务器上运行的分布式计算系统需要的具体Socket号,之后在PC机上运用python环境或者Centos7的Linux服务器环境下调试运行Step3.2.3实现的程序代码;

Step3.2.5、在Step3.2.3实现的代码的基础上,将其中涉及的Bind和Connect地址转换为在多主机上运行的分布式计算系统需要的IP+Socket地址,然后在实验室的局域网中选取至少两台服务器或者PC机作为不同地理位置的多机分布式计算系统模型的试验机器,并调试及运行实现的代码。

下面结合具体案例对本发明的方案进行详细描述:

例1:所述基于ZeroMQ的多机分布式计算的通信框架技术设计具体步骤如下:

Step1、查阅当下分布式计算通信消息中间件设计中的主流技术,当下主流消息中间件主要有三个,分别为RabbitMQ、ActiveMQ和ZeroMQ,分别查看相关官方文档和论文进行分析对比;具体的:

消息中间件,简言之是一种在分布式系统中应用程序借以传输消息的媒介。中间件位于客户机和服务器的操作系统之上,管理计算机资源和网络通讯,是连接两个独立应用程序或独立系统的软件,执行中间件的一个关键途径是信息传递。RabbitMQ是AMQP协议的一个实现,实现了代理(Broker)架构,比较易于部属和使用,但可扩展性差,速度较慢,但中央节点增加了延迟,消息封装后太大;ZeroMQ是一个非常轻量级的消息系统,专门为高吞吐量/低延迟而开发,在金融和天文一块用的最多,而且支持许多高级消息场景,而且非常灵活,但不支持消息持久化;ActiveMQ介于两者之间,可以部属代理模式和P2P模式,基于Java语言开发,比较成熟,但对队列数较多的情况支持不好,尤其上千队列很有很大的消息瓶颈。而ZeroMQ被称为史上最快的消息中间件,去中心化,让服务器和客户端没有明确的划分成为众多分布式计算中节点之间互相通信的首选通信消息中间件,同时ZeroMQ被号称为史上最快的消息队列,基于C语言开发,目前支持二十多种语言,它使得Socket编程更加简单、简洁和性能更高。对数据有特别高的吞吐量,但是不支持消息持久化,用户可自行在其基础上开发消息持久化,因为其数据传输速度很快,所以基本都用在集群产品的结构中。故在本文中选择ZeroMQ作为分布式计算中节点间互相通信的消息中间件技术。

Step2、基于ZeroMQ的消息中间件技术上针对官方给出的单机多线程(MT)模型,并在一台装有Centos7的服务器上测试运行官方给出的单机多线程分布式计算通信模型中,分析线程间和多服务器间中由Client提交到Broker Server,之后将数据流和区别任务类型的特定标识转发给Worker Server,最后将结果根据标识逆传输回Client中的数据传输机制及原理;具体的:

在ZeroMQ官方给出的文档中查看单机多线程(MT)模型,分析其实现代码及线程间的消息传递规则,并在一台装有Centos7的服务器上测试运行官方给出的单机多线程分布式计算通信模型,用简单的分布式任务来测试其由Client线程提交作业到Broker Server,再有Broker Server根据任务类型分配到相应的Worker Server进行作业计算,之后将结果传输回提交作业的Client线程,了解掌握中间涉及的Client和Worker之间的标识,Broker的任务分发和结果回收等模块间的相关数据传输机制,为step3做铺垫;

Step3、在步骤Step2的基础上,进行不同地理位置的多机分布式计算框架模型设计及实现,具体步骤如下:

Step3.1、选取处在同一个局域网的5台系统为Centos7的服务器,记录其IP地址,作为多机分布式计算框架模型的实验设备,分布在不同地理位置的主机如何通过ZeroMQ消息中间件技术实现分布式计算中基于Socket间的数据传递;具体的:

在实验室选取5台IP地址最后一段分别为:32、41、44、45、82的服务器作为多机分布式计算框架模型的实验设备;

Step3.2、再在多机模型的基础上,用消息中间件技术ZeroMQ实现该分布式计算系统中Client、Broker Server、Worker之间的任务提交、任务分配及计算结果回收的数据内容Socket传送技术,以及数据负载均衡和Client和Worker数量灵活伸缩的关键技术;

Step3.2.1、根据ZeroMQ官方文档里面提供的Figure 20Multithreaded Server单机多线程的分布式计算模型,在此基础上将其改进为多个服务器跨主机的分布式计算模型,并在原有的基础上,实现由多个Client和Worker Server绑定到Broker Server,由Broker Server根据分布式计算规模实现Client和Worker数量的弹性伸缩和之间数据传输的负载均衡等控制功能模块;具体的:

根据图2所示,为ZeroMQ官方给出的只有一个Client的单机多线程Multithread Server模型,我们在此基础上进行改进并重新设计Client、Broker Server和Worker Server的端口及消息发送方式,设计的多机分布式计算通讯模型如图3所示,模型中各个功能介绍,Client连接中间代理Broker Server的端口号,不需要知道有几个Worker Server为自己工作,只需要连接代理服务器后将数据发送给代理服务器,等待代理服务器传送回来自己所要的结果就行,即负责任务提交及提交任务后等待任务结果回收,最后任务处理结果一起收到的还有处理本次任务的Worker Server编号;Broker Server负责绑定Frontend和Backend两个端口,等待客户端和worker连接,同时负责客户端和worker之间消息传输的消息缓存以及负载均衡等,Worker Server在Broker上面注册,同时从Broker处排队获得Client提交的任务,但不知道他们处理的任务来自哪个Client,处理完成后将结果和自己的编号一起发送给Broker Server,同时重新在Broker Server处等待下一个任务的分配。

Step3.2.2、根据Step3.1中制定的多机分布式计算模型编写Client、Worker Server、Broker Server端伪代码;具体内容:

Client连接处及接受结果消息分割伪代码:

端口消息类型=socket(zmq.Connect)

连接端口"tcp://**:5558")

接受结果=recv()

结果分割=split(':')

Worker Server端口连接及结果接受和发送伪代码:

端口消息类型=socket(zmq.Connect)

连接端口connect"tcp://**:5560")

接受消息message==recv()

发送结果send==(Server_id,m)

Broker Server端口绑定及负载均衡等伪代码:

frontend=端口类型ROUTER

frontend.绑定(端口号5558)

backend=端口类型zmq.DEALER

backend.绑定(端口号5560)

device==队列(frontend,backend)

Step3.2.3、将Step3.2.2中的伪代码用Python语言实现;具体的:

Client、Broker Server和Server互相连接的地址,并实现对应代码;

Step3.2.4、在Step3.2.3实现的代码的基础上,将其中涉及数据传输的Bind和Connect地址转换为在单个服务器上运行的分布式计算系统需要的具体Socket号,之后在PC机上运用python环境或者Centos7的Linux服务器环境下调试运行Step3.1.3实现的程序代码;具体内容:

将Step3.2.3实现的端口连接代码中的IP地址用localhost+端口号代替,实现在本地单机进行程序调试。如下(1)和(2)所示为Client1和Client2发送的处理任务内容及处理本客户端提交任务的具体服务器编号。如下(3)、(4)、(5)所示为Worker Server处理的任务内容,因为本方法中只是验证分布式计算系统的底层数据传输方式,所以让Worker做简单的乘法处理,可以从上述截图中看到每个Client当发送6个任务给三台Worker时,三台Worker Server并没有出现闲置服务器,任务实现了均匀分配。这就是加入了中间代理,实现了队列模型,不会出现Worker抢占任务,也不会出现有的Worker一直闲置,出现资源的浪费。经测试,该代码在单机运行环境下无问题。

(1)Client1单机运行结果:

Please enter the number of powers:1.0

put task 1

try get the result....

Received 1.0 to the powers 1.000000 from 1001 server

Please enter the number of powers:2.0

put task 2

try get the result....

Received 2.0 to the powers 4.000000 from 1002 server

Please enter the number of powers:2.3

put task 3

try get the result....

Received 2.3 to the powers 5.290000 from 1003 server

Please enter the number of powers:3.4

put task 4

try get the result....

Received 3.4 to the powers 11.560000 from 1001 server

Please enter the number of powers:3.5

put task 5

try get the result....

Received 3.5 to the powers 12.250000 from 1002 server

Please enter the number of powers:5.6

put task 6

try get the result....

Received 5.6 to the powers 31.360000 from 1003 server

Please enter the number of powers:

(2)Client2单机运行结果:

Please enter the number of powers:11.1

put task 1

try get the result....

Received 11.1 to the powers 123.210000 from 1001 server

Please enter the number of powers:11.2

put task 2

try get the result....

Received 11.2 to the powers 125.440000 from 1002 server

Please enter the number of powers:11.3

put task 3

try get the result....

Received 11.3 to the powers 127.690000 from 1003 server

Please enter the number of powers:11.4

put task 4

try get the result....

Received 11.4 to the powers 129.960000 from 1001 server

Please enter the number of powers:11.5

put task 5

try get the result....

Received 11.5 to the powers 132.250000 from 1002 server

Please enter the number of powers:11.6

put task 6

try get the result....

Received 11.6 to the powers 134.560000 from 1003 server

Please enter the number of powers:

(3)Worker Server1001单机运行结果:

run task 1.000000*1.000000

run task 3.400000*3.400000

run task 11.100000*11.100000

run task 11.400000*11.400000

(4)Worker Server1002单机运行结果:

run task 2.000000*2.000000

run task 3.500000*3.500000

run task 11.200000*11.200000

run task 11.500000*11.500000

(5)Worker Server1003单机运行结果:

run task 2.300000*2.300000

run task 5.600000*5.600000

run task 11.300000*11.300000

run task 11.600000*11.600000

Step4、在Step3.2.3实现的代码的基础上,将其中涉及的Bind和Connect地址转换为在多主机上运行的分布式计算系统需要的IP+Socket地址,然后在实验室的局域网中选取至少两台服务器或者PC机作为不同地理位置的多机分布式计算系统模型的试验机器,并调试及运行实现的代码。具体内容:

在步骤Step3.2.3中单机上面测试程序无误后,本次实验选用5台分别装了Centos7系统的服务器,分布在同一个局域网,同时都需要安装本次需要的一个python ZeroMQ类包。将实验程序分别在对应服务器上发布,Client1在IP地址为:*.*.*.32,Client2在IP地址为:*.*.*.41,Broker Server发布在IP地址为:*.*.*.44,Worker Server 1发布在IP地址为:*.*.*.82,Worker Server 2发布在IP地址为:*.*.*.45,分别程序中涉及的IP地址更换为上述程序发布的地址,之后测试,得到的结果如下(1)-(4)所示。测试得到的结果与单机版运行的结果基本一致。

(1)IP地址为*.*.*.32的client_101运行结果:

[Client_101@node1~]$python client_101.py

Please enter the number of powers:32.1

put task 1

try get the result....

Received 32.1 to the powers 1030.410000 from 45 server

Please enter the number of powers:32.2

put task 2

try get the result....

Received 32.2 to the powers 1036.840000 from 82 server

Please enter the number of powers:32.3

put task 3

try get the result....

Received 32.3 to the powers 1043.290000 from 45 server

Please enter the number of powers:32.4

put task 4

try get the result....

Received 32.4 to the powers 1049.760000 from 82 server

Please enter the number of powers:

(2)IP地址为*.*.*.41的client_102运行结果:

[Client_102@node2~]$ls

client_102.py

[zhuyanfei@node2~]$vi client_102.py

[zhuyanfei@node2~]$python client_102.py

Please enter the number of powers:41.2

put task 1

try get the result....

Received 41.2 to the powers 1697.440000 from 45 server

Please enter the number of powers:41.1

put task 2

try get the result....

Received 41.1 to the powers 1689.210000 from 82 server

Please enter the number of powers:41.3

put task 3

try get the result....

Received 41.3 to the powers 1705.690000 from 45 server

Please enter the number of powers:41.4

put task 4

try get the result....

Received 41.4 to the powers 1713.960000 from 82 server

Please enter the number of powers:

(3)IP地址为*.*.*.82的Work_Server_1001运行结果:

[Work_Server_1001@www~]$python Work_Server_1001.py

run task 32.200000*32.200000

run task 32.400000*32.400000

run task 41.100000*41.100000

run task 41.400000*41.400000

(4)IP地址为*.*.*.45的Work_Server_1002运行结果:

[Work_Server_1002@node3~]$python Work_server_1002.py

run task 32.100000*32.100000

run task 32.300000*32.300000

run task 41.200000*41.200000

run task 41.300000*41.300000

从上述具体实施步骤中结合相关测试运行结果可以看到代理服务器Broker实现了数据冗余和负载均衡等功能,既不会导致服务器出现资源抢占也不会出现资源长时间闲置。客户端和工作服务器可以随意扩展,只需要知道绑定了固定端口的代理服务器的IP和Socket,实现了很好的扩展性和伸缩性。所以本发明主要体现的是基于ZeroMQ为底层消息传输的多个主机如何高吞吐量、低延迟实现数据传输等功能的跨主机分布式计算系统,并能包含数据冗余及负载均衡等相关功能。该发明方法可以作为分布式计算系统的设计及底层数据传输及负载均衡的方法的参照方案。

上面结合附图及测试运行结果对本发明的具体实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

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