文/宋卫
分布式系统类似于设计模式里的门面模式,对于外部使用人员来说,它是一个整体,而对于分布式系统本身来说,它是由各种计算机、服务器、网络、存储组成的一个组合,分布式系统的目的就是为了满现在大量的计算、存储的需求,分布式系统使得我们能够使用更多相对廉价异构的计算机、服务器及空闲的计算机,通过一种协作的方式来为外部系统或使用者提供更快捷更方便的服务,在分布式系统中,数据和计算被分成不同的小任务,通过负载均衡的调度和网络传输的方式在各个计算机节点上进行计算、存储和传输,最终输出计算结果进行存储,并为外部提供服务。
通信机制是分布式系统中非常重要的功能,通信机制决定了计算机、服务器之间,能否互相通信组成集群。负载均衡则决定了任务分配是否合理,则决定了分布式系统处理问题的能力,目前业界已经有很多成熟的通信机制及优秀的适应各种环境的负载均衡的算法,可以借鉴使用。
分布式系统之所以能够成为一个系统,作为一个整体为用户提供服务和存储,必须依赖以网络通信,本文以Java语言为基础,介绍网络通信间的基本原理及一些常用的通信协议。
通信就是把信息完整有效的从一台计算机传输到另一台计算机。在计算机通信领域涉及到模电与数电的转换,以太网技术等,涉及到硬件设备有网卡、网线、路由器、转换器,基站等等,一般是有发送端把信息转换成数字信号通过发送设备发送出去,接受端再通过相应的网络设备进行接受。计算机的网络模型有 OSI(Open System Interconnection)七层网络模型和TCP/IP四层模型。
七层网络模型主要有:
如图1所示,物理层直接涉及到物理设备如网卡、交换机、路由器等,数据链路层则包含设备驱动程序等,在往上层是一些传输协议,最终有应用层使用这些协议。
TCP/IP四层模型跟OSI七层模型的对比关系如图2。
无论是OSI七层模型还是TCP/IP四层模型,应用层只关心和处理特定应用程序的细节,病不关系底层的通信通过机协议。在分布式系统中一般情况下我们会处理好底层传输协议及网络、链路层的应用假定网络层、传输层、链路层是稳定可用,并性能良好的,在分布式通信中一般大多关注上层的应用协议。
应用层的协议又有HTTP协议、FTP协议、SOAP协议、XMPP协议、SMTP、POP3协议等等,基于这些协议在分布式的通信服务中又有同步请求、异步请求、发送消息等不同的方式。在现在很多分布式系统微服务的应用场景中,大多使用REST调用,RPC调用方式来实现服务之间同步请求调用,使用JMS来发送消息,如ActiveMQ、RabittMQ等。
1.2.1 HTTP/HTTPS
HTTP(Hyper Text Transfer Protocol)超文本传输协议是最常见的一个协议,我们打开一个浏览器浏览一个网页使用的就是HTTP协议。在不断的发展过程中上层的应用使我们赋予了HTTP更丰富的含义,让HTTP协议更加丰富,语义化更强,有了POST、PUT、GET、DELETE、OPTION、TRACE、HEAD等不同的请求方式,分别表示增加、修改、查找、删除、选择|试探、跟踪、头部。近些年已经完善正在应用的HTTP 2.0日渐成熟。
通过HTTP协议人们可以上传下载文件、浏览网页、传送XML数据、JSON数据。在现在微服务分布式架构中HTTP协议也经常用于内网微服务子系统之间的互相调用。
由于HTTP协议没用使用任何加密措施,数据多以明文形式展示,容易受到拦截跟攻击,特别是涉及到敏感数据时人们希望能有更加安全和保密的方法保证数据安全,所以在基于HTTP协议及SSL/TSL加密的基础上产生了HTTPS协议。可以把HTTPS协议理解为HTTP协议的安全加强版,当然HTTPS协议也涉及到很多加密协议跟算法如秘钥,私钥公钥,加密协议等。
1.2.2 RPC
RPC(Remote Procedure Call)远程过程调用,RPC最初是有SUN提出的,后经过IETF ONC修订成为IETF标准协议,使用RPC协议,你不需要了解底层的网络技术协议,就可以从远程的计算机上获取服务。RPC多用于客户机/服务器的模式下,由于不需要关注传输层及应用层,RPC使得开发更加容易,在现在的分布式系统微服务中RPC也得到了广泛的应用。
RPC也有缺陷,由于传输的数据包的大小及网络抖动,需要重新多传额外的包,及系统开销等温提,Google提供了更高性能的gRPC调用框架,gRPC使用了基于HTTP2.0协议使用了Netty NIO的一些技术及protobuf等数据压缩技术是的传输个数据处理更快捷,更高效。
1.2.3 SOAP
SOAP(Simple Object Access Protocol)简单对象访问协议,是一种基于XML的简单的、轻量级协议。SOAP协议规范由4个主要的部分组成。
第一部分:SOAP封装(Envelop)。
第二部分:SOAP编码规则(Encoding Rules)。
第三部分:SOAP RPC表示(RPC Representation)。
第四部分:SOAP绑定(Binding)。
在早期的环境中SOAP协议多用于分布式计算中,提供跨语言的交换信息,它借助于XML定义的良好的数据格式,为不同的语言服务提供接口。由于需要解析XML,SOAP协议相对效率不高,近些年JSON数据的广泛应用以及越来越受到各种编程语言及系统喜欢的数据格和REST协议的提出,SOAP协议正在被更新REST替换。
1.2.4 JMS
JMS(Java Message Service) Java消息服务,是实现系统解耦,提供系统处理性能的很重要的一个组件。前几节介绍的无论HTTP、RPC、SOAP都属于是同步调用,当然可以使用多线程的方式来实现异步。但真正能实现系统解耦、提供异步消息的还是使用JMS服务。
JMS协议规定JMS支持(p2p)点对点的模式、(pub/sub)发布/订阅模式,
点对点模式就是一个生产者生产消息,一个消费之消费消息,生产者跟消费者是一对一的关系。
发布订阅模式就是一个生产者生产消息,多个消费者消费消息,生产者跟消费者是一对多的关系。
在分布式系统,使用消息做中间件时有时候会出现消息丢失或多发的情况,这时可以使用缓存或持久化的方式把消息进行存储方便校验跟检查。
在分布式系统中,整个系统的效率,并不是由单台服务器的所决定的,而是多台服务器共同协作的结果。分布式系统的能力受到单台服务器的性能、网络延迟、任务的分配、资源调度等各种因素的影响,所以在整个系统中网络负载均衡,任务调度显得尤其重要。常用的网络负载均衡的算法有随机法、轮询法、加权法、散列法、最少连接法、最低缺失法、最快响应法,通过这些基础方法的又可以组合使用,形成更高级一些负载均衡方法。
Random随机法顾名思义,就是采用随机的算法对集群的中的各个服务器节点进行调度,随机方法又可以分为完全随机和加权重随机。完全随机认为集群中的机器性能一样、处理能力平等对带每一台机器,完全随机。当随机法和加权法结合时,还可为不同的机器设置不同的权重进行随机,权重大的随机概率高,权重小的随机概率低,权重的设置根据机器的性能和负载,人为的进行设置。
Round Ribbon 轮询法,可以把集群中的服务器看成是一个环装的结构,依次对环上节点进行调度,轮询法和随机法和类似,不同之处在岁轮询法采用一种顺序调用的方式。在使用轮询法时也可以为不同的节点进行加权,当轮询法和加权法结合时,称为加权轮询,加权轮询对权重高的在调度时也会多进行调度。
比如设A的权重为1,B权重2,C权重3,在进行加权调度时顺序会是:
A B B C CC,A B B C CC,A……依次轮询下去。
Weight加权法,是负载均衡中最基础的一个方法,加权法顾名思义就是对集群中不同的机器进行不同的权重评估,权重评估的依据有机器的CPU、内存、磁盘读写、网卡带宽、网络负载等,还有人为的一些评估。加权法经常跟其他的算法一起使用组成更高级的一些负载均衡算法。
Hash散列算法也叫哈希算法,常用的哈希算法有普通哈希算法、一致性哈希算法,基于IP的哈希算法和基于URL的哈希算法。其中基于IP及URL的哈希算法都属于普通哈希算法,基本原理是通过计算IP或URL的哈希值和总权重余数得到请求需要路由到的集群节点上。一致性哈希算法是基于虚拟节点的,一旦一个节点挂掉之后,该节点的请求会平摊到其他节点上不会造成某个节点压力过大出现雪崩的情况,变化比较平滑不会有大的波动。
图1
图2
Least Connect 最少链接算法,是指从集群服务器列表中找到链接最少的机器,把请求转发大这台机器上。这就需要调度器知道或者记录集群中那台机器链接数最少,增加了管理的开销,同时如果多台机器连接数都是相同的,这时可以结合加权的方法来进行选择。这时候会成为带权重的最少链接算法,当链接相同时,优先选择权重高的节点。
本文介绍了分布式系统中常用的通信协议,介绍了基本的常用的网络负载均衡的算法,在一个分布式系统中通信机制直接决定了系统集群的稳定与否。在介绍了通信机制后进一步介绍了分布式系统中常见负载均衡调度算法,在分布式系统中,服务器之间的异构化,处理能力的不同,必须要有一个良好的调度算法来均衡各个服务器之间的负载,合理的进行任务调度及分配,只有这样才能是一个分布式系统变的稳定健壮提高系统的处理能力及吐出量,最后基于这些基础知识本文为进一步学习机研究分布式系统打下了良好的基础。