浅析前端LVS IP负载均衡原理
1. 关于负载均衡与LVS
负载均衡是建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。通过前端负载均衡器,可以实现N台廉价PC服务器并行处理用户的访问请求,从而达到高性能计算机的计算能力。
一般常见的前端负载均衡解决方案有基于DNS和IP(虚拟IP)的负载均衡。基于DNS负载均衡是在客户端发送请求时,先通过域名向DNS查询IP地址,这时使用DNS服务器回复多个A记录或AAAA记录,客户端任意选择一个IP地址使用。基于IP的负载均衡是将向用户提供服务的IP地址作为虚拟IP同时绑定多个服务器上,由前端的负载均衡器负载将用户的访问请求转发到真实的业务系统处理。在实践中,最重要的VIP实现部分是一网络负载均衡器(network load balancer)的组件。该负载均衡器接收网络数据包,同时将他们转发给VIP背后的某一个服务器,这些后端服务器可以接下来处理该请求。
LVS全称Linux Virtual Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
2. LVS集群与术语
2.1. LVS集群体系结构
- 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
- 服务器池(server pool或realserver),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等
- 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
2.2. 术语
- Director Server(DS):指的是前端负载均衡器节点。
- Real Server(RS):后端真实的工作服务器。
- VIP(虚拟IP):向外部直接面向用户请求,作为用户请求的目标的IP地址。
- Director Server IP(DIP):主要用于和内部主机通讯的IP地址。
- Real Server IP(RIP):后端服务器的IP地址。
- Client IP(CIP):访问客户端的IP地址。
3. LVS负载均衡工作原理
3.1. NAT实现虚拟服务器(VS/NAT)
VS/NAT的体系结构如图3.1所示。在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS)共享,也可以通过一个分布式文件系统来提供。
图1-LVS-NAT数据流向图
- 当用户请求到达Director Server,请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP.
- PREROUTING检查数据包的目标IP是本机后,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务。若是则根据调度算法选出一台RealServer,并修改数据包的目标IP为后端RealServer IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。Director Server在连接Hash表中记录这个连接,当该链接下一个报文到达时,从Hash表中得到选定服务器的IP和端口,进行同样的改写操作。
- POSTROUTING链通过选路,将数据包发送给Real Server。
- Real Server比对发现目标为自己的IP,开始构建响应报文,并通过默认网关(DIP)发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP .
- Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP.
注意:
- RealServer IP为私有地址,RealServer的网关必须为Director Server的IP(DIP)。所有报文都需要经过DS。
- Director Server和RealServer必须在同一个二层网络。
- 支持端口映射,RealServer可以是任意操作系统。
- 在高负载集群中,Director Server将会成为性能瓶颈,服务器规模最在10台左右,不超过20台。
3.2. IP隧道实现虚拟服务器(VS/TUN)
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。 我们利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装并转发给选出的服务器。这样,我们可以利用IP隧道的原理将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
图2-LVS-TUN数据流向图
- 当用户请求到达Director Server,请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
- PREROUTING检查数据包的目标IP是本机,将数据包送至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中,响应报文根据服务器的路由表直接返回给客户,而不经过负载调度器,所以负载调度器只处于从客户到服务器的半连接中,VS/TUN 的TCP状态迁移与VS/NAT的不同。我们给出半连接的TCP有限状态机,如图3所示,圈表示状态,箭头表示状态间的转换,箭头上的标识表示在当前 状态上收到该标识的输入,迁移到下一个状态。VS/TUN的TCP状态迁移是按照半连接的TCP有限状态机进行的。
图3-半连接的TCP有限状态机
注意:
- RIP、VIP、DIP全是公网地址。
- RS的网关不会也不可能指向DIP。
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server。
- 不支持端口映射。
- RS的系统必须支持隧道。
- 可能导致数据包超出MTU而分片传输。
3.3. 直接路由实现虚拟服务器(VS/DR)
VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。
图4-LVS-DR数据流向图
- 当用户请求到达Director Server,请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务。若是这将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。
- 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP 。
- 响应报文最终送达至客户端
注意:
- 保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
- RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS跟Director Server必须在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(因为我们不允许他经过director)
- RS上的lo接口配置VIP的IP地址
- 缺陷:RS和DS必须在同一机房中
4. LVS内核连接调度算法
4.1. 轮叫调度-rr(Round-Robin Scheduling)
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
4.2. 加权轮叫调度-wrr(Weighted Round-Robin Scheduling)
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
4.3. 最小连接调度-lc(Least-Connection Scheduling)
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4.4. 加权最小连接调度-wlc(Weighted Least-Connection Scheduling)
这个算法比 lc 多了一个权重的概念。
4.5. 基于局部性的最少链接-lblc(Locality-Based Least Connections Scheduling)
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
4.6. 带复制的基于局部性最少链接-lblcr(Locality-Based Least Connections with Replication Scheduling)
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
4.7. 目标地址散列调度-dh(Destination Hashing Scheduling)
目标地址散列调度算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。 目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4.8. 源地址散列调度-sh(Source Hashing Scheduling)
源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法 的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。
在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
4.9. 其他调度算法
- 最短预期延时调度(Shortest Expected Delay Scheduling)
- 不排队调度(Never Queue Scheduling)
5.LVS负载均衡集群特点
5.1 高可用性
LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
5.2 高可靠性
LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
5.3 适用环境
LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。 LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。
参考引用:
- http://www.cnblogs.com/liwei0526vip/p/6370103.html
- https://oxnz.github.io/2016/10/10/lvs/
- http://ixdba.blog.51cto.com/2895551/552947