跳转至

负载均衡

调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为负载均衡(Load Balancing)

无论在网关内部建立了多少级的负载均衡,从形式上来说都可以分为两种:

  • 四层负载均衡,性能高
  • 七层负载均衡,功能强

四层负载均衡其实是多种均衡器工作模式的统称,四层是指这些工作模式的共同特点是维持着同一个TCP连接,而不是说它只工作在第四层,实际主要都是工作在二层(数据链路层,改写 MAC 地址)和三层(网络层,改写 IP 地址)上,出于习惯和方便,统称为四层负载均衡。

从实现角度来看,负载均衡器的实现分为硬件均衡器和软件均衡器两类,而软件均衡器又分为:

  • 直接建设在操作系统内核的均衡器:LVS(Linux Virtual Server)
  • 应用程序形式的均衡器:Nginx、HAProxy、KeepAlived等

负载均衡的两大职责:

  • 选择谁来处理用户请求,即均衡策略,涉及各种均衡算法
  • 将用户请求转发或者代理出去

OSI 的下三层是媒介层,负载均衡主要是做转发,上四层是主机层,负载均衡主要是做代理

数据链路层负载均衡

数据链路层负载均衡所做的工作,是修改请求的数据帧中的MAC目标地址,让用户原本是发送给负载均衡器的请求的数据帧,被二层交换机根据新的 MAC 目标地址转发到服务器集群中对应的服务器的网卡上,这样真实服务器就获得了一个原本目标并不是发送给它的数据帧。

20220102232120

三角传输模式,也叫单臂模式,或者直接路由

使用这种负载均衡模式时,需要把真实物理服务器集群所有机器的虚拟IP地址配置成与负载均衡器的虚拟IP一样,这样经均衡器转发后的数据包就能在真实服务器中顺利地使用。

网络层负载均衡

20220102232159

IP 隧道模式,新创建一个数据包,把原来数据包的 Headers 和 Payload 整体作为另一个新的数据包的 Payload,在这个新数据包的 Headers 中写入真实服务器的 IP 作为目标地址,然后把它发送出去。经过三层交换机的转发,真实服务器收到数据包后,必须在接收入口处设计一个针对性的拆包机制,把由负载均衡器自动添加的那层 Headers 扔掉,还原出原来的数据包来进行使用。这样,真实服务器就同样拿到了一个原本不是发给它(目标 IP 不是它)的数据包,达到了流量转发的目的

这种模式要求真实服务器必须支持IP隧道协议,而且必须保证所有的真实服务器与均衡器有着相同的虚拟 IP 地址,因为回复该数据包时,需要使用这个虚拟 IP 作为响应数据包的源地址,这样客户端收到这个数据包时才能正确解析。

20220102232210

NAT(Network Address Translation 网络地址转换)模式,直接把数据包 Headers 中的目标地址改掉,修改后原本由用户发给均衡器的数据包,也会被三层交换机转发送到真实服务器的网卡上。这种模式比较简单,但在流量压力比较大的时候,负载均衡会带来较大的性能损失。

应用层负载均衡

七层负载均衡器属于反向代理中的一种

代理,根据哪一方能感知到的原则,可以分为:

  • 正向代理:代表客户端与服务器通信的代理服务
  • 反向代理:代表真实服务器来与客户端通信的代理服务
  • 透明代理:透明即指两端都意识不到,配置在网络中间设备上的代理服务(比如架设在路由器上的透明翻墙代理)