负载均衡之LVS
前言
软件负载均衡设备:
- LVS(四层路由设备)根据用户请求的IP与端口号,实现将用户的请求分发至一个客户端不同的主机
- nginx:要功能是针对http,smtp,pop3,imap等协议实现负载均衡,可实现四七层负载。
- HAproxy:主要功能是针对http协议实现负载均衡,也可以实现tcp(mysql,smtp)等协议的负载均衡
对比:
软件 | 每秒的并发量 | CPU占用 | 结论 |
---|---|---|---|
LVS(DR) | 1.6 w | 25% | 综合性能最好,配置复杂 |
HAproxy | 2.3 w | 95% | 转发快,占用CPU高,配置简单 |
nginx | 2 w | 80% | 转发比haproxy低,CPU占用也低 |
一、LVS工作模式
1、NAT模式(<20台web服务器) ★★★
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP 。目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
- 报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返给LVS。
- 然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:
在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
缺点:
director很可能成为系统性能瓶颈,所有的请求director都需要处理应答
2、DR直接路由模式(100+台web服务器) ★★★
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
- RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
特点:
- 集群节点和director必须在一个物理网络内
- RIP可以使用公网地址或私有地址
- director仅处理入站请求,director服务器的压力比较小
- 集群节点网关不指向director,故出站不经过director
- 不支持端口映射
- 大多数操作系统可以作为realserver,要支持隔离ARP广播
ARP广播:
通常,DR模式需要在Real-server上配置VIP,配置的方式为:
ifconfig lo:0 VIP netmask 255.255.255.255
设置广播地址就是自己 ARP广播域内就他自己
3、TUN-IP隧道模式(后台web服务器100台左右)
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上
4、FULL-NAT
解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可以做到多个LVS对应多个RS,解决水平扩容的问题。后端的web服务器也可以是外网上的任意服务器。
5、模式对比
LVS/NAT | LVS/TUN | LVS/DR | |
---|---|---|---|
OS | 任意 | 多数 | 多数(要支持non-arp) |
网络 | 私有网络 | 局域网/广域网 | 局域网 |
web服务器数量 | 10~20 | 100左右 | 大于100 |
服务器网关 | 负载均衡服务器 | 路由 | 路由 |
效率 | 一般 | 高 | 最高 |
二、LVS-DR模式
环境:
DR: 192.168.93.136
web1: 192.168.93.137
web2: 192.168.93.138
配置:
- DR端网卡添加VIP (vip要和rip要绑定在一起)
ifconfig ens33:0 192.168.93.222 broadcast 192.168.93.255 netmask 255.255.255.0 up
0:子接口 无数个
broadcast:广播地址,为网段255
netmask:子网掩码
up:开启
- 设置路由(因为服务器不是路由器 只要进行数据包转发 不要求转发重定向 所以关闭该功能)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 开启路由转发功能
net.ipv4.conf.all.send_redirects = 0 # 关闭重定向
net.ipv4.conf.ens32.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
- LVS设置路由条目
yum -y install ipvsadm
ipvsadm -C # 清除虚拟主机表
ipvsadm -A -t 192.168.93.222:80 -s rr # 设置vip调度策略
调度策略:
-
Fixed Scheduling Method 静态调服方法
RR 轮询:
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。WRR 加权轮询:
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 -
Dynamic Scheduling Method 动态调服方法
LC 最少连接:
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。WLC 加权最少连接:
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
ipvsadm -a -t 192.168.93.222:80 -r 192.168.93.137:80 -g
ipvsadm -a -t 192.168.93.222:80 -r 192.168.93.138:80 -g
-A 添加virtual server
-t 指定使用tcp协议
-s 指定调度策略为rr
-a 添加realserver
-r 指定realserver是谁
-g LVS类型:
-g:Gateway,DR(默认使用的类型)
-i:ipip,TUN
-m:masquerade(地址伪装),NAT
ipvsadm-save >/etc/sysconfig/ipvsadm # 配置生效
systemctl enable ipvsadm
- 在两个web服务器部署nginx 并修改主页 为了更直观看出实验效果
yum -y install nginx
echo "<h1>137<h1>" >/usr/share/nginx/html/index.html
sed -ri /^SELINUX=/cSELINUX=disabled /etc/selinux/config && setenforce 0
systemctl stop firewalld && systemctl disable firewalld
- 配置两个web服务器的lo网卡设置子网掩码为32位vip
web1: ifconfig lo:0 192.168.93.222/32
web2: ifconfig lo:0 192.168.93.222/32
- 配置两个web服务器内核参数、code
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore # 忽略arp响应
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce # 让vip发包出去
arp设置:
arp_announce : INTEGER ,默认为0
0 - (默认) 在任意网络接口上的任何本地地址
1 - 尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送
arp_ignore : INTEGER , 默认为0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
- 浏览器访问 192.168.93.222
curl 192.168.93.222
三、LVS-NAT模式
环境
web1: 192.168.93.137
web2: 192.168.93.138
client: 10.18.47.139
DR: 网卡1: 10.18.47.194(桥接模式)
网卡2: 192.168.93.141(NAT模式)
-
web1 web2 配置nginx服务(参考DR案例部署)
-
路由配置
client: route add -net 192.168.93.0/24 gw 10.18.47.194
web1: route add -net 10.18.47.0/24 gw 192.168.93.141
web2: route add -net 10.18.47.0/24 gw 192.168.93.141
- lvs配置
echo 1 >/proc/sys/ipv4/ip_forward
yum -y install ipvsadm
ipvsadm -A -t 10.18.47.194:80 -s rr # 调度方法轮询
ipvsadm -a -t 10.18.47.194:80 -r 192.168.93.137:80 -m # -m NAT模式
ipvsadm -a -t 10.18.47.194:80 -r 192.168.93.138:80 -m
- client端测试
curl 10.18.47.194
四、 常用命令
1、虚拟服务管理
- 添加一个虚拟服务 192.168.93.223:80,使用轮询算法
ipvsadm -A -t 192.168.93.223:80 -s rr
- 修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.93.223:80 -s wrr
- 删除虚拟服务
ipvsadm -D -t 192.168.93.222:80
- 清除虚拟服务
ipvsadm -C
2、真实服务管理
- 添加一个真实服务器 192.168.93.139,使用DR模式,权重2
ipvsadm -a -t 192.168.93.222:80 -r 192.168.93.139 -g -w 2
- 增加真实服务器的权重
ipvsadm -a -t 192.168.93.222:80 -r 192.168.93.139 -g -w 5
- 修改真实服务器的权重
ipvsadm -e -t 192.168.93.222:80 -r 192.168.93.139 -g -w 5
- 删除真实服务器
ipvsadm -d -t 192.168.93.222:80 -r 192.168.93.139
3、查看统计
- 查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
- 查看转发状态
ipvsadm -lnc