LVS是Linux Virtual Server的简称,即Linux虚拟服务器,创始人前阿里云首席科学家章文嵩博士,官方网站:www.linuxvirtualserver.org。
Linux从内核版本2.4开始,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。通过LVS提供的负载均衡技术和Linux操作系统可实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性,以低廉的成本实现最优的服务性能。
使用LVS架设的服务器集群系统有三个部分组成:
最前端的负载均衡层(Loader Balancer),中间的服务器群组层(Server Array),最底层的数据共享存储层(Shared Storage)。
Load Balancer层
位于整个集群系统的最前端,是LVS体系架构的核心,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层
由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层
是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
通过将请求报文中的目标IP地址与目标端口修改,来实现报文的传送。
相关术语
1 | DS:Director Server。指的是前端负载均衡器节点。 |
原理图
LVS在内核中的负载均衡调度是以连接为粒度的。在HTTP协议(非持久)中,每个对象从WEB服务器上获取都需要建立一个TCP连接,同一用户 的不同请求会被调度到不同的服务器上,所以这种细粒度的调度在一定程度上可以避免单个用户访问的突发性引起服务器间的负载不平衡。在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:
轮询调度rr(Round-Robin Scheduling)
这种是最简单的调度算法,调度器平等地对待每一台服务器节点。
加权轮询调度wrr(Weighted Round-Robin Scheduling)
它用相应的权值表示服务器的分配权重,解决服务器间性能不一的情况。
最小连接调度lc(Least-Connection Scheduling)
一种动态调度算法,通过服务器当前所活跃的连接数来估计服务器的负载情况,把新的连接请求分配到当前连接数最小的服务器。
加权最小连接调度wlc(Weighted Least-Connection Scheduling)
较为理想的算法,结合lc以及wrr的优点。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
源地址散列调度SH(Source Hashing Scheduling)
类似与IP哈希,主要是实现将此前的session(会话)绑定。将此前客户的源地址作为散列键,从静态的散列表中找出对应的服务器。
基于局部性的最少链接LBLC(Locality-Based Least Connections Scheduling)
主要用于Cache集群系统,将相同的目标URL地址请求调度到同一台服务器,来提高服务器的访问的局部性和Cache命中率。
带复制的基于局部性最少链接LBLCR(Locality-Based Least Connections with Replication Scheduling)
基于最少链接的,当一个新请求收到后,一定会将请求发给最少连接的那台主机的,同时其他主机可以来这里获取缓存。
目标地址散列调度DH(Destination Hashing Scheduling)
针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。
LVS 的转发主要有四种工作模式:
DR 模式(修改目标 MAC)
NAT 模式(修改 IP 地址,分为源地址修改 SNAT 和目标地址修改 DNAT)
FULLNAT模式(NAT模式扩展)
TUN模式(IP隧道)
DR 模式(Direct Route)下需要 LB 和 RS 集群绑定同一个 VIP(RS 通过将 VIP 绑定在 lo网卡实现),但与 NAT 的不同点在于:请求由LB接受,由RS直接返回给用户。
详细来看,一个请求过来时,LB只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。RS 收到 LB 转发来的包时,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LB 的存在。而当 RS 返回响应时,只要直接向客户端 IP 返回即可。
DR模式的核心
NAT(Network Address Translation)是一种外网和内网地址映射的技术。
NAT 模式下,网络数据报的进出都要经过 LVS 的处理。LVS 需要作为 RS(真实服务器)的网关。
当包到达 LVS 时,LVS 做目标地址转换(DNAT),将目标 IP 改为 RS 的 IP。RS 接收到包以后,仿佛是客户端直接发给它的一样。RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。这时 RS 的包通过网关(LVS)中转,LVS 会做源地址转换(SNAT),将包的源地址改为 VIP,这样,这个包对客户端看起来就仿佛是 LVS 直接返回给它的。
NAT模式的核心
net.ipv4.ip_forward=1
,也包括iptables防火墙的forward功能。(DR模式和TUN模式不需要)FULL-NAT模式实际上是根据LVS-NAT模式的一种扩展,能满足更大的并发请求。
在NAT模式下LB需要先对请求进行目的地址转换(DNAT),然后对响应包进行源地址转换(SNAT),先后进行两次NAT。而 FULL-NAT则分别对请求进行和响应进行DNAT和SNAT,进行4次NAT,当然这样多次数的NAT会对性能大大削减,但是由于对请求报文的目的地址和源地址都进行了转换,后端的RS可以不在同一个VLAN下。
工作流程
FULLNAT模式核心
大多数 Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直 接返回给客户,将极大地提高整个集群系统的吞吐量。
TUN模式是利用IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
在TUN模式下,客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP(动态地选择一台服务器),利用IP隧道技术将此包发送给RS。RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
TUN模式的核心