1.前言
LVS(Linux Virtual Server)是一个基于 Linux 内核的负载均衡器,用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式,以满足不同场景和需求的负载均衡需求,在LVS中定义虚拟服务的VIP(Virtual IP)和端口是为了将客户端的请求引导到负载均衡器,并进行负载均衡和请求转发,虚拟服务的VIP是一个虚拟的IP地址,对客户端而言,它是服务的入口地址。客户端将请求发送到虚拟服务的VIP地址,而不是直接发送到后端服务器的实际IP地址。这样,负载均衡器可以根据定义的负载均衡算法,将请求转发给后端服务器,实现负载均衡和流量分发的功能
2.lvs功能
LVS 提供了三种负载均衡的转发模式
NAT 模式(Network Address Translation):在LVS的NAT模式中,当客户端发送请求时,请求经过负载均衡器后,负载均衡器会对请求进行地址转换,并将请求转发给后端服务器。后端服务器处理请求后,将响应返回给负载均衡器,负载均衡器再将响应转发给客户端。这种模式下,负载均衡器扮演了中间转发角色,需要处理请求和响应的转发和转换,既要处理请求的接入,又要处理请求的响应,会存在较大性能瓶颈
DR 模式(Direct Routing):在LVS的DR模式中,负载均衡器通过修改网络的ARP表,将客户端请求直接路由到后端服务器。后端服务器直接与客户端进行通信,将响应直接返回给客户端,而不需要经过负载均衡器。在这种模式下,负载均衡器主要负责请求的路由和负载均衡,而不参与实际数据包的转发和响应,因为只负责转发消耗的资源小,因此性能高,存在的瓶颈小
TUN 模式(Tunneling):负载均衡器在网络层上对请求进行封装和解封,将请求转发给后端服务器,限制比较大,实际中较少使用
DR模式相对于NAT模式具有以下优势:
减少负载均衡器的工作量:DR模式下,负载均衡器不需要处理请求和响应的转发和转换,可以减轻负载均衡器的负担,提高性能和可扩展性
减少延迟:由于响应直接由后端服务器返回给客户端,无需经过负载均衡器的中转,可以减少延迟,提高响应速度
可扩展性:DR模式允许将负载均衡器和后端服务器分别部署在不同的子网中,提供更高的可扩展性和灵活性
lvs负载均衡策略
轮询(Round Robin):这是最常见的负载均衡策略之一。每个新的请求按照顺序分发给后端服务器。当所有后端服务器都参与负载均衡时,请求将按照相等的权重轮流分发给它们。这种策略适用于后端服务器配置相似、负载均匀的情况
加权轮询(Weighted Round Robin):类似于轮询策略,但每个后端服务器分配一个权重值,根据权重值分配请求。具有较高权重值的服务器将获得更多的请求。这个策略适用于后端服务器的性能不同,希望按照性能分配负载的情况
最少连接(Least Connection):根据后端服务器的当前连接数来选择最少连接的服务器来处理新请求。这种策略可以确保负载均衡,使得请求分布更加均匀,适用于长连接或有长时间处理请求的场景
源IP散列(Source IP Hash):根据客户端的源IP地址对请求进行散列,并将其路由到相应的后端服务器。相同的源IP地址将始终被路由到相同的服务器上,这对于需要保持会话一致性的应用程序很有用
最快响应时间(Least Response Time):根据后端服务器的响应时间来选择最快响应的服务器来处理新请求。这种策略尝试将请求发送到能够更快响应的服务器,以提供更好的用户体验
3.ipvsadm工具介绍
ipvsadm
是一个管理 Linux Virtual Server (LVS) 内核模块的命令行工具。它允许你配置和管理 IP 负载均衡器
-A
或 --add-service
:添加一个新的负载均衡服务
-C
或 --clear
:清除所有现有的负载均衡服务
-D
或 --delete-service
:删除指定的负载均衡服务
-E
或 --set
:设置负载均衡服务的属性
a
或 --add-server
:向负载均衡服务中添加一个后端服务器
-d
或 --delete-server
:从负载均衡服务中删除指定的后端服务器
-g
或 --gatewaying
:将负载均衡服务设置为网关模式
-e
或 --expire-nodest
:设置后端服务器的超时时间
-m
或 --masquerading
:将负载均衡服务设置为伪装模式
-r
或 --scheduler
:指定负载均衡服务的调度器算法
-w
或 --weight
:设置后端服务器的权重
-L
或 --list
:列出所有负载均衡服务及其相关配置
-S
或 --save
:将当前配置保存到文件
-R
或 --restore
:从文件中恢复配置
也可以通过以下命令查看
ipvsadm --help
4.lvs使用
以下就通过使用nat模式和dr模式分别来展示lvs的使用,负载均衡策略这里我们统一使用轮询模式
主机信息
name | ip | port | service |
A | 10.1.60.115、10.1.60.116(虚拟地址) | 80 | lvs |
B | 10.1.60.112 | 80 | nginx |
C | 10.1.60.114 | 80 | nginx |
nat模式
所有主机均关闭selinux和防火墙
在A主机执行以下配置
开启内核转发
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
执行以下命令使配置生效
sysctl -p
增加虚拟网卡(模拟真实环境中的外网ip)
ifconfig ens160:1 10.1.60.116/24
需要删除的话可以使用down参数
ifconfig ens160:1 down
安装ipvsadm工具,用于配置ipvs规则
yum -y install ipvsadm
配置lvs负载均衡服务
ipvsadm -A -t 10.1.60.116:80 -s rr
ipvsadm -a -t 10.1.60.116:80 -r 10.1.60.114:80 -m
ipvsadm -a -t 10.1.60.116:80 -r 10.1.60.112:80 -m
-m:配置为nat模式 -r:配置后端真实地址 -t:配置虚拟地址 -s:配置负载均衡策略为rr轮询策略
查看lvs策略
在B、C主机执行以下配置
将网卡的网关配置为A主机的地址,即10.1.60.115
vi /etc/sysconfig/network-scripts/ifcfg-ens160
重启网络服务
systemctl restart network
查看路由信息
route -n
更改nginx的默认页面
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
D主机则将C改为D即可
echo "this is C" >> /usr/share/nginx/html/index.html
启动nginx服务并配置开机启动
systemctl start nginx
systemctl enable nginx
使用其它主机访问可以发现访问正常,不能用同网段的主机访问
RD模式
所有主机均关闭selinux和防火墙
在A主机执行以下配置
配置一个虚拟网卡
ifconfig ens160:1 10.1.60.116/24
ip add
配置lvs规则
ipvsadm -A 10.1.60.116:80 -s rr #配置负载均衡服务
ipvsadm -a -t 10.1.60.116:80 -r 10.1.60.112:80 -g #为负载均衡服务添加后端的转发地址
ipvsadm -a -t 10.1.60.116:80 -r 10.1.60.114:80 -g #为负载均衡服务添加后端的转发地址
-g:配置为DR模式 -r:配置后端真实地址 -t:配置虚拟地址 -s:配置负载均衡策略为rr轮询策略
查看lvs规则
ipvsadm -Ln
在B、C主机执行以下配置
增加虚拟网卡配置为A主机的虚拟网卡地址,但是只用于接收客户数据,不能被外部访问,在此就引用lo网卡配置
ifconfig lo:1 10.1.60.116 netmask 255.255.255.255
ip add
优化内核arp参数配置
vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
执行以下命令使配置生效
sysctl -p
配置路由
route add -host 10.1.60.116 dev lo:1
route -n
在其它主机访问测试
curl 10.1.60.116
可以看到访问虚拟地址可以正常被轮询转发到后端的服务