一、LVS基础
LVS(Linux Virtual Server)是一个基于 Linux 操作系统的开源软件,用于实现服务器的负载均衡。 LVS 工作在网络层,具有高性能、高可用性和可扩展性等优点。它通过将客户端的请求按照特定的算法分发到后端的真实服务器上,从而实现负载均衡的效果。
1.1常见的 LVS 工作模式
- NAT 模式(Network Address Translation):通过修改请求数据包的目标 IP 地址和目标端口,将请求分发到后端服务器,并将响应数据包的源 IP 地址和源端口修改为客户端的地址和端口。 例如,一个客户端请求到达 LVS 服务器,LVS 服务器将请求的目标 IP 地址转换为后端服务器的 IP 地址,并将请求发送给后端服务器。后端服务器处理完请求后,将响应发送给 LVS 服务器,LVS 服务器再将响应的源 IP 地址转换回客户端的 IP 地址,然后发送给客户端。
- DR 模式(Direct Routing):直接将请求数据包的目标 MAC 地址修改为后端服务器的 MAC 地址,实现请求的分发。 比如,客户端发送请求到 LVS 服务器,LVS 服务器根据调度算法选择后端服务器,并将请求数据包的目标 MAC 地址修改为后端服务器的 MAC 地址,然后将数据包直接发送到后端服务器。
- TUN 模式(IP Tunneling):通过在请求数据包外面封装新的 IP 头,将请求发送到后端服务器。 举例来说,客户端的请求到达 LVS 服务器,LVS 服务器为请求数据包封装新的 IP 头,将其发送到后端服务器。后端服务器处理完请求后,直接将响应返回给客户端。 LVS 常用于大型网站、电子商务平台等需要处理大量并发请求的场景,能够有效地提高系统的性能和可用性。
- FullNAT 模式: 客户端请求和后端服务器的响应都经过 Director 服务器进行地址转换。 不仅转换源 IP 地址,也转换目标 IP 地址。 FullNAT 模式的优点是 解决了 NAT 模式中 Director 服务器可能成为瓶颈的问题,因为请求和响应的流量都能得到均衡处理。且可以支持后端服务器不在同一网段的情况,具有更强的灵活性和通用性
1.2LVS相关概念
- VIP(Virtual IP):虚拟 IP 地址,客户端用来访问 LVS 集群的公共 IP 地址。例如,用户在浏览器中输入 VIP 来访问网站,LVS 负责将请求分发到后端的真实服务器。
- RIP(Real Server IP):真实服务器的 IP 地址,即实际处理请求的服务器的 IP 地址。
- DS(Director Server):指 LVS 集群中的负载均衡器。
- 调度算法(Scheduling Algorithm):用于决定如何将客户端请求分配到后端真实服务器的规则。 常见的调度算法有轮询(Round Robin)、加权轮询(Weighted Round Robin)、最少连接(Least Connections)、加权最少连接(Weighted Least Connections)等。
- NAT(Network Address Translation):网络地址转换,是 LVS 的一种工作模式。 DR(Direct Routing):直接路由,LVS 的另一种工作模式。
- TUN(IP Tunneling):IP 隧道,LVS 的一种工作模式。
- 持久连接(Persistence):确保来自相同客户端的相关请求始终被发送到同一台真实服务器。
- 健康检查(Health Check):用于检测后端真实服务器的健康状态,以确定是否可以接收请求。
- 会话保持(Session Persistence):保证属于同一个会话的请求被分配到同一台真实服务器。
1.3LVS的调度算法
1.31静态调度算法
- 轮询(Round Robin)算法:这是一种最简单、最公平的调度方式。请求依次轮流分配到后端的真实服务器上。例如,假设有服务器 A、B、C,第一个请求分配到 A,第二个请求分配到 B,第三个请求分配到 C,然后再从 A 开始循环。
- 加权轮询(Weighted Round Robin)算法:为不同的服务器设置不同的权重,权重越高,分配到的请求越多。比如服务器 A 的权重为 3,B 的权重为 2,C 的权重为 1,那么每 6 个请求中,有 3个分配给A,2个分配给 B,1个分配给 C。
- 源地址哈希(Source IP Hash)算法:根据请求的源 IP 地址进行哈希计算,将相同源 IP 的请求始终分配到同一台服务器。 这样可以保证来自相同源地址的请求能够被定向到相同的服务器,利于会话保持和数据一致性。
- 目的地址哈希(Destination Hashing)是一种常见的负载均衡算法。其基本原理是根据请求的目的地址(例如目标 IP 地址、URL 等)进行哈希计算,然后将请求分配到后端的服务器。例如,如果有三台服务器 S1、S2 和 S3,接收到一个请求,对请求的目的地址进行哈希运算后得到的结果决定了将该请求分配给哪台服务器。如果哈希结果对应到 S1,那么后续具有相同目的地址的请求都会被分配到 S1 上。这种算法的优点在于,对于相同目的地址的请求能够始终定向到同一台服务器,这在某些需要保持会话状态或数据一致性的场景中非常有用。
1.32 动态调度算法
- 最少连接(Least Connections)算法:会将新的请求分配到当前连接数最少的服务器上。例如,服务器 A 当前连接数为 10,服务器 B 为 5,服务器 C 为 8,那么新请求会被分配到服务器 B。这种算法适用于长连接场景,能够较好地平衡服务器的负载。
- 加权最少连接(Weighted Least Connections)算法:结合了服务器的权重和连接数来进行调度。假设服务器 A 的权重为 3,当前连接数为 10;服务器 B 的权重为 2,当前连接数为 5;服务器 C 的权重为 1,当前连接数为 8。计算加权连接数,服务器 A 为 10/3 ≈ 3.33,服务器 B 为 5/2 = 2.5,服务器 C 为 8/1 = 8。新请求会被分配到服务器 B。
- SED:Shortest Expection Delay,初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 。但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接。
- NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理。
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS。
1.33 其他算法
- Weighted Fair Over(加权公平超额)调度算法是一种用于资源分配和任务调度的算法。 其主要特点包括: 考虑了不同任务或资源的权重。权重较高的任务或资源在分配时会获得更多的机会。 强调公平性,尽量确保每个任务或资源在一定程度上都能得到合理的分配。 这种调度算法的优点在于: 能够根据权重灵活地分配资源,适应不同重要程度或需求程度的任务。 在保证公平的基础上,提高了整体系统的效率和资源利用率。
- OVF(Overflow-connection,溢出连接)调度算法是一种用于处理连接分配的算法。 其主要思路是:当现有资源的连接数达到一定阈值(即“溢出”)时,按照特定的规则进行新连接的分配。 OVF 调度算法的特点包括: 能够有效应对资源连接过载的情况。 基于预设的条件和规则来决定新连接的走向。 这种算法的优点在于: 有助于提高系统在高负载情况下的稳定性和可靠性。 可以优化资源的利用效率,避免某些资源过度负载而其他资源闲置。 例如,在一个服务器集群中,如果某台服务器的连接数超过了设定的阈值,OVF 算法可以将新的连接分配到负载较轻的服务器上,以确保整个系统的性能和响应能力。
二、LVS-NAT实战部署
LVS-NAT(Linux Virtual Server - Network Address Translation)是 Linux 虚拟服务(LVS)的一种常见工作模式。 在 LVS-NAT 模式中,请求和响应数据包都需要经过负载均衡器进行地址转换。具体来说,客户端将请求发送到负载均衡器的公共 IP 地址,负载均衡器修改数据包的目标 IP 地址为后端真实服务器的私有 IP 地址,并将请求转发给选定的真实服务器。真实服务器处理请求后,将响应发送给负载均衡器,负载均衡器再把源 IP 地址修改为自己的公共 IP 地址,然后将响应返回给客户端。下面,我们将通过一个实战项目来把握 LVS-NAT的算法原理。
1、准备
设置好网卡信息
2、基础环境搭建详情
①调度器LVS:网卡ens160(NAT模式)、网卡ens224(仅主机模式),使其可处于不同的VLAN段
为网卡ens160设置IP
vmset.sh ens160 172.25.254.100 lvs.zf.org
为网卡ens224设置IP
vmset.sh ens224 192.168.0.100 lvs.zf.org
修改网卡ens224的配置文件
[root@lvs boot]# vim /etc/NetworkManager/system-connections/ens224.nmconnection
重新加载网络配置
nmcli connection reload
nmcli connection up ens224
打开内核路由功能
vim /etc/sysctl.conf
sysctl -p # 使修改内容生效
②webserver1(仅主机)
为网卡ens160设置IP
vmset.sh ens160 192.168.0.10 webserver1.zf.org
修改ens160的网关
③webserver2(仅主机)
为网卡ens160设置IP
vmset.sh ens160 192.168.0.20 webserver2.zf.org
修改ens160的网关
保证畅通的环境
分别为webserver1和webserver2安装apache
dnf install httpd -y
将“webserver1 -192.168.0.10”这个内容输出并重定向到“/var/www/html/index.html”
将“webserver2 -192.168.0.20”这个内容输出并重定向到“/var/www/html/index.html”
最终在LVS上检测
3、LVS-NAT部署详情
dnf install ipvsadm -y #安装名为“ipvsadm”的软件包
做策略
ipvsadm -A -t 172.25.254.100:80 -s rr
# 添加一个 TCP 类型的虚拟服务,IP为172.25.254.100,端口为 80,使用轮询(Round Robin)调度算法
ipvsadm -Ln
查看规则-n 选项表示以数字形式显示 IP 地址和端口,而不是进行域名解析
轮询调度的基本原理是按照固定的顺序依次为每个任务分配资源或处理时间片。
例如,假设有任务 A、B、C,调度器会先为 A 分配一个时间片进行处理,然后轮到 B,接着是 C,之后再回到 A,如此循环。
轮询调度的优点在于其实现简单,公平性较好,每个任务都有机会获得资源。它适用于多个任务的处理需求相对平均,且对响应时间要求不是特别严格的场景。 比如说,在一个计算机系统中,多个进程需要使用 CPU 资源,如果采用轮询调度,每个进程都能在一定的时间间隔内得到 CPU 的处理时间,避免某些进程长时间得不到资源而导致饥饿。
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
#添加真实服务器(Real Server)
其中 -m 表示 NAT 模式,-g 表示 DR 模式,-i 表示 TUN 模式
循环10次看效果
最后,保存策略记录: ipvsadm-save > /etc/sysconfig/ipvsadm
三、ipvsadm命令的使用
ipvsadm核心功能:
1、集群服务管理:增、删、改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字
2、集群服务的RS管理:增、删、改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
ipvsadm -Z [-t|u|f service-address] 清除计数器
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000
#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000
#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
相关参数
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :输出速率信息
3、查看
ipvsadm -Ln
1、添加一个新的虚拟服务:ipvsadm -A -t <VIP>:<Port> -s <调度算法>
ipvsadm -A -t 192.168.1.100:80 -s rr
#表示添加一个虚拟服务,IP 为 192.168.1.100,端口为 80,使用轮询(Round Robin)调度算法。
2、 添加真实服务器:ipvsadm -a -t <VIP>:<Port> -r <RIP>:<Port> -m
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.1:80 -m
#表示为上述虚拟服务添加一个真实服务器,IP 为 192.168.1.1,端口为 80,使用 NAT 模式。
3、查看规则: ipvsadm -L -n 以数字形式显示当前的 IPVS 规则
ipvsadm -Ln
4、删除虚拟服务: ipvsadm -D -t <VIP>:<Port>
ipvsadm -D -t 192.168.1.100:8080
#删除VIP 为 192.168.1.100,端口为 8080 的虚拟服务
5、删除真实服务器: ipvsadm -d -t <VIP>:<Port> -r <RIP>:<Port>
ipvsadm -d -t 192.168.0.100:80 -r 192.168.0.110:80
#删除虚拟 IP(VIP)为 192.168.0.100 ,端口为 80 , IP(RIP)为 192.168.0.110 ,端口也为 80的真实服务器
6、修改调度算法:ipvsadm -E -t <VIP>:<Port> -s <新的调度算法>
ipvsadm -E -t 172.16.1.100:80 -s wrr
#设置VIP 为 172.16.1.100 ,端口为 80 ,新的调度算法为“wrr”(加权轮询)
四、LVS-DR实战部署
LVS-DR(Linux Virtual Server - Direct Routing)是 Linux 虚拟服务器(LVS)的另一种工作模式。 在 LVS-DR 模式中,负载均衡器和真实服务器都连接到同一个物理网络,并且都配置了相同的 VIP(虚拟 IP 地址)。当客户端发送请求到负载均衡器时,负载均衡器根据调度算法选择一台真实服务器,并将数据包的目标 MAC 地址修改为所选真实服务器的 MAC 地址,然后直接将数据包发送到局域网中。真实服务器收到数据包后,发现目标 IP 是自己配置的 VIP,于是进行处理。处理完成后,直接将响应数据包返回给客户端,而不再经过负载均衡器。下面,我们也将通过一个具体项目来把握 LVS-DR的算法原理。
本项目基于以下配置要求进行:
1、基础环境搭建详情
①调度器LVS
在上个实验的基础上,删除网卡信息,重新添加IP信息
仅保留网卡ens224,为其添加IP信息
修改网卡ens224的网关,并重新激活网卡
再次确认网关信息
② router
设置双网卡模式
设置双网卡的ip地址,并编辑ens224的文件,删除网关
打开内核路由功能
③client
为ens160设置ip
修改ens160的网关信息
2、LVS-DR部署详情
在RS1和RS2中修改内核参数,关闭VIP的响应
限制响应级别 :arp_ignore0: 默认值,表示可使用本地任意接口上配置的任意地址进行响应1: 仅在请求的目标 IP 配置在本地主机的接收到请求报文的接口上时,才给予响应限制通告级别 :arp_announce0: 默认值,把本机所有接口的所有信息向每个接口的网络进行通告1: 尽量避免将接口信息向非直接连接网络进行通告2: 必须避免将接口信息向非本网络进行通告
设定VIP的lo地址的IP
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
在客户端测试VIP网络是否可达
做策略
使用 ipvsadm 命令创建了一个虚拟服务,VIP 为 192.168.0.200 ,端口为 80 ,调度算法为加权轮询(wrr)。 为该虚拟服务添加了两台真实服务器,IP 分别为 192.168.0.10 和 192.168.0.20 ,端口均为 80 ,使用网关(-g)模式,权重分别为 1 和 2 。 最后使用 ipvsadm -Ln 命令查看相关规则。
客户端访问测试,由下图可知实验成功。
五、LVS火墙标记
修改策略为轮询调度
[root@lvs ~]# ipvsadm -E -t 192.168.0.200:80 -s rr
在2个RS中安装mod_ssl模块,让RS支持https
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd
在网络状态相关的输出中搜索与 “httpd” 相关的信息
忽略证书访问地址
增加一套策略,在RS中同时开放80和443端口,由于默认控制是分开轮询的,出现轮询调度错乱的问题
用防火墙标记解决该问题:在防火墙上对数据包进行标记,从而实现更有效的轮询调度策略。
在 mangle 表的 PREROUTING 链中添加一条规则,目标地址为 192.168.0.200 ,协议为 TCP ,多端口为 80 和 443 ,执行动作是 MASK 并设置标记为 66 。
清除之前的策略
设定调度规则
客户端访问测试,由下图可知实验成功
以上就是 LVS实战详解的全部内容啦,下一期小编将为你带来haproxy部署的最强攻略,大家敬请期待~