[!TIP]
环境用nginx反向代理文档里的三台服务器即可
一、基于nginx的负载均衡
七层负载:
-
配置nginx.conf主配置文件
vim /etc/nginx/nginx.conf
在http块内添加:
upstream userLB(随意){ #server写的ip:端口号(8080为tomcat默认监听)server 后端服务器A的内网ip:8080;server 后端服务器B的内网ip:8080; }
-
修改nginx子配置文件
vim /etc/nginx/conf/default.conf
location /user/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://userLB/;#这个写负载均衡块名,注意结尾有个/proxy_redirect default;}
二、ipvsadm
-
安装
yum -y install ipvsadm
-
语法:
命令: ipvsadm 作用: 用于管理和配置IPVS 语法: ipvsadm [选项] [选项值] 选项参数: -A:添加一个新的虚拟服务器配置 -D:删除虚拟服务器配置 -a:添加一个后端真实服务器 -d:删除一个后端真实服务器 -L:列出当前的IPVS表,包括虚拟服务器和后端真实服务器的配置 -n:以数字格式显示IP地址和端口号 -t <VIP:Port>:指定虚拟服务器的IP地址和端口号 -r <RIP:Port>:指定后端真实服务器的IP地址和端口号 -s <Scheduling_Algorithm>:指定调度算法,如rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)等 -g:指定lvs的工作模式,使用DR模式 -m:使用NAT模式 -i:使用TUN模式 -w <Weight>:指定后端真实服务器的权重,用于负载均衡的算法 -C:清除IPVS表中的所有配置 示例: #添加虚拟服务器配置 ipvsadm -A -t 192.168.1.100:80 -s wlc #添加后端真实服务器 ipvsadm -a -t 192.168.1.100:80 -r 10.0.0.1:80 -g #查看当前的IPVS表 ipvsadm -L -n #删除虚拟服务器配置 ipvsadm -D -t 192.168.1.100:80
三、基于NAT负载
-
userA与userB准备不同的页面显示,用于后面负载均衡的验证
修改
/usr/local/apache-tomcat-9.0.111/webapps/ROOT/index.html
(自己创建)内容即可 -
关闭userA和userB虚拟机的外网
MobarX中,userA和userB虚拟机用内网ip连接
-
配置后端服务器的路由信息
提前下载net-tools:
yum install net-tools -y
userA:
route add -net 192.168.233.0/24 gw 192.168.16.128
userB:route add -net 192.168.233.0/24 gw 192.168.16.128
第一个ip是代理服务器外网网关,第二个是代理服务器内网ip
-
代理服务器安装ipvsadm软件
yum install ipvsadm -y
-
lvs服务器启动路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
-
lvs添加虚拟服务器配置及指定负载策略
ipvsadm -A -t 192.168.233.130:80 -s rr
rr代表nat负载这边监听80端口,因为是四层负载
-
lvs添加真实服务器配置
ipvsadm -a -t 192.168.233.130:80 -r 192.168.16.129:8080 -m
ipvsadm -a -t 192.168.233.130:80 -r 192.168.16.130:8080 -m
-
查看当前的IPVS表,确认配置
ipvsadm -Ln
-
访问测试
在windows终端重复
curl 192.168.233.130
,有轮询即可(浏览器可能有缓存无法实现)
四、基于DR负载
[!CAUTION]
DR模式不支持端口切换,代理服务器和后端服务器(tomcat)用的端口要一致
同上环境一致,需要提前将之前的lvs的策略清除掉即可
-
开启user1和user2的外网,因为dr模式响应是要发送给用户的,没有外网发不出去
-
清除之前的lvs策略
ipvsadm -C
-
清除后端服务器的路由配置
提前下载net-tools:
yum install net-tools -y
userA:
route del -net 192.168.233.0/24 gw 192.168.16.128
(要先安装net-tools)userB:
route del -net 192.168.233.0/24 gw 192.168.16.128
(要先安装net-tools) -
lvs主机添加一个虚拟IP(VIP)
ifconfig ens160:0 192.168.233.3 broadcast 192.168.233.255 netmask 255.255.255.0 up
ens160这个要用ip a去看自己的外网网卡叫啥,192.168.233.3不是固定,自己找一个没有在用的ip,要在同一个网段
-
lvs主机设置路由转发
route add -host 192.168.233.3 dev ens160:0
vim /etc/sysctl.conf 写入
net.ipv4.ip_forward = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0
-
lvs添加虚拟服务器配置及指定负载策略
ipvsadm -A -t 192.168.233.3:80 -s rr
tomcat用的8080,dr模式不支持端口切换,这里用80,tomcat就要改80,这里如果用8080就不用改
-
lvs添加真实服务器配置
ipvsadm -a -t 192.168.233.3:80 -r 192.168.233.131:80 -g
ipvsadm -a -t 192.168.233.3:80 -r 192.168.233.132:80 -g
第一个使用前面指定的虚拟ip 第二个要使用后端服务器外网ip
-
lvs配置永久生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm
-
后端服务器的lo网卡设置子网掩码为32位vip
userA:
ifconfig lo:0 192.168.233.3/32
userB:
ifconfig lo:0 192.168.233.3/32
用前面指定的ip
-
后端服务器设置内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# 忽略arp响应 ,不允许收echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 为了让vip发包出去 -
修改tomcat的端口号为80
修改server.xml中的8080为80端口
vim /usr/local/apache-tomcat-9.0.111/conf/server.xml
修改port修改完记得
cd /usr/local/apache-tomcat-9.0.111/bin
运行./shutdown.sh
和./startup.sh
-
客户端测试
一定要记得开外网网卡
在windows终端重复
curl 192.168.233.3
,有轮询即可(浏览器可能有缓存无法实现)
五、补充
1. 负载均衡算法
负载均衡:将用户的请求分配到多个后端服务器上进行处理,以达到优化资源利用率、提高响应速度和增加系统的可靠性的目的
-
轮询
-
加权轮询
在server的ip后面加上weight=n权重值
-
iphash
在upstream内第一行加上ip_hash;即可
[!CAUTION]
使用iphash,可能导致大多数请求被发送到一台服务器,导致其他服务器过于空闲。
但iphash可以让用户第一次请求在某台服务器,往后所有请求都在这台服务器,保证会话持久性。
2. upstream参数
- server:定义后端服务器的IP地址或域名,可选地指定端口号,默认为80端口。
- weight:服务器权重,默认为1。权重越高,处理的请求比例越大。
- max fails:Nginx尝试连接后端服务器失败的次数,默认为1。超过此次数,Nginx将服务器标记为失败。
- fail timeout:在max fails定义的失败次数后,距离下次检查的间隔时间,默认为10秒。
- backup:热备配置,仅当所有激活的服务器失败后,请求才会被转发到标记为backup的服务器。
- down:标记服务器永远不可用,通常用于维护或测试。配合iphash使用时,服务器不能被标记为down。
3. 软件负载
区别与抉择说明
-
lvs
四层路由设备,根据用户请求的IP与端口号,实现将用户的请求分发至不同的主机。每秒并发量1.6W,CPU占用率25%,性能综合比最好,配置复杂。
-
HAProxy
七层负载均衡器,针对http协议实现负载均衡,也可以实现tcp(mysql,smtp)等协议的负载均衡。每秒并发量2.3W,CPU占用率95%,转发快,CPU占用高,配置简单。
-
nginx
层负载均衡器或者四层负载均衡器,主要功能是针对http,smtp,pop3,imap等协议实现负载均衡,只负责解析有限的七层协议。每秒并发量2W,CPU占用率80%,转发没有haproxy快,CPU占用率比它低
4. 四层与七层负载
-
四层
四层的负载均衡就是基于IP+端口的负载均衡;
四层更快,在内核空间处理,不用走用户空间;
无法实现太复杂负载均衡控制;
常见的四层负载软件设备:lvs,nginx;
工作在传输层,使用TCP、UDP协议;
负载效率高;
用ipvsadm软件操作;
配置复杂度高。 -
七层
七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡;
七层功能更多,经内核空间,进入用户空间的应用进程进行转发;
可以实现更复杂的负载均衡控制;
效率没有四层好;
工作在网络层,使用http、https协议;
负载效率一般;
用nginx实现;
配置复杂度低。
5. lvs
5.1 概述
LVS(Linux Virtual Server)是一个基于Linux操作系统的高性能、可扩展的负载均衡器。它提供了一种可靠的、高可用的解决方案,用于将来自客户端的请求分发到多个后端服务器,以实现负载均衡和高可用性。
lvs工作在 OSI 模型的传输层,即四层负载均衡,LVS主要由两部分组成,ipvs和ipvsadm:
ipvs:工作在内核空间,它是LVS的核心组件,负责实际处理负载均衡和流量调度的功能。IPVS通过拦截并重定向传入的网络连接,将连接请求分发到后端的真实服务器。IPVS实现了负载均衡算法和网络连接管理,以确保请求在后端服务器之间均衡分发
ipvsadm:工作在用户空间,它是一个命令行工具,用于管理和配置IPVS。IPVSADM提供了一组命令,用于添加、修改和删除虚拟服务器、后端服务器和负载均衡规则。通过IPVSADM,管理员可以在用户空间灵活地配置和管理IPVS的各个组件,以定义集群服务和后端真实服务器
5.2 名词
- DS(Director Server):前端负载均衡器节点(负载均衡服务器)
- RS(Real Server):后端真实的工作服务器(后端服务器)
- VIP:向外部直接面向用户请求,作为用户请求的目标IP地址(负载均衡服务器IP)
- DIP(Director Server IP):主要用于和内部主机通讯的IP地址(负载均衡服务器内网IP)
- RIP(Real Server IP):后端服务器的IP地址
- CIP(Client IP):客户端的IP地址
5.3 原理

