Introduce
什么是负载均衡
Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
为什么需要负载均衡
简单点说就是现在用户的访问量过大,对于单机的计算机资源请求过多,导致负载过高,所以需要负载均衡技术。
简单的负载均衡模型
最为简单的负载均衡模型就是客户端访问负载均衡服务器,然后由该服务器转发给真正的服务器。如下图所示:
该负载均衡服务器也是理想中的服务器,将其对应到OSI七层网络模型如下图所示:
这里的负载均衡服务器默认是指LVS,所以是四层负载均衡服务器,这里对于为什么是四层做一个简单的解释(个人理解),首先该负载均衡服务器没有实现TCP握手功能但是具有路由转发功能,那么一定至少是工作在网络层的,也就是前三层,对于负载均衡服务器它的主要功能是均衡负载,那么如何判断客户端的请求过载呢?这里就设计到第四层传输层,它需要知道有客户端与服务端的连接数量,来判断是否需要进行均衡负载,那么这就需要负载均衡服务器具有"窥视"传输层的端口的功能,也就是得看得到客户端和服务端的连接,所以说是四层服务器。
LVS模型中的常见专用术语:
1、 DS:Director Server。指的是前端负载均衡器节点,也即是四层负载均衡服务器(LVS)。
2、 RS:Real Server。后端真实的工作服务器。
3、 VIP:Virtual IP,向外部直接面向用户请求,作为用户请求的目标的IP地址。
4、 DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5、 RIP:Real Server IP,后端服务器的IP地址。
6、 CIP:Client IP,访问客户端的IP地址
NAT模型(网络地址转换)
NAT模型推导(Network Address Translation,网络地址转换)
假设现在有个客户访问www.baidu.com,在回车后该域名会解析为相应的ip地址,但是百度有很多服务器,解析后的ip地址并不是真正的服务器的地址,而是类似于这里的负载均衡服务器的ip,这个ip是固定的,无论真正的服务器怎么变化,对于客户来说发送的数据包只是一个源地址为CIP,目的地址为www.baidu.com域名解析后的虚拟地址VIP,如下图所示:
而现在真正的服务器对外暴露的IP为RIP,如果直接将该数据包转发给服务端,服务端会丢弃,所以,这里利用NAT的方式将发送过来的数据包的目标IP地址更换为RIP,这样就可以发送到真正的服务器。这里假设发送给Server2,那么数据包会被转化为CIP->RIP2,如下图所示:
在Server2收到该请求后,会对其进行相应的处理,首先会在内部记录该TCP连接——一个从RIP2到CIP的映射。
我们知道当我们在浏览器输入www.baidu.com的时候浏览器会返回给我们一个页面,也就是Server2收到客户端的请求的时候,会返回一个数据包(这里假设就一个)给客户端,也就是一个源地址为RIP2目的地址为CIP的数据包,但是我们知道客户端和服务端一般不在同一个网段,所以该数据包会根据路由表的默认路由发送到地址为默认网关的地方,这里也就是负载均衡服务器的DIP。
这个数据包如果直接发送给客户端,客户端统一不会接受而会抛弃,所以这里发送给客户端的数据包也会被进行转换为一个源地址为VIP,目标地址为CIP的数据包,这样客户端就会接受到服务端Server2返回的数据。
LVS的NAT模型的内容总结:
- 请求报文时,报文必须经过director(负债均衡服务器),才能达到负载均衡的效果。同时在director上修改目标ip为新的服务端地址(RIP)实现转发,也就是进入负载均衡器时做DNAT。响应报文时,在director上修改源ip实现转发,也就是响应出负载均衡器时做SNAT。
- Director的DIP和各real server的RIP必须在同一个物理网段中,并且RIP的网关要指向DIP。
- NAT模型中一般VIP是公网地址,DIP和RIP一般是私网地址。使用NAT模型主要的目的是隐藏服务器ip。
LVS的NAT模型的弊端:
在我们输入一个网站的时候,浏览器也就是服务端会给我们返回一个远远大于客户端发送的消息的数据,简单点说就是在同一条道路上,奔向服务端的是卡丁车,而返回给客户端的却是擎天柱样的重卡。这样客户端的数据流通就是不对称的,在高并发的情形下,对负载均衡服务器的算力和带宽都是极大的考验,并且容易成为瓶颈。所以在负载均衡服务器中不使用该模式。
DR模型(直接路由模式)
我们回顾NAT模式的弊端在于服务端返回的数据远远大于客户端发送的数据这样对于负载均衡服务器有较大的压力,我们注意到,在服务端以及记录了RIP2->CIP的连接了,为什么不直接将返回的数据发送给客户端呢?这样就不用通过负载均衡服务器了,现在我们假设该想法可以实现,那么该模型被修改为如下图所示:
但是我们知道客户端只接受从VIP发送来的数据,所以,如果直接发送给客户端,客户端会丢弃,我们在往前看,服务端之所以会发送一个从RIP2到CIP的数据包,是因为接受到的数据包是从CIP到VIP的,所以才会保存一个从RIP2->CIP的连接,那么如果我们发送给服务端的数据就是一个源地址为CIP目标地址为VIP的数据包的话,服务端也就会保存一个从VIP->CIP的连接,自然就发送了一个源地址为VIP到CIP的包,如果客户端可以接受到的话,那么自然就会接受了。到这一步,模型的演变为如下图所示:
那么问题又来了,如果负载均衡服务器发送一个CIP->VIP的数据包,服务端不会接受,在这里我们假设负载均衡服务器和服务端在同一个局域网中,那么负载均衡服务器就是知道服务端的MAC地址,在同一局域网的主机通过MAC实现数据包的交换,同时需要服务端内部得有一个隐藏的地址VIP,这样数据包根据MAC发送到Server端,然后由于内部有一个VIP地址,该数据包就会被接受。如下图所示:
这样我们就得到了LVS的直接路由模式(DR)
LVS的DR模式内容总结如下:
- client发送请求到vip,lvs会对vip响应arp,因此client将请求发到LVS。
- LVS机器收到发往vip的报文后,根据目的IP和目的port匹配ipvs规则,将报文目的mac改为real server的mac,同时将源mac改为LVS的mac后,发送到real server。
- real server收到之后,mac/IP都是本机的,就将报文交由系统处理。
- 响应报文因real server收到的报文源IP就是client IP,real server直接将请求回给client。如果client和real server是同一个网段,响应报文直接通过二层透传发送给client,报文目的mac即为client mac;如果client和real server不是同一个网段,响应报文先发送到gateway,再走三层转发返回client。
LVS的DR模式的局限性:
需要负载均衡服务器与服务端在同一个局域网中。
TUN模式(tunneling)
在LVS的DR模式中,我们需要负载均衡服务器与服务端在同一个局域网中,从而实现了MAC地址欺骗,而我们现在考虑负载均衡服务器与服务端不在一个局域网的场景(该场景非常常见),我们同样采用DR的思路,将客户端发送过来的数据包地址进行修改,但是DR模式知识在数据链路层进行了修改,无法实现网络的跳转,所以只要我们实现网络层的地址修改(欺骗),那么就无需让负载均衡服务器和服务端在同一个局域网了。也就是说我们在CIP->VIP的外面包裹一层数据包(DIP->RIP2),那么这样服务端既可以接受该数据包,同时也实现负载均衡服务器和服务端不在一个局域网的场景。
LVS的TUN模式内容总结:
- 客户请求数据包,目标地址VIP发送到负载均衡服务器上。
- 负载均衡服务器接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
- RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有负载均衡服务器和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
- 响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。
LVS的TUN模式的缺点:
这种方式需要所有的服务器支持"IP Tunneling”(IP Encapsulation)协议
Reference
- h
t - LVS负载均衡三种模型(NAT、DR、TUN)推导t p s : / / m p . w e i x i n . q q . c o m / s / d 7 4 E 2 i F 2 R C J E R m c _ F y 4 w F g