LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,它是我国的章文嵩博士发起的一个开源项目,现在LVS已经是Linux标准内核的一部分。LVS主要用于多服务器的负载均衡,它工作在网络层,可以实现一个高性能,高可用的服务器群集,它具有良好的可靠性、可扩展性和可操作性,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。官方站点:http://www.linuxvirtualserver.org。
LVS体系架构
如上图所示,LVS可分为三部分:
- Load Balancer:这是LVS的核心部分,位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,它负责将客户的请求按照一定的算法分发到下一层(Server Array层)不同的应用服务器(Real Server)进行处理,自己本身不做具体业务的处理。
- Server Array:该层负责具体业务,由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,上层的Director Server其实也可以同时兼任Real Server的角色。
- Shared Storage:为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般由磁盘阵列设备组成。
LVS基本工作原理
LVS是工作在网络层,LVS通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上,在Director Server虚拟一个对外访问的IP(VIP)。用户访问VIP,到达Director Server,Director Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发送至内核空间;
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链;
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链;
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
LVS转发类型
这些步骤产生了一些具体的问题,比如如何选择具体的Real Server,Real Server如何返回给客户端数据等等。IPVS为此有三种转发类型:
- VS/NAT(Virtual Server via Network Address Translation)网络地址转换,即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real Server。Real Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。
- VS/TUN(Virtual Server via IP Tunneling)隧道模型,即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
- VS/DR(Virtual Server via Direct Routing)直接路由模型,即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户端,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最好的,应用比较广泛。
LVS-DR模型的工作原理:
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP(Client IP),目标IP为VIP;
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP(Director Server IP)的MAC地址,将目标MAC地址修改RIP(Real Server IP)的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;
- 响应报文最终送达至客户端。
LVS调度算法
我们都知道Director Server要选择不同的Real server,那么它具体如何选择Real Server以达到负载均衡的呢,IPVS支持十种调度方法。
一)静态调度:
①RR(Round Robin):轮询调度
轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
②WRR:weight:加权轮询
由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
③SH:source hashing:源地址散列
根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。
④DH:Destination hashing:目标地址散列
根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。
二)动态调度:
①LC(Least-Connection):最少连接
最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡。
②WLC(Weighted Least-Connection Scheduling):加权最少连接。
加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
③SED(Shortest Expected Delay):最短期望延迟
基于wlc算法,简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权重】
④NQ(never queue):永不排队(改进的sed)
无需队列,如果有台realserver的连接数=0就直接分配过去,不需要再进行sed运算。
⑤LBLC(Locality-Based Least Connection):基于局部性的最少连接
基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
⑥LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接
带复制的基于局部性最少链均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服接调度算法也是针对目标IP地址的负载务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。
LVS具体配置操作
实验环境三台Linux主机
Diretor server:192.168.52.20
Real server1:192.168.52.121
Real server2:192.168.52.122
下面我们VS/DR介绍详细的配置过程:
在Real server 1和2上面,配置web服务。
yum install httpd -y #安装http服务
echo “This is 192.168.52.12x!!!” > /var/www/html/index.html #配置两台web文件用于测试显示效果
systemctl start httpd #启动http服务
通过浏览器输入IP访问效果如下。
Diretor server上安装LVS。
yum install ipvsadm -y
Director Server上绑定一个虚拟VIP地址192.68.52.250,此IP用于对外提供服务。
ifconfig ens33:0 192.168.52.250 broadcast 192.168.52.250 netmask 255.255.255.255 up
添加路由,访问192.168.52.250都走ens33:0这块网卡。
route add -host 192.168.52.250 dev ens33:0
启用系统的包转发功能。
echo “1”>/proc/sys/net/ipv4/ip_forward
如果之前配置过LVS,可先清除ipvsadm以前的设置。
ipvsadm -C
添加一个新的虚拟IP记录192.168.52.250,设置算法为rr轮询算法。
ipvsadm -A -t 192.168.52.250:80 -s rr
在新增的虚拟IP记录中新增两条real server记录,-g即为使用VS/DR模式
ipvsadm -a -t 192.168.52.250:80 -r 192.168.52.121:80 -g
ipvsadm -a -t 192.168.52.250:80 -r 192.168.52.122:80 -g
启用LVS服务。
ipvsadm
两台real server上的配置:
在环回口上绑定了虚拟IP地址,并添加路由。
ifconfig ens33:0 192.168.52.250 broadcast 192.168.52.250 netmask 255.255.255.255 up
route add -host 192.168.52.250 dev lo:0
禁用本机的ARP请求。
echo “1”>/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2”>/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1”>/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2”>/proc/sys/net/ipv4/conf/all/arp_announce
最后在其他客户端机子上面,访问http://192.168.52.250/,则可以看到结果了,外部客户端的请求被均衡的分配到两台Real Server上,出现不同的界面。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。