- 当客户端发起请求时,请求首先到达 LVS 负载均衡器,它是网络流量的入口
- 调度器将请求发往至内核空间
- PREROUTING 链首先会接收到用户请求,判断目标 IP,确定是本机 IP,将数据包发往 INPUT 链
- 当用户请求到达 INPUT 时,ipvs检查数据包里面的目的ip及端口,对比现有的规则,符合的话ipvs会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链
- POSTROUTING 链接收数据包后,将数据包最终发送给相应的后端服务器
- 后端服务器接收到请求后,根据请求的内容进行处理,并生成响应,响应经过相同的路径返回到负载均衡器
- 负载均衡器收到后端服务器的响应后,将响应转发给发起请求的客户端
5.4 工作模式
5.4.1 NAT模式
路由转发模式。在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群
5.4.2 DR模式
直接路由模式。在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群
6. HAProxy概述
HAProxy的工作流程主要包括以下几个步骤:
- 客户端请求:客户端发送请求到HAProxy的前端。
- 前端处理:前端根据配置的规则(如负载均衡算法、ACL规则等)选择合适的后端。
- 后端转发:前端将请求转发到选定的后端服务器进行处理。
- 服务器响应:后端服务器处理请求并返回结果给前端。
- 返回客户端:前端将处理结果返回给客户端。
配置概述:
vim /etc/haproxy/haproxy.cfg
listen webclusterbind *:80mode http#balance firstbalance static-rrserver web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1