服务端设计中的名词解释

参考文献

1. 常见名词

1.1 负载均衡 (Load Balancing, LB)

在分布式系统中,负载均衡(Load Balancing)是一种将任务分派到多个服务端进程的方法。例如,将一个HTTP请求派发到实际的Web服务器中执行的过程就涉及负载均衡的实现。一个HTTP请求到达Web服务器,这中间涉及多个过程,也存在多种不同负载均衡的方法。下图1是负载均衡的基本原理图,图1中客户端的请求经过达负载均衡器(Load Balancer)的分派,被指定的服务器进程进行处理。
在这里插入图片描述
实现负载均衡主要有两个目的:

  • 第一个目的是将任务的处理负载均摊到不同的进程,以减少单一进程的负载,以达到处理能力水平扩容的目的。
  • 第二个目的则是提高容错能力。在线上正式环境中,机器宕机或者进程异常导致服务不可用是常有的现象。在实现负载均衡的系统中,多个服务器进程提供同样的服务,一个进程不可用的情况下,任务会被负载均衡器派发到其他可用的进程,以达到高可用的目的。

在多台不同的服务器中部署相同的服务进程,通过负载均衡对外提供服务,这组进程也称为“集群”(cluster)。

1.1.1 DNS负载均衡

我们知道,DNS提供域名解析服务,当我们访问某个站点时,实际上首先需要通过该站点域名的DNS服务器来获取指向该域名的IP地址,在这过程中,DNS服务器完成了域名到IP地址的映射。由于这一映射可以是一对多的关系,因此DNS服务器可以充当负载均衡器的作用,DNS服务器在派发IP地址时,正是使用轮流派发的方式来实现的。
在这里插入图片描述
优点

  • 由于DNS系统本身是一个分布式系统,相对来说它不存在性能和吞吐能力的限制,故使用DNS来做负载均衡并不需要担心负载均衡服务器的处理能力
  • 可以根据用户IP进行智能解析,DNS服务器可以在所有可用的A记录中寻找离用户最近的一台服务器为用户提供服务

缺点

  • DNS服务器并不知道后端服务器的情况,如果后端服务器宕机,而用户的请求继续被分配到这个后端服务器,会导致无法响应用户的请求
  • DNS服务器依然没有将后端服务器的负载差异考虑进去
  • DNS服务器存在缓存,当需要更新请求的分配时,新增一个IP或者删除一个IP并不能立即生效

1.1.2 HTTP重定向

HTTP重定向服务器是一台普通的Web服务器,用户的请求先到达重定向服务器,这台服务器会挑选一台后端服务器的地址(例如使用轮询的方式),并将该地址写入HTTP重定向响应结果中(以响应状态码302返回)返回给用户。用户将根据这个新的地址重新发送请求到选中的服务器上。选中的服务器会处理用户请求,并将结果返回给用户。
在这里插入图片描述
通过重定向服务器的处理,用户请求被分配到不同的后端服务器上进行处理,实现了负载均衡的目的。

优点

  • HTTP重定向负载均衡的方法实现上比较简单。

缺点

  • 增加了用户的时延,因为访问请求需要进行两次往返
  • 重定向服务器没有将后端服务器的负载差异考虑进去,有些后端服务器可能在相当繁忙时仍然接收到较多的请求
  • 重定向服务器的并发处理能力制约着整个系统的并发处理能力如果重定向服务器出现故障,站点就会瘫痪

由于存在这些缺点,HTTP重定向通常都会与其他一种或多种负载均衡技术结合使用。

1.1.3 反向代理

反向代理服务器的工作主要是转发HTTP请求,因此它工作在HTTP层,也就是OSI七层结构中的应用层(第七层),所以基于反向代理的负载均衡也称为七层负载均衡。利用反向代理服务器进行负载均衡,如下图所示。
反向代理实现负载均衡

