LVS(Linux Virtual Server)是一个虚拟的服务器集群系统,采用IP负载均衡技术将请求均衡地转移到不同的服务器上执行,且通过调度器自动屏蔽故障服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。整个服务器集群的结构对用户是透明的,无须修改客户端和服务器端的程序,便可实现客户端到服务器的负载均衡。
# LVS的原理
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成,在真实服务器间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只需要关注作为LB的虚拟服务器(Virtual Server),而不需要关注提供服务的真实服务器群。在用户的请求被发送给虚拟服务器后,LB根据设定的包转发策略和负载均衡调度算法将用户的请求转发给真实服务器,真实服务器再将用户请求的结果返回给用户。
实现LVS的核心组件有负载均衡调度器、服务器池和共享存储。
- 负载均衡调度器(Load Balancer/Director):是整个集群对外提供服务的入口,通过对外提供一个虚拟IP 来接收客户端请求。在客户端将请求发送到该虚拟IP 后,负载均衡调度器会负责将请求按照负载均衡策略发送到一组具体的服务器上。
- 服务器池(Server Pool):服务器池是一组真正处理客户端请求的真实服务器,具体执行的服务有WEB、MAIL、FTP和DNS等。
- 共享存储(Shared Storage):为服务器池提供一个共享的存储区,使得服务器池拥有相同的内容,提供相同的服务。
在接收LVS内部数据的转发流程前,这里先以表 6-3介绍LVS技术中常用的一些名词,以让我们更好地理解LVS的工作原理。
LVS的IP负载均衡技术是通过IPVS模块实现的。IPVS是LVS集群系统 的 核 心 软 件 , 被 安 装 在 Director Server 上 , 同 时 在 DirectorServer上虚拟出一个IP地址。用户通过这个虚拟的IP地址访问服务器。这个虚拟的IP地址一般被称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从真实服务器列表中选取一个服务节点响应用户的请求。
# LVS数据转发
LVS的数据转发流程是LVS设计的核心部分,如下所述,如图所示。
- PREROUTING链接收用户请求:客户端向PREROUTING链发送请求。
- INPUT链转发:在PREROUTING链通过RouteTable列表发现请求数据包的目的地址是本机时,将数据包发送给INPUT链。
- IPVS检查:IPVS检查INPUT链上的数据包,如果数据包中的目的地址和端口不在规则列表中,则将该数据包发送到用户空间的ipvsadm。ipvsadm主要用于用户定义和管理集群。
- POSTROUTING链转发:如果数据包里面的目的地址和端口都在规则里面,那么将该数据包中的目的地址修改为事先定义好的真实服务器地址,通过FORWARD将数据发送到POSTROUTING链。
- 真实服务器转发:POSTROUTING链根据数据包中的目的地址将数据包转发到真实服务器。
# LVS NAT模式
LVS NAT(Network Address Translation)即网络地址转换模式,具体的实现流程如图所示。
NAT模式通过对请求报文和响应报文的地址进行改写完成对数据的转发,具体流程如下。
- 客户端将请求报文发送到LVS,请求报文的源地址是CIP(Client IP Address,客户端IP),目标地址是VIP(Virtual IP Address,虚拟IP)。
- LVS在收到报文后,发现请求的IP地址在LVS的规则列表中存 在,则将客户端请求报文的目标地址VIP修改为RIP(Real-server IP Address,后端服务器的真实IP),并将报文发送到具体的真实服务器上。
- 真实服务器在收到报文后,由于报文的目标地址是自己的IP,所以会响应该请求,并将响应报文返回给LVS。
- LVS在收到数据后将此报文的源地址修改为本机IP地址,即VIP,并将报文发送给客户端。
NAT模式的特点如下:
请求的报文和响应的报文都需要通过LVS进行地址改写,因此在并发访问量较大的时候LVS存在瓶颈问题,一般适用于节点不是很多的情况下。
只需要在LVS上配置一个公网IP即可。
每台内部的真实服务器的网关地址都必须是LVS的内网地址。
NAT 模式支持对IP 地址和端口进行转换,即用户请求的端口和真实服务器的端口可以不同。
# LVS DR模式
LVS DR(Direct Routing)模式用直接路由技术实现,通过改写请求报文的MAC地址将请求发送给真实服务器,具体的实现流程如下图所示。
LVD DR模式是局域网中经常被用到的一种模式,其报文转发流程如下。
- 客户端将请求发送给LVS,请求报文的源地址是CIP,目标地址是VIP。
- LVS在收到报文后,发现请求在规则中存在,则将客户端请求报文的源MAC地址改为自己的DIP(Direct IP Address,内部转发IP)的MAC地址,将目标MAC改为RIP的MAC地址,并将此包发送给真实服务器。
- 真实服务器在收到请求后发现请求报文中的目标MAC是自己,就会将此报文接收下来,在处理完请求报文后,将响应报文通过lo(回环路由)接口发送给eth0网卡,并最终发送给客户端。
NAT模式的特点如下:
- 通过LVS修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目标IP地址仍然是VIP地址。
- 请求的报文均经过LVS,而真实服务器响应报文时无须经过LVS,因此在并发访问量大时比NAT模式的效率高很多。
- 因为DR 模式是通过MAC 地址改写机制实现转发的,因此所有真实服务器节点和LVS只能被部署在同一个局域网内。
- 真实服务器主机需要绑定VIP 地址在lo接口(掩码 32 位)上,并且需要配置ARP抑制。
- 真实服务器节点的默认网关无须被配置为LVS网关,只需要被配置为上级路由的网关,能让真实服务器直接出网即可。
- DR 模式仅做MAC 地址的改写,不能改写目标端口,即真实服务器端口和VIP端口必须相同。
# LVS TUN模式
TUN(IP Tunneling)通过IP隧道技术实现,具体的实现流程如下图所示。
LVS TUN模式常用于跨网段或跨机房的负载均衡,具体的报文转发流程如下。
- 客户端将请求发送给前端的LVS,请求报文的源地址是CIP,目标地址是VIP。
- LVS在收到报文后,发现请求在规则里中存在,则将在客户 端请求报文的首部再封装一层IP报文,将源地址改为DIP,将目标地址改为RIP,并将此包发送给真实服务器。
3.真实服务器在收到请求报文后会先拆开第1层封装,因为发 现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理该请求报文,并将响应报文通过lo接口发送给eth0网卡,并最终发送给客户端。
TUN模式的特点如下:
- UNNEL模式需要设置lo接口的VIP不能在公网上出现。
- TUNNEL模式必须在所有的真实服务器上绑定VIP的IP地址。
- TUNNEL 模式中VIP→真实服务器的包通信通过TUNNEL 隧道技术实现,不管是内网还是外网都能通信,所以不需要LVS和真实服务器在同一个网段内。
- 在TUNNEL 模式中,真实服务器会把响应报文直接发送给客户端而不经过LVS,负载能力较强。
- TUNNEL 模式采用的是隧道模式,使用方法相对复杂,一般用于跨机房LVS 实现,并且需要所有服务器都支持IP Tunneling或IPEncapsulation协议。
# LVS FULLNAT模式
无论是DR模式还是NAT模式,都要求LVS和真实服务器在同一个VLAN下,否则LVS无法作为真实服务器的网关,因此跨VLAN的真实服务器无法接入。同时,在流量增大、真实服务器水平扩容时,单点LVS会成为瓶颈。
FULLNAT能够很好地解决LVS和真实服务器跨VLAN的问题,在跨VLAN问题解决后,LVS和真实服务器不再存在VLAN上的从属关系,可以做到多个LVS对应多个真实服务器,解决水平扩容的问题。FULLNAT的原理是在NAT的基础上引入Local Address IP(内网IP地址),将CIP→VIP转换为LIP→RIP,而LIP和RIP均为IDC内网IP,可以通过交换机实现跨VLAN通信。FULLNAT的具体实现流程如图所示。
LVS FULLNAT具体的报文转发流程如下:
- 客户端将请求发送给LVS的DNAT,请求报文的源地址是CIP,目标地址是VIP。
- LVS 在 收 到 数 据 后 将 源 地 址 CIP 修 改 成 LIP ( Local IP Address,LVS的内网IP),将目标地址VIP修改为RIP,并将数据发送到真实服务器。多个LIP在同一个IDC数据中心,可以通过交换机跨VLAN通信。
- 真实服务器在收到数据包并处理完成后,将目标地址修改为LIP,将源地址修改为RIP,最终将这个数据包返回给LVS。
- LVS在收到数据包后,将数据包中的目标地址修改为CIP,将源地址修改为VIP,并将数据发送给客户端。