乐趣区

关于负载均衡:深入浅出-LVS-负载均衡系列一NATFULLNAT-模型原理

LVS(Linux Virtual Server)是一个虚构服务器集群零碎。工作在 OSI 模型的传输层,即四层负载平衡。LVS 自身实现了 NAT、DR、TUN 模型,这些模型仅做数据包的转发,而不会与客户端建设连贯,老本低效率高。FULLNAT 基于 NAT 实现,LVS 自身不反对,须要额定对内核打补丁后能力应用。

本系列依照负载均衡器对数据包的解决形式分类,从计算机间通信的角度登程,浅谈 NAT、FULLNAT、DR、TUN 模型的实现原理。

两台计算机如何在互联网中通信

在理解 LVS 负载平衡之前,先要搞清楚两台计算机如何在互联网中通信。茫茫互联网中,两台计算机如何能力找到对方?

咱们先来看看,快递是如何被快递小哥完满地送到你手上的。依据你填写的地址,快递先送到你所在的省市区,接着在以后省市区找到你的门牌号,最初依据门牌号和姓名,再亲手把快递交给你。

两台计算机在互联网中的通信也是如此。首先须要晓得单方的 IP 地址,即省市区,其次须要晓得单方的 MAC 地址,即门牌号。MAC 地址标记着惟一的计算机。在同一台计算机上,可能有多个不同的服务,如何能像快递小哥依照姓名找到你一样,在计算机上找到对应的服务呢?没错,就是依照端口号。

这样,通信中每台计算机须要提供的信息就很清晰了,即 IP 地址、MAC 地址、端口号。总结一下,计算机之间通信必须的六个因素就是,源 IP 地址、端口号、源 MAC 地址,指标 IP 地址、端口号、指标 MAC 地址。

假如计算机 A 和计算机 B 在上述的网络拓扑图(不在同一局域网)中。能够很清晰地看到 计算机 A 和 计算机 B 通信须要五个步骤,其中 ①② 和 ④⑤ 的原理雷同。当初咱们来看看具体的每个步骤在计算机的世界中是如何实现的。

首先 A 和 B 的 IP 地址和端口号是已知的,即一个数据包从哪来要发往哪去。所以当初的问题是:A 如何能晓得 B 的 MAC 地址?

最简略的形式就是 A 保留网络中全副设施的 MAC 地址,在发送时查问一下,这样就能失去 B 的 MAC 地址。然而网络中的设施有几十亿个,还在一直地增长,显然这种形式是不可取的。如果依照快递发送过程中,在每个驿站之间进行转移,这样只须要晓得该发往的下一目的地在哪里,最终也能将快递胜利地交到你的手上。在理论网络中发送数据包也是这样,当初的指标就是确定“下一个目的地”的 MAC 地址。

步骤 ①②:发送数据包至网关 A 不晓得 B 的 MAC 地址,且 A 和 B 也不在同一个局域网中。这时 A 会依据 ARP 协定先收回一个播送包,即指标 MAC 地址是 FF:FF:FF:FF:FF:FF 的数据包。当 交换机 1 收到这个播送包之后,会将这个数据包转发给其余端口,并且记录 A 的 MAC 地址和交换机端口之间的映射关系,后续再看到这个 MAC 地址,就晓得该从哪个端口转发进来。当 路由器 1 收到播送包后,会将本人的 MAC 地址返回。A 接管到返回后,就晓得“下一个目的地”的 MAC 地址了。A 从新发送数据包,将指标 MAC 地址填写为 路由器 1 的 MAC 地址,并在本地的缓存表中记录返回的 MAC 地址。

查看以后设施缓存表里已存的 MAC 地址:arp -aARP 协定的目标就是找到“下一个目的地”的 MAC 地址,即 IP 地址和 MAC 地址之间的映射关系。当两台设施同处于一个局域网时,“下一个目的地”就是指标设施的 MAC 地址,当两台设施不处于同一个局域网时,“下一个目的地”就是网关的 MAC 地址。