反向代理服务处于后端服务器的前面,由于需要直接受用户的请求,故反向代理服务器需要一个外网IP。而后端服务器并不直接对外提供访问,因此后端服务器并不需要外网IP。反向代理服务器通过内网IP与后端服务器进行通信。上图中,浏览器的请求到达反向代理服务器114.113.200.84,反向代理服务器收到请求后,根据负载均衡算法计算得到一台真实的后端服务器地址10.0.0.1,并将请求转发到这台后端服务器。10.0.0.1处理请求后将响应返回给反向代理服务器,再由反向代理服务器将该响应返回给用户。
常见的反向代理服务器包括Nginx,Apache,Haproxy等。
优点

  • 部署比较简单,使用常见的反向代理服务器软件即可部署反向代理服务器
  • 调度策略丰富,例如,可以为不同的后端机器设置不同的分配权重, 这样处理能力高的机器可以分配到较多的任务,达到能者多劳的目的
  • 反向代理服务器可以让用户在一次会话周期内的所有请求始终分配到一台特定的后端服务器(粘滞会话)

缺点

  • 由于反向代理工作在HTTP层,所有请求都需要经过反向代理服务器的处理,后端服务器的响应结果也必须经过反向代理服务器传送给用户,故这种负载均衡方式要求反向代理的并发处理能力较高。

1.1.4 IP负载均衡

我们已了解前面几种负载均衡的方法,这些负载均衡都是工作在HTTP层,那么,能否在HTTP层以下来实现负载均衡呢?答案是肯定的。事实上,在数据链路层(第二层),网络层(第三层),以及传输层(第四层)都可以实现不同机制的负载均衡。但与HTTP层机制不同,这些负载均衡调度的工作必须由Linux内核来完成,即网络数据包在从内核缓冲区进入用户进程空间前,已完成转发的工作。

在网络层通过修改请求目的地址进行负载均衡的流程如下图所示。
在这里插入图片描述

用户请求到达负载均衡服务器114.113.200.84,负载均衡服务器在操作系统内核获取网络数据包,根据负载均衡算法计算得到一台真实的后端服务器10.0.0.1,然后将数据包的目地址改为10.0.0.1,不需要用户进程处理。后端服务器10.0.0.1处理完成后,响应数据包返回到负载均衡服务器,负载均衡服务器再将数据包源地址修改为自身的IP地址(114.113.200.84)发送给用户。

优点

  • IP负载均衡在内核进程完成数据分发,处理性能得到了很大的提高。

缺点

  • 由于所有请求和响应都要经过负载均衡服务器,系统的最大吞吐量仍然受到负载均衡服务器网卡带宽的限制。对于提供下载服务或者视频服务等需要传输大量数据站点,IP负载均衡的方式是难以满足需求的。

1.1.5 数据链路层负载均衡

数据链路层负载均衡通过修改数据帧的MAC地址来实现负载均衡的目的。数据链路层是OSI网络模型的第二层,由于数据链路层负载均衡的方法走的是MAC层的协议,因此需要负载均衡服务器和后端服务器处在同一个二层(同一个广播域)之中。
数据链路层负载均衡的工作流程如下图所示:
在这里插入图片描述
上图所示的数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP址,只修改MAC地址,通过配置后端服务器与负载均衡服务器具有相同的IP地址,从而达到不修改数据包的源IP地址和目的IP地址就可以进行数据分发的目的。由于后端服务器的IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换,可以将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。
图5中,用户请求到达负载均衡服务器114.113.200.84,负载均衡服务器将请求数据的目的MAC地址必为00.0c.29.d2,并不修改数据包目的IP地址,由于后端服务器与负载均衡服务器并有相同的IP地址,因此数据可以正常传输到达00.0c.29.d2对应的服务器,该服务器处理完成后将响应数据直接返回给用户,不需要经过负载均衡服务器。

在Linux平台上最好的数据链路层负载均衡的开源产品是LVS(Linux Virtual Server)。LVS有三种运行模式,分别为NAT模式,TUN模式,DR模式。DR模式正是运行在数据链路层,通过修改数据帧的MAC地址来实现负载均衡的。

