目录
LVS负载均衡简介
LVS(Linux Virtual Server)即Linux虚拟服务器,目前LVS已经被集成到Linux内核模块中。在Linux内核中实现了基于IP的数据请求负载均衡调度方案。
终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实服务器,但如果真实服务器连接的是相同的存储,提供的服务也都是相同的服务,最终用户不管是访问哪台真实的服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。
LVS相关术语介绍
- LB(load Balancer 负载均衡)
- LVS(Linux Virtual Server Linux 虚拟服务器)
- DS(Director Server,前端负载均衡调度器节点)
- RS(Real Server,后端真实的工作服务器)
- VIP(Virtual IP,虚拟的IP地址,向外部直接面向用户请求,作为用户请求的目标IP地址)
- DIP(Director IP,用于和内部主机通信的IP地址)
- RIP(Real Server IP,后端服务器的IP地址)
- CIP(Client IP,访问客户端的IP地址。
LVS依赖的内核模块
# lsmod | grep ip_vs
Module Size Used by
ip_vs_wlc 12519 8
ip_vs 136701 10 ip_vs_wlc
libcrc32c 12644 1 ip_vs
nf_conntrack 96976 7 ip_vs,xt_CT,nf_nat,nf_nat_ipv4,xt_conntrack,iptable_nat,nf_conntrack_ipv4
LVS负载均衡调度算法
- 轮询调度(RR)
按一次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器 - 加权轮询调度(WRR)
对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。 - 最小连接调度(LC)
将请求调度到连接数量最小的服务器上 - 加权最小连接调度(WLC)
给每个服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡 - 基于局部性最少的连接(lblc)
请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近该目标IP地址所使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。 - 带复制的基于局部性最少连接(lblcr)
记录的不是一个IP与一台服务器之间连接记录,它会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负载过高。 - 目标地址散列调度(DH)
根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器 - 源地址散列调度(SH)
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
LVS基本工作原理
![](https://i-blog.csdnimg.cn/blog_migrate/18951238b7469bec0b7db9f8d4b93ecb.png)
1.当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2.PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链。
4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
LVS的组成
lvs有两部分程序组成,包括ipvs和ipvsadm。
- ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
LVS的工作模式
LVS常见的工作模式包括:
- DR模式(https://wsgzao.github.io/post/lvs-dr/)
- NAT模式(https://wsgzao.github.io/post/lvs-nat/)
- TUN模式(https://wsgzao.github.io/post/lvs-tun/)
- FULLNAT模式(https://blog.csdn.net/sj349781478/article/details/106121218)
基于DR的LVS负载均衡
VS/DR的数据包转发过程
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP
- PREROUTING检查发现数据包的目标IP是本机,将数据包发送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址
- 由于DS和RS在同一个网络中,所以是通过二层来传输,POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文,处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送至客户端。
VS/DR的特点
- 数据包在LB转发过程中,源/目的IP端口都不会变化
LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。 - 每台RS上都必须在环回网卡上绑定LB的虚拟服务IP
因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的VIP,为了保证RS能够正确处理数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的VIP,这样RS会认为这个VIP是自己的IP,自己是能够处理这个数据包的,否则RS会直接丢弃改数据包 - RS上的业务进程必须监听在环回网卡的VIP上,切端口必须和LB上的VIP端口一致。
因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和VIP端口一致,否则RS会直接拒绝该数据包。 - RS处理完请求后,响应直接回给客户端,不再经过LB
因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会在经过LB。这时候要求RS和客户端之间的网络是可达的。 - LB和RS须位于同一个子网
因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC地址,而要获取到RS的MAC地址,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。
基于NAT的LVS负载均衡
VS/NAT数据包转发过程
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP
- POSTROUTING链通过选路,将数据包发送给Real Server
- Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。此时报文的源IP为RIP,目标IP为CIP
- Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP。
VS/NAT的特点
- LB会修改数据包的地址
对于请求包,会进行DNAT;对于响应包,会进行SNAT - LB会透传客户端IP到RS(DR模式也会透传)
虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。 - 需要将RS的默认网关地址配置为LB的浮动IP地址
因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的VIP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的VIP,不用改默认网关。 - LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网
因为需要将RS的默认网关配置为LB的VIP地址,所以需要保证LB和RS位于同一子网。
又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。
基于TUN的LVS负载均衡
VS/TUN的数据包转发过程
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查发送的数据包的目标是本机,将数据包发送至INPUT链
- IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP为RIP。然后发至POSTROUTING链。此时源IP为DIP,目标IP为RIP。
- POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP为DIP,目标IP为RIP
- RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送达至客户端。
VS/TUN的特点
()
基于FULLNAT的LVS负载均衡
VS/FULLNAT的数据包转发过程
-
当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP。
-
PREROUTING检查发送的数据包的目标是本机,将数据包发送至INPUT链
-
IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,修改源IP为DS的内网IP,然后将数据包发送至POSTROUTING链,此时报文的源IP为DS的内网DIP(内网Local IP),目标IP为RIP
-
POSTROUTING链通过选路,将数据包发送给Real Server。
-
Real Server比对目标为自己的IP,开始构建响应报文发回给Director Server。此时源IP为RIP,目的IP为DS的DIP(内网Local IP)。
-
Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP,目的IP修改为CIP,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP。
VS/FULLNAT的特点
- LB完全作为一个代理服务器
FULLNAT下,客户端感知不到RS,RS也感知不到客户端,它们都只能看到LB,此种模式和七层负载均衡有点相似,只不过不会去解析应用层协议,而是在TCP层将消息转发 - LB和RS对于组网结构没有要求
不同于NAT和DR要求的LB和Rs位于一个子网,FULLNAT对于组网结构没有要求。只需要保证客户端和LB、LB和RS之间网络互通即可。 - 可扩展性强
由于没有组网要求,可以通过增加更多的LB节点,提升系统整体的负载均衡能力。