Skip to the content.

在流量入负载均衡之前,还有一道网络分发的过程:

它们会从 DNS 解析开始,通过域名 -> “CNAME” -> “负载调度服务” -> “就近的数据中心入口” 的路径,比如根据 IP 地址将请求用户分配到一个合适的数据中心,然后请求流量就到了我们马上要说的负载均衡器

负载均衡器主要有两种形式,一种是四层负载均衡,另一种是七层负载均衡。

四层负载均衡是性能高,但是局限性很多。

七层负载均衡是功能强大,拓展性非常高

四层负载均衡

这里面又分为多种负载均衡器,大部分都是工作在第二、三层数据链路层。

二层数据链路负载均衡

基于数据链路负载均衡器传输的数据内容是数据帧(Frame),如以太网帧、ADSL 宽带的 PPP 帧等。它可以改写机器 MAC 地址。事实上,数据链路层负载均衡工作原理就是改写请求的数据帧上的 MAC 目标地址,转发到一个新的 MAC 目标地址并重新包装到数据帧中。

第二层的数据帧经第三层网络的 TCP 包装,因为第二层是不涉及到第三层数据包目标 IP 地址和源 IP 地址的更改。所以到了第三层的数据包,也就是 IP 数据包中,包含了源(客户端)和目标(均衡器)的 IP 地址,只有真实服务器保证自己的 IP 地址与数据包中的目标 IP 地址一致,这个数据包才能被正确处理。

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

因为在处理过程中真实服务器的 IP 和数据请求中的目标 IP 地址一样,所以响应结果就不需要经过负载均衡器进行地址交换了,而是直接将响应数据包转发给目标客户端,避免了负载均衡器称为了性能瓶颈。所以性能是非常高的。

这也注定了使用场景,因为二层负载均衡器直接改写目标 MAC 地址的工作原理,决定了它与真实服务器的通讯必须是二层可达的。通俗地说,就是它们必须位于同一个子网当中,无法跨 VLAN。

因此,数据链路层负载均衡最适合用来做数据中心的第一级均衡设备,用来连接其他的下级负载均衡器。

三层网络层负载均衡

第三层是网络层,与二层数据链路负载均衡器修改 MAC 工作原理类似,只是这里改成修改数据包(Package)的目标 IP 地址。这里面就涉及到了 “IP 隧道” 的工作原理了,大概原理是负载均衡器将原来的数据包的请求头 Headers 和负载数据(Payload)封装成另一个新的数据包的 Payload 转发给真实服务器,这也就意味着服务器必须要针对这个 “IP 隧道” 进行解析拆包,所以这里面会有性能损失,并且也不是所有系统都支持这个 IP 隧道协议的。

还有一种方式是直接更改 Header 中的目标 IP 地址将原来属负载均衡器的地址更改为真实服务器的 IP 地址。但是由于在做应答请求时,由于源地址已经改为真是服务器地址,所以用户客户端无法识别,所以无法做出正确的回应。这个时候就要借助 “NAT” 来做转换了。因为又引入了一个中间件,所以在流量大的情况,这部分也会称为性能瓶颈

应用层负载均衡

前面提到的负载均衡器都是做的转发,而到了应用层就无法做到转发了,只能通过代理,此时客户端与负载均衡器和真实服务器是通过两条独立的 TCP 通道建立连接的。

代理又分为三种:

  1. 正向代理,也就是对服务器透明的,在客户端设置代理服务
  2. 反向代理,对客户端是透明的,在服务端设置代理服务
  3. 中间透明,对于两边都是透明的,在负载均衡器上做配置

所谓代理即所有请求与响应都要经过负载均衡器来协调。虽然性能最低但是能做出更多的拓展,缓存,安全,限流等

负载均衡算法实现

参考资料