负载均衡

发布于 2023-07-05  5071 次阅读


基础入门

代理

用户访问网站,但却不希望网站跟踪到我们的真实ip,所以就找一个proxy(代理)通过代理访问网站,网站以为代理的ip就是用户的ip

反向代理

网站服务器希望对用户屏蔽高可用、屏蔽web-server扩展、web-server内网ip等细节,于是找到一个proxy隔在中间,此时proxy代表web-server集群,用户以为proxy的ip就是被访问web-server的ip,(web-server是集群,具体访问了哪个web-server,用户不知道),由于web-server集群有多台,此时反向代理服务器要具备负载均衡的功能。

几层负载均衡来源于OSI七层模型/TCP/IP五层模型

  • 负载均衡集群使负载可以在计算机集群中尽可能平均的分摊处理

根据所采用的设备对象分为软/硬件负载均衡,应用的OSI网络层次分为网络层次上的负载均衡,应用的地理结构分为本地/全局负载均衡

应用的OSI网络层次负载均衡

二层负载均衡(mac)

数据链路层mac地址,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应

三层负载均衡(ip)

网络层ip地址

一般采用虚拟ip地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应

四层负载均衡

传输层port

在三层负载均衡的基础上,用ip+port接受请求,再转发到对应的机器

七层负载均衡

应用层url ip+port

根据虚拟的url或ip,主机名接受请求,再转向相应的处理服务器

四层负载均衡(基于IP+端口的负载均衡)

主要通过报文的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服务器

轮询算法

静态

1.RR 轮询

Round-Robin:调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,均等对待每一台服务器,不管其他情况

2.WRR加权轮询

根据真实服务器不同处理能力,来调度访问请求,能保证处理能力强的服务器,处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

3.DH 目标地址hash

根据请求的目标ip地址,作为散列键,从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空

动态

4.LC最少连接

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用最小链接能较好地均衡负载

5.WLC加权最少连接

在集群系统中的服务器性能差异较大情况下,调度器采用"加权最少连接"调度算法,具有较高权值的服务器将承受较大比例的活动连接负载,调度器自动问询真实服务器负载情况,动态调整权值

6.LBLC基于本地的最少连接

针对目标IP地址的负载均衡,主要用于Cache集群系统,根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器,若服务器不存在,或者该服务器超载且有服务器处于一半工作负载,则用最少连接原则选出可用的服务器

7.LBLCR带复制的基于本地的最少连接

也是针对目标IP地址的负载均衡,主要用于Cache集群系统,它与LBLC算法的不同之处在于他要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标ip地址到一台服务器的映射

该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小链连"原则从服务器组中选出一台服务器,若超载,则按"最小连接原则"从集群中选出一台服务器,将该服务器加入到服务器组中。当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程序。·

通过三层ip+四层端口号

来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理

TCP

负载均衡设备在接收到第一个来自客户端的SYN请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改,直接转发给该服务器,TCP的连接建立即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改

七层的负载均衡(基于虚拟的URL或主机IP的负载均衡)

七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

七层在四层基础上,考虑应用层的特征

同一个Web服务器的负载均衡,除了根据IP+80端口辨别是否需要处理的流量还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡

负载均衡设备如果要根据真正应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接收到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下更类似于一个代理服务器。负载均衡和前端客户端以及后端的服务器会分别建立TCP连接。从这个技术原理看,七层负载均衡明显的对负载均衡设备要求更高,处理七层的能力也必然会低于四层模式

LVS工作内核模型及工作模式

  • 当客户端的请求到达负载均衡器的内核空间时候,首先会到达prerouting
  • 当内核发现请求数据包的目的地址是本机时,将数据包送往 INPUT 链
  • LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
  • 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
  • 最后经由POSTROUTING链发往后端服务器。

四种工作模式

NAT模式

把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS(RealServer)的IP地址,转发至此RS来处理,RS处理完成后把数据交给负载均衡器,负载均衡器再把数据包的源IP地址改为自己的VIP,将目的地址改为客户端IP地址

优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址

缺点:扩展性有限。当服务器节点增长过多时,负责均衡器将成为整个系统的瓶颈,所有请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢

DR模式(直接路由模式)

负载均衡器和RS都使用同一个IP对外服务。但只有DB对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默,网关会把对这个服务IP的请求全部定向给DB,而DB收到数据包后根据调度算法找出对应的RS,把目的MAC地址改为RS的MAC并将请求分发给这台RS,RS收到数据包处理完成后,由于IP一致,直接将数据返给客户,等于直接从客户端收到这个数据包无异,处理后直接返回给客户端

不足:要求负载均衡器的网卡必须与物理网卡在一个物理段上

TUN(IP隧道模式,不常用 )

互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户,减少了负载均衡器的大量数据流动,负载均衡器不再是系统瓶颈就能处理海量请求,在公网可以进行不同地域的分发。

缺点,隧道模式RS节点需要合法IP,需要所有服务器支持"IP Tunneling"协议,服务器可能只局限在部分Linux系统上

FULL-NAT模式(双向转换模式、不常用)

原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,又内部路由路由到Director,Director接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP

请求使用DNAT,响应使用SNAT

  • ip:vip dip:rip
  • rip:dip vip:cip

参考链接:

  1. (83条消息) 负载均衡(四层) LVS(看完就能去上班)可以实现四层负载均衡的有哪些咸蛋黄派的博客-CSDN博客
  2. LVS四层负载均衡集群(7)轮询算法51CTO博客netty集群负载均衡
  3. 一分钟了解四层/七层反向代理 | 架构师之路 - 掘金 (juejin.cn)


星星温柔泛滥,人间至善