一、LVS简介
LVS(Linux Virtual Server)是一种基于Linux的高性能虚拟服务器集群系统,主要用于实现负载均衡。LVS通过Linux内核中的IPVS模块实现了基干!P负载均衡的功能,能够将来自网络的请求分配给后端的多个服务器,从而提供高可用性和伸缩性。这种技术在处理大规模网络请求时尤其有用,例如大型网站和在线服务,能够有效防止单点故障并提升服务的可靠性和性能。LVS的工作原理可以简要概括为“请求分发"和“响应返回”两个主要环节。当用户请求发送至LVS虛拟IP地址(VIP)时,LVS调度器会根据预设的算法(如轮询、最少连接等)决定将请求发送至哪一台后端服务器。后端服务器处理完请求后,将响应数据直接返回给用户,从而完成整个请求-响应流程。
二、LVS结构
使用LVS架设的服务器集群系统有三个部分组成:
1、最前端的负载均衡层:用Load Balancer表示,中间的服务器群组层,用Server Cluster表示,最底端的数据共享存储层,用Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
2、Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Diector Server 管理服务器)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
3、Server Cluster层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
4、Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
三、LVS相关术语
1.DS: Director Server。指的是前端负载均衡器节点
2.RS:Real Server。后端真实的工作服务器
3.VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址
4.DIP:Director Server IP,主要用于和内部主机通讯的IP地址
5.RIP:Real ServerlP,后端服务器的IP地址
6.CIP:ClientIP,访问客户端的IP地址
四、LVS负载均衡工作原理
1、LVS DR模式
详解图:
原理:
1.当客户端请求 www.sina.com.cn 主页,请求数据包穿过网络到达 Sina 的 LVS 服务器网卡:源 |P 是客户端 IP 地址 CIP,目的 IP是新浪对外的服务器 P 地址,也就是 VIP;此时源 MAC 地址是 CMAC,其实是 LVS 连接的路由器的 MAC 地址(为了容易理解记为 CMAC),目标 MAC 地址是 VIP 对应的 MAC,记为 VMAC
2.数据包经过链路层到达 PREROUTING 位置(刚进入网络层),査找路由发现目的 IP 是 LVS 的 VIP,就会递送到 INPUT 链上,此时数据包 MAC、IP、Port 都没有修改。
3.数据包到达 INPUT 链,INPUT 是 LVS 主要工作的位置。此时 LVS 会根据目的 IP 和 Port 来确认是否是 LVS 定义的服务,如果是定义过的 VP 服务,就会根据配置信息,从真实服务器列表 中选择一个作为 RS1,然后以 RS1 作为目标査找 Out 方向的路由,确定一下跳信息以及数据包要通过哪个网卡发出。最后将数据包投递到 OUTPUT 链上。
4.数据包通过 POSTROUTING 链后,从网络层转到链路层,将目的 MAC地址修改为 RealServer 服务器 MAC 地址,记为 RMAC而源 MAC 地址修改为 LVS 与 RS 同网段的 selfiP 对应的 MAC 地址,记为 DMAC 。此时,数据包通过交换机转发给了RealServer 服务器(注:为了简单图中没有画交换机)。
5.请求数据包到达后端真实服务器后,链路层检査目的 MAC 是自己网卡地址。到了网络层,査找路由,目的IP 是 VP(o 上配置了VIP),判定是本地主机的数据包,经过协议栈拷贝至应用程序(比如 nginx 服务器),nginx 响应请求后,产生响应数据包。
6.然后以 CIP 查找出方向的路由,确定下一跳信息和发送网卡设备信息。此时数据包源、目的 IP 分别是 VIP、CIP,而源 MAC 地址是RS1的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,记为 CMAC(为了容易理解,记为 CMAC)。然后数据包通过RS 相连的路由器转发给真正客户端,完成了请求响应的全过程。
从整个过程可以看出,DR 模式 LVS 逻辑比较简单,数据包通过直接路由方式转发给后端服务器,而且响应数据包是由 RS 服务器直接发送给客户端,不经过 LS。我们知道通常请求数据包会比较小,响应报文较大,经过LVS 的数据包基本上都是小包,所以这也是 LVS 的DR 模式性能强大的主要原因。
特性:
- 前端路由将目标地址为VIP报文统统发给Director Server
- RS跟Director Server必须有一个网卡在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 所有的real server机器上都有VIP地址
优缺点以及使用场景:
优点:
1.响应数据不经过 Ivs,性能高
2.对数据包修改小,信息保存完整(携带客户端源 IP)
缺点:
1.Ivs 与rs 必须在同一个物理网络(不支持跨机房)
2.服务器上必须配置 lo 和其它内核参数
3.不支持端口映射
场景:
如果对性能要求非常高,可以首选 DR 模式,而且可以透传客户端源 IP 地址。
2、LVS NAT模式
详解图:
原理:
1.用户请求数据包经过层层网络,到达 Ivs 网卡,此时数据包源 IP 是 CIP,目的 IP 是 VIP。
2.经过网卡进入网络层 prerouting 位置,根据目的IP 査找路由,确认是本机 IP,将数据包转发到 INPUT 上,此时源、目的IP 都未发生变化。
3.到达 is后,通过目的 IP 和目的 port 査找是否为 IPVS 服务。若是 IPVS 服务,则会选择一个 RS 作为后端服务器,将数据包目的IP 修改为 RIP,并以 RIP 为目的 IP 查找路由信息,确定下一跳和出口信息,将数据包转发至 output 上。
4.修改后的数据包经过 postrouting 和链路层处理后,到达 RS 服务器,此时的数据包源 IP 是 CIP,目的 IP 是 RIP。
5.到达 RS 服务器的数据包经过链路层和网络层检査后,被送往用户空间 nginx 程序。nginx 程序处理完毕,发送响应数据包,由于RS 上默认网关配置为 Ivs 设备 IP,所以 nginx 服务器会将数据包转发至下一跳,也就是 Ivs 服务器。此时数据包源 IP 是 RIP,目的IP是 CIP。
6.Ivs 服务器收到 RS 响应数据包后,,根据路由查找,发现目的 IP 不是本机 IP,且 Ivs 服务器开启了转发模式,所以将数据包转发给forward 链,此时数据包未作修改。
7.|vs 收到响应数据包后,根据目的 P 和目的 port 査找服务和连接表,将源 IP 改为 VP,通过路由査找,确定下一跳和出口信息,将数据包发送至网关,经过复杂的网络到达用户客户端,最终完成了一次请求和响应的交互。
NAT 模式双向流量都经过 LVS,因此 NAT 模式性能会存在一定的瓶颈。不过与其它模式区别的是,NAT 支持端口映射,且支持 windows操作系统。
特性:
- NAT模式修改的是目的ip,直接走的是switch不需要修改mac地址,所以VIP和RIP不需要在同一个网段内
- NAT的包的进出都需要经过LVS,所以LVS可能会成为一个系统的瓶颈问题
优点:实现简单,兼容性强,能够进行细粒度的流量控制。
缺点:负载均衡器成为数据传输的瓶颈,可能导致性能下降;需要更多的处理能力和网络带宽。
场景:如果你是 windows 系统,使用 lvs 的话,则必须选择 NAT 模式了。
3.LVS FULLNAT模式
报文变化:
特性:
- FULLNAT模式也不需要DIP和RIP在同一网段
- FULLNAT和NAT相比的话:会保证RS的回包一定可到达LVS
- FULLNAT需要更新源IP,所以性能正常比NAT模式下降10%
4.LVS TUN模式
详解图:
原理:
1.用户请求数据包经过多层网络,到达 Ivs 网卡,此时数据包源 IP 是 cip,目的 ip 是 vip。
2.经过网卡进入网络层 prerouting 位置,根据目的 i 査找路由,确认是本机,ip,将数据包转发到 input 链上,到达 vs,此时源、目的ip 都未发生变化。
3.到达 lvs 后,通过目的 ip 和目的 port 查找是否为 IPVS 服务。若是IPVS 服务,则会选择一个rs作为后端服务器,以 rip 为目的 ip查找路由信息,确定下一跳、dev 等信息,然后IP 头部前边额外增加了一个IP 头(以 dip 为源,rip 为目的ip),将数据包转发至output 上。
4.数据包根据路由信息经最终经过 Ivs 网卡,发送至路由器网关,通过网络到达后端服务器。
5.后端服务器收到数据包后,ipip 模块将 Tunnel头部卸载,正常看到的源ip是 cip,目的 ip是 vip,由于在 tun10 上配置 vip,路由查找后判定为本机 ip,送往应用程序。应用程序 nginx 正常响应数据后以 vip 为源 ip,cip 为目的 i 数据包发送出网卡,最终到达客户端。
Tunnel 模式具备 DR 模式的高性能,又支持跨机房访问,听起来比较完美。不过国内运营商有一定特色性,比如 RS 的响应数据包的源IP为 VIP,VP 与后端服务器有可能存在跨运营商的情况,很有可能被运营商的策略封掉,Tunne! 在生产环境确实没有使用过,在国内推行 Tunnel 可能会有一定的难度吧。
特性:
- TUNNEL必须在所有的realserver上绑定VIP
- realserver直接把包发给client
- 隧道模式运维起来会比较难,所以一般不用
优点:灵活性高,能够支持复杂的网络拓扑;适用于需要跨网络的数据传输。
缺点:配置复杂,可能增加网络延迟和开销;需要额外的网络设备或配置支持。
场景:理论上,如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择。
四种模式性能比较:DR>TUN>NAT>FULLNAT
五、LVS负载均衡调度算法
1. 轮叫调度 rr
均等地对待每一台服务器,不管服务器上的实际连接数和系统负载
2. 加权轮叫 wrr
调度器可以自动问询真实服务器的负载情况,并动态调整权值
3. 最少链接 lc
动态地将网络请求调度到已建立的连接数最少的服务器上,如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
4. 加权最少链接 wlc
调度器可以自动问询真实服务器的负载情况,并动态调整权值
带权重的谁不干活就给谁分配,机器配置好的权重高
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
9. 最少期望延迟 sed
不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
10. 永不排队 nq
无需队列,如果有realserver的连接数为0就直接分配过去
六、实操
1.配置网络
三台机器:
分发器(调度器director)
内网:192.168.100.100 (nat网卡模式)外网:192.168.179.128(仅主机模式)关闭本机上的nginx(由于设置了systemctl stop keepalived)
real server1(real1)
内网:192.168.100.102 (nat网卡模式)设置网关为: 192.168.100.100 开启本机上的nginx
real server2(real2)
内网:192.168.100.103 (nat网卡模式)设置网关为: 192.168.100.100 开启本机上的nginx
2.防火墙
关闭系统防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭SELinux:
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
注: 分别在三台机器进行上述操作。
以下操作在real1和real2中进行:
安装iptables服务:
yum install -y iptables-services
设置iptables服务:
iptables -F
service iptables save
说明: 进行该设置的原因是NAT模式是基于防火墙nat表的一种模式,所以会使用iptables规则。
3.开始搭建
配置director:
安装ipvsadm工具:
yum install -y ipvsadm
配置ipvsadm脚本:
[root@director ~]# vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,adai的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/eno16777736/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
# director设置ipvsadm规则
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#-C=clear,清除规则
$IPVSADM -A -t 192.168.179.128:80 -s rr
#-A:=add,添加规则;-t:=tcp;-s 指定算法;
#在此可以添加-p:指定超时时间(解决session问题:保证同一请求被分发到同一rs上)
#因为添加-p选项后会影响测试效果,所以在此不加该参数(注:时间不能设置为0)
$IPVSADM -a -t 192.168.179.128:80 -r 192.168.100.102:80 -m -w 1
$IPVSADM -a -t 192.168.179.128:80 -r 192.168.100.103:80 -m -w 1
#-a:=add,增加nat架构中的rs;-r:指定rs的IP;-m:指定LVS模式为NAT(masquerade)
#-w:=weight,指定权重
执行该脚本:
sh /usr/local/sbin/lvs_nat.sh
#注:执行该脚本时无错误输出说明没问题。
查看ipvsadm规则:
ipvsadm -ln
配置rs:
在两台rs上安装Nginx,并分别设置其主页用来区分两台机器。
yum install -y nginx
systemctl start nginx
编辑rs1主页:
vim /usr/share/nginx/html/index.html
This is real server 1.
编辑rs2主页:
vim /usr/share/nginx/html/index.html
This is real server 2.
测试
访问公网IP:192.168.179.128。
curl 192.168.75.128
即搭建成功。