https://www.jianshu.com/p/89c6f27771a4
LVS (linux virtual server)是 Linux标准内核的一部分。基于TCP/IP的负载均衡技术,转发效率极高,具有处理百万计并发连接请求的能力。由于工作在linux内核层,转发效率比工作在应用层的nginx,haproxy转发效率更高
LVS的IP负载均衡技术是通过IPVS模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。用户通过访问这个虚拟服务(VS),然后访问请求由负载均衡器(LB)调度到后端真实服务器(RS)中,由RS实际处理用户的请求给返回响应。
客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的目的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。
数据包在LB转发过程中,源/目的IP端口都不会变化
每台RS上都必须在LO环回网卡上绑定LB的虚拟服务IP
RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致
RS处理完请求后,响应直接回给客户端,不再经过LB
LB和RS须位于同一个广播域
DR模式下要求arp_ignore参数要求配置为1。
DR模式下要求arp_announce参数要求配置为2。
NAT模式下,请求包和响应包都需要经过LB处理。当客户端的请求到达虚拟服务后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。当收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的IP。
LB会修改数据包的地址
LB会透传客户端IP到RS(DR模式也会透传)
需要将RS的默认网关地址配置为LB的浮动IP地址
LB和RS须位于同一个广播域,并且客户端不能和LB/RS位于同一子网
FULLNAT模式下,LB会对请求包和响应包都做SNAT+DNAT。
LB完全作为一个代理服务器。FULLNAT下,客户端感知不到RS,RS也感知不到客户端,它们都只能看到LB。
LB和RS对于组网结构没有要求
IP TUNNEL模式下,LVS通过在IP数据包外面再封装了一层Ip Tunnel 头部,将数据包的源地址改写为LVS自身的物理地址,目的地址改写为RS的物理地址,从而实现跨网段访问RS。整个过程看起来好像LVS和RS之间有一条隧道,数据包通过这条虚拟的隧道进行传输。真实服务器收到请求后,会先将外面封装的Ip Tunnel头去掉,然后处理里面实际的请求报文;与DR模式类似,响应包也不再经过LVS,而是直接返回给客户端。所以Ip Tunnel模式的转发效率虽然弱于DR,但是强于NAT。
不改写原有请求包的信息,类似IP隧道方式直接添加IP头部,转发给RS。
相应包不通过LVS直接返回给客户端
Ip Tunnel模式下需要将RS上的rp_filter参数配为0,否则无法正常工作,因为RS是在物理网卡收到请求,但是VIP是绑在虚拟网卡tunl0上的。
IP TUNNEL模式增加的头部可能导致网络包分片引发不确定的通信问题。解决办法是降低RS侧的MSS值。
iptables -A OUTPUT -s xxx -p tcp --tcp-flags ALL SYN,ACK -j TCPMSS --set-mss 1400
性能从高到低:DR > IP TUNNEL >NAT >FULLNAT
Ip Tunnel模式最大的优点就在于它可以跨网段转发,没有DR和NAT模式的组网限制。这在部署上带来的很大的灵活性,甚至还可以跨机房转发,不过不建议这样使用,一是会带来跨机房间的流量,提高了成本;二是跨机房转发必然会要在RS机房上绑定LVS机房的VIP,这有可能会被运营商的防火墙认为是IP伪造请求而拦截。
虽然FULLNAT模式的性能比不上DR和NAT,但是FULLNAT模式没有组网要求,允许LB和RS部署在不同的子网中,这给运维带来了便利。并且 FULLNAT模式具有更好的可拓展性,可以通过增加更多的LB节点,提升系统整体的负载均衡能力。