简介
要了解 IPVS,不得不谈到 Linux 虚拟服务器项目(Linux Virtual Server, LVS)。Linux 虚拟服务器技术是为了解决服务器承受的日益增长的访问压力,它通过部署虚拟服务器,使真实服务器集群使用同一个地址对外暴露服务,并在集群内实现负载均衡。真实服务器之间可以通过高速局域网或地理分隔的广域网相互连接,负载均衡器将请求分发到不同的真实服务器。因此,可以通过添加新服务器,提高系统可扩展性。
LVS的IP负载均衡技术是通过IPVS模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。
用户通过访问这个虚拟服务(VS
),然后访问请求由负载均衡器(LB
)调度到后端真实服务器(RS
)中,由RS实际处理用户的请求给返回响应
根据负载均衡器转发客户端请求以及RS返回响应机制的不同,将IPVS的转发模式分为三种:NAT
、DR
、FULLNAT
、IP TUNNEL
NAT模式(Network Address Translation)
集群可以使用私有网络地址,使用负载均衡器的公网 IP 暴露服务。
NAT
实现的缺点是负载均衡器需要修改请求、响应数据包,容易成为性能瓶颈。
NAT
模式下,请求包和响应包都需要经过LB
处理。当客户端的请求到达虚拟服务后,LB
会对请求包做目的地址转换(DNAT
),将请求包的目的IP改写为RS
的IP。当收到RS
的响应后,LB
会对响应包做源地址转换(SNAT
),将响应包的源IP改写为LB
的IP
特点:
LB
会修改数据包的地址对于请求包,会进行
DNAT
;对于响应包,会进行SNAT
。LB
会透传客户端IP到RS
(DR模式也会透传)虽然
LB
在转发过程中做了NAT
转换,但是因为只是做了部分地址转发,所以RS
收到的请求包里是能看到客户端IP的。需要将
RS
的默认网关地址配置为LB
的VIP地址因为
RS
收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB
上面,所以需要将RS
的默认网关地址配置为LB
的虚拟服务IP地址。
当然,如果客户端的IP是固定的,也可以在RS
上添加明细路由指向LB
的虚拟服务IP,不用改默认网关。LB
和RS
须位于同一个子网,并且客户端不能和LB/RS
位于同一子网因为需要将
RS
的默认网关配置为LB
的虚拟服务IP地址,所以需要保证LB
和RS
位于同一子网。
又因为需要保证RS
的响应包能走回到LB
上,则客户端不能和RS
位于同一子网。否则RS
直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB
上面了。
这时候由于没有LB
做SNAT,客户端收到的响应包源IP是RS
的IP,而客户端的请求包目的IP是LB
的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。
FULLNAT模式
FULLNAT
模式下,LB
会对请求包和响应包都做SNAT
+DNAT
特点:
- LB完全作为一个代理服务器
FULLNAT
下,客户端感知不到RS
,RS
也感知不到客户端,它们都只能看到LB
。此种模式和七层负载均衡有点相似,只不过不会去解析应用层协议,而是在TCP
层将消息转发 LB
和RS
对于组网结构没有要求不同于
NAT
和D
R要求LB
和RS
位于一个子网,FULLNAT
对于组网结构没有要求。只需要保证客户端和LB
、LB
和RS
之间网络互通即可。
IP隧道模式
IP 隧道技术是将原始 IP 数据报封装在另一个 IP 数据报中进行传输,原数据报作为新数据报的载荷,隧道包目的地址就是转交地址。所以,IP 隧道实现对网络没有要求,既可以是 LAN,也可以是 WAN。服务器在接受请求后,可以直接向客户端返回响应。
- 封包协议的结构和实现
封包协议的实现原理十分简单。先看看通过隧道传送的数据报在网络中如何流动,为了叙述简便,我把在隧道中传送的IP数据包称为封包。
设备,分别处于隧道的两端,分别起打包(封装)和解包(解封)的作用,在整个数据包的传送路径中,除了隧道两端的设备,其他网关把数据包看成一个普通的IP包进行转发。
设备就是一个封包基于的两个实现部件–封装部件和解封部件。封装和解封部件(设备)都应当同时属于两个子网。封装部件对接收到的数据报加上封包头,然后以解封部件地址作为目的地址转发出去;而解封部件则在收到封包后,还原原数据报,转发到目的子网
DR模式(Direct Routing)
直接路由作用和 IP 隧道类似,负载均衡器负责分发请求,服务器收到请求后可以直接向客户端返回响应。但直接路由只支持局域网,集群服务器必须和负载均衡器物理相连。负载均衡器通过修改数据帧的目的 MAC 地址实现负载均衡。
DR
模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS
的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR
模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。
特点:
数据包在
LB
转发过程中,源/目的IP端口都不会变化LB
只是将数据包的MAC地址改写为RS
的MAC地址,然后转发给相应的RS
。每台RS上都必须在环回网卡上绑定LB的虚拟服务IP
因为
LB
转发时并不会改写数据包的目的IP,所以RS
收到的数据包的目的IP仍是LB
的虚拟服务IP。为了保证RS
能够正确处理该数据包,而不是丢弃,必须在RS
的环回网卡上绑定LB
的虚拟服务IP。这样RS
会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS
会直接丢弃该数据包RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致
因为
LB
不会改写数据包的目的端口,所以RS
服务的监听端口必须和虚拟服务端口一致,否则RS
会直接拒绝该数据包RS处理完请求后,响应直接回给客户端,不再经过LB
因为
RS
收到的请求数据包的源IP是客户端的IP,所以理所当然RS
的响应会直接回给客户端,而不会再经过LB
。这时候要求RS
和客户端之间的网络是可达的。LB和RS须位于同一个子网
因为
LB
在转发过程中需要改写数据包的MAC为RS
的MAC地址,所以要能够查询到RS
的MAC。而要获取到RS
的MAC,则需要保证二者位于一个子网,否则LB
只能获取到RS
网关的MAC地址
IPVS支持的调度算法
- 轮询(Round Robin)
- 加权轮询(Weighted Round Robin)
- 最小连接数(Least Connections)
- 加权最小连接数(Weighted Least Connections)
- 地址哈希(Address Hash)
References
https://www.jianshu.com/p/36880b085265
https://www.cnblogs.com/huanggze/p/12486158.html