步骤 ③:网关间跳转通过步骤 ①②,此时 路由器 1 收到的数据包为 {A_IP、PORT、A_MAC} ➡ {B_IP、PORT、路由器 1_MAC}。收到数据包后,路由器 1 查看本人的路由表,如下图所示。

查看以后设施设置的路由表:route -n

路由器 1 会将 B_IP 与 路由表中每条记录的子网掩码(Genmask)做按位与运算。如果失去的后果和目标网络(Destination)雷同,那么“下一个目的地“的 MAC 地址,就是配置的网关(Gateway)的 MAC 地址,这种找到相邻网络的形式叫做“下一跳机制”。如果网关的地址为 0.0.0.0,阐明能够在局域网中间接通信,不须要“下一跳”。至此,再次找到了“下一个目的地”的 MAC 地址,即 路由器 2 的 MAC 地址。此时 路由器 2 收到的数据包为 {A_IP、PORT、路由器 1_MAC} ➡ {B_IP、PORT、路由器 2_MAC}。步骤 ④⑤ 和 ①② 的原理雷同,在这里就不赘述了。

下一跳的目标就是找到“下一个目的地”,即下一步该达到哪里,偏重“路线”的抉择,并由此获取到对应的 MAC 地址,继续传送数据包。

总结一下:1. 应用 ARP 协定找到网关进口或同一局域网内设施的 MAC 地址 2. 依照路由表的每条规定和 指标 IP 地址做按位与运算,找到相邻网关入口的 MAC 地址 3.“下一个目的地”和以后地址都仅仅相邻一步,且每次“跳跃”后的源 MAC 地址 和 指标 MAC 地址都会产生对应的替换 4. 数据包中,IP 地址指明终点起点,MAC 地址指明跳跃的节点,端口号指明对应的应用服务当然,光是找到对方还不够,还须要一个约定的交换形式,平时咱们所熟知的各种协定,都是计算机「约定的交换形式」。

LVS 负载平衡

随着应用互联网的设施一直增长,服务端对应接管到的 HTTP 申请更是呈指数型的增长。当一台服务器无奈承载十分大的申请量时,应用多台服务器来摊派申请。将申请摊派给多台服务器的行为,就称之为负载平衡。

ULB(UCloud Load Balancer)是 UCloud 提供的负载平衡服务,可能为多个主机或其它服务实例提供基于网络报文或代理形式的流量散发性能。在高并发服务环境下,通过 ULB 构建由多个服务节点组成的服务集群。服务集群可能扩大服务的解决及容错能力,并主动打消因为繁多服务节点故障对服务整体的影响,进步服务的可用性。ULB 针对七层协定反对 HTTP、HTTPS 协定(类 Nginx 或 HAPproxy);四层协定反对 TCP 协定及 UDP 协定(类 LVS)。

从网络中计算机通信的角度,而非应用更下层的利用(如 Nginx)登程,搭建四层负载均衡器后,数据包的发送链路为:CIP ➡ VIP ➡ DIP ➡ RIP,即 客户端 IP ➡ 虚构 IP ➡ 散发 IP ➡ 实在服务器 IP。对于客户端来说,只须要晓得申请达到的地址是 VIP,不须要思考负载,即 CIP ➡ VIP 是固定的。

所以负载均衡器要做的事件,就是将 CIP 发送到 VIP 的数据包,经由 DIP 转发给 RIP,服务响应后再将响应的数据包返回给 CIP。

NAT 模式

红色示意收回的数据包,绿色示意返回的数据包,黄色示意负载均衡器批改的内容,虚线示意通过 N 个下一跳,即能够不在同一局域网内,实线示意只能“跳跃一次”,即必须在同一局域网内。

1. 当计算机收回一个申请的数据包达到负载均衡器后,负载均衡器将发送数据包的 {指标 IP 地址、端口号、指标 MAC 地址} 转换为 {某台实在服务器的 IP 地址、实在服务的端口号、实在服务器的 MAC 地址},其余信息不变。这种只转换数据包的指标设施信息,而不批改数据包的源设施信息,称之为 DNAT,即指标网络地址转换。