优点

  • 数据链路层负载均衡工作在Linux内核进程,性能很高
    后端服务器的响应不需要再次经过负载均衡服务器,解决了负载均衡服务器网卡流量瓶颈的问题

缺点

  • 可配置性较高,并不支持复杂的调度策略。

1.2 四层和七层转发

基于OSI7层模型(由低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)。如果在传输层实现负载均衡就是4层转发。如果在应用层实现负载均衡就是7层转发。

1.2.1 4层和7层的区别

所谓四层负载均衡就是使用IP加端口的方式进行路由转发;七层负载均衡一般是基于请求URL地址的方式进行代理转发。同理,还有基于MAC地址信息(虚拟MAC地址到真实MAC地址)进行转发的二层负载均衡和基于IP地址(虚拟IP到真实IP)的三层负载均衡。

四层负载均衡具体实现方式为:通过报文中的IP地址和端口,再加上负载均衡设备所采用的负载均衡算法,最终确定选择后端哪台下游服务器。以TCP为例,客户端向负载均衡发送SYN请求建立第一次连接,通过配置的负载均衡算法选择一台后端服务器,并且将报文中的IP地址信息修改为后台服务器的IP地址信息,因此TCP三次握手连接是与后端服务器直接建立起来的。

七层服务均衡在应用层选择服务器,只能先与负载均衡设备进行TCP连接,然后负载均衡设备再与后端服务器建立另外一条TCP连接通道。因此,七层设备在网络性能损耗会更多一些。

1.2.2 常见的负载均衡设备

  • 四层: F5、LVS等
  • 七层: nginx、apache等

1.3 正向代理和反向代理

1.3.1 什么是正向代理

国内通过一些技术手段去访问谷歌就是一个很好的正向代理的例子。客户端并不是直接去访问服务端,而是将请求发放给代理服务器,代理服务器来转发客户端的请求到服务端,但是这时候的服务端并不清楚是什么样的客户发送来的请求。整个过程如下图所示:

在这里插入图片描述
再举一个例子:
比如A向马借钱,但是马并不借。这时候A通过自己的朋友B向马借钱,马借给了B,然后B又把钱给了A。在这个过程中,马并不知道A是借钱人,而B在整个过程中就起到一个代理角色,也就是正向代理,B替A办事。但是整个过程马并不知道真正的借钱人是谁。

日常生活中,我们说的代理都是正向代理。正向代理的过程中,他隐藏了真实请求的客户端,服务端不知道真实的客户端是谁。客户端请求的服务都被代理服务器替代来请求。

1.3.2 什么是反向代理

举一个例子:
当拨打10000客服电话时,我们不关心谁会接听我们的电话,我们只关心问题能不能得到解决。当我们拨打10000电话时,10000总机会为我们分配一个空闲的客服来解答我们的问题。这个过程中10000总机就是我们说的反向代理。客户不知道真正提供服务的人是谁。

反向代理隐藏了真实的服务端,当我们请求www.baidu.com的时候,就像拨打10000电话,背后可能有成千上万的服务器为我们服务,但是具体是哪一台我们并不知道,也不需要知道。那么这里的www.baidu。com就是我们的反向代理服务器。反向代理服务器会帮我们把请求转发到真实的服务器哪里去。Nginx就是很好的反向代理服务器,用来做负载均衡。
在这里插入图片描述

1.3.3 正向代理和反向代理的区别

正向代理的代理对象是客户端,反向代理的对象是服务端。

1.4 HTTP代理

1.5 重定向和转发

1.5.1 重定向(redirect)是什么

重定向是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的URL再重新发送新请求。该过程如下图所示:
在这里插入图片描述

1.5.2 转发(forward)是什么

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程是在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址。一句话,转发就是由服务器端进行的页面跳转。该过程如下图所示。
在这里插入图片描述

1.5.3 转发和重定向的区别

解释一

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

解释二
重定向,其实是两次request,
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

例子:

请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。

例子:

解释三
假设你去办理某个执照,

  • 重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

  • 转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值