2. 实在服务器收到申请的数据包,返回响应的数据包:{某台实在服务器的 IP 地址、实在服务的端口号、实在服务器的 MAC 地址} ➡️ {原始申请的 IP 地址、端口号、跳跃的 MAC 地址}。所以此时在服务器上查看 TCP 连贯为:CIP ➡️ RIP。

3. 实在服务器返回的数据包的“下一个目的地”必须是负载均衡器。如果返回数据包间接返回给客户端,客户端发现返回数据包的源设施信息和收回数据包的指标设施信息不统一,将会抛弃返回数据包。所以实在服务器的默认网关必须是 DIP,保障返回数据包的“下一个目的地”是负载均衡器。

4. 当返回的数据包达到负载均衡器后,负载均衡器将返回数据包的 {原始申请的 IP 地址、端口号、跳跃的 MAC 地址} 转换为原始申请的 {指标 IP 地址、端口号、指标 MAC 地址}。这种只转换数据包的源设施信息,而不批改数据包的指标设施信息,称之为 SNAT,即源网络地址转换。

5. 负载均衡器返回数据包给客户端。

总结一下 NAT 模式的特点:1. 批改数据包的「源 IP 地址」或「指标 IP 地址」,能够对端口进行转发 2. 实在服务器的默认网关必须是负载均衡器,所以实在服务器和负载均衡器必须在同一个局域网内 3. 所有的申请数据包、响应数据包都要通过负载均衡器

FULLNAT 模式

NAT 模式中,负载均衡器和实在服务器必须在同一局域网内,但在理论的开发过程中,实在服务器可能散布在不同的网段,甚至不同的城市。如何能将 NAT 模式利用在实在服务器散布在不同网段的场景下?

红色示意收回的数据包,绿色示意返回的数据包,黄色示意负载均衡器批改的内容,虚线示意通过 N 个下一跳,即能够不在同一局域网内,实线示意只能“跳跃一次”,即必须在同一局域网。

1. 当计算机收回一个申请的数据包达到负载均衡器后,负载均衡器会对申请数据包同时做 SNAT 和 DNAT,将申请数据包批改为:{平衡进口 IP 地址、端口号、负载均衡器的 MAC 地址} ➡️ {某台实在服务器的 IP 地址、实在服务的端口号、实在服务器的 MAC 地址}。2. 这样负载均衡器就能够独立的和实在服务器进行数据包的传送。3. 实在服务器收到申请的数据包,返回响应的数据包:{某台实在服务器的 IP 地址、实在服务的端口号、实在服务器的 MAC 地址} ➡️ {负载均衡器的 IP 地址、端口号、负载均衡器的 MAC 地址}。此时在实在服务器上查看 TCP 连贯为:DIP ➡️ RIP。4. 当返回的数据包达到负载均衡器后,负载均衡器将返回数据包再次同时做 DNAT 和 SNAT。5. 负载均衡器返回数据包给客户端。

总结一下 FULL NAT 模式的特点:1. 同时批改数据包的「源 IP 地址」和「指标 IP 地址」,能够对端口进行转发 2. 负载均衡器不须要以网关的模式存在,即负载均衡器能够和实在服务器在不同的网络中 3. 实在服务器最终建设的连贯是 DIP ➡️ RIP,无奈获取实在客户端的 IP 地址 4. 所有的申请数据包、响应数据包都要通过负载均衡器

LVS 自身不反对 FULLNAT 模式,须要额定对内核打补丁后能力应用。

能够看到在 NAT 和 FULLNAT 模式中,不论是申请数据包还是响应数据包,都要通过负载均衡器。然而响应数据包个别要比申请数据包大很多,这可能会成为零碎的瓶颈。如果可能将申请数据包转发到实在服务器之后,响应数据包由实在服务器间接返回,这样对负载均衡器的压力就小很多。这种模式又该如

退出移动版