负载均衡(Load Balance) 集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
nginx优势:
lvs优势:
lvs是Linux Virtual server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在Unix/Linux平台下实现负载均衡集群功能,该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。
官网:Linuxvirtualserver
中文资料:
环境准备:
服务 | IP | 网关 |
---|---|---|
web01 | 192.168.152.130 | 192.168.152.2 |
web02 | 192.168.152.131 | 掩码 |
lb01 | 192.168.152.140 | 255.255.255.0 |
lb02 | 192.168.152.141 |
curl http://192.168.152.130/www/得到结果为web01
curl http://192.168.152.131/www/得到结果为web02
查看系统的lvs模块
lsmod|grep ip_vs
默认没有加载模块,需要安装管理工具才会激活
yum -y install ipvsadm
查看当前lvs状态,顺便激活lvs内核模块
ipvsadm
[root@lb01 ~]# lsmod|grep ip_vs
ip_vs 141092 0
nf_conntrack 111302 1 ip_vs
libcrc32c 12644 2 xfs,ip_vs
步骤1:在eth0网卡绑定VIP地址(ip)
步骤2:清除当前所有lvs规则(-C)
步骤3:设置tcp、tcpfin(tcp结束)、udp链接超时时间(–set)
步骤4:添加虚拟服务(-A),调度算法见man ipvsadm
步骤5:将虚拟服务关联到真实服务上(-a)
步骤6:查看配置结果(-ln)
ip addr add 192.168.152.140/24 dev eth0
ipvsadm -C #实验操作,实际操作要考虑
ipvsadm --set 30 5 60 #单位秒 #控制浏览器与lb01的超时时间
ipvsadm -A -t 192.168.152.140:80 -s wrr -p 20 #添加虚拟80服务 # -p控制lb01与web01、web02的超时时间
ipvsadm -a -t 192.168.152.140:80 -r 192.168.152.130 -g -w 1
ipvsadm -a -t 192.168.152.140:80 -r 192.168.152.131 -g -w 1
ipvsadm -ln
参数说明:
说明:
-t 接上tcp虚拟服务地址
-s 指定调度模式 rr wrr
-g 使用直接路由模式,默认
-w 指定权重
-r 接上真实服务IP端口
ipvsadm -ln
IP Virtual Server version 1.2.1 (size=1048576) # LVS版本号
Prot LocalAddress:Port Scheduler Flags
# 协议(TCP)本地IP:端口 调度算法 标志(persistent 20)
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#后端节点IP:端口 工作模式 权重 已经建立连接 正在连接
TCP 192.168.152.140:80 wrr persistent 20
-> 192.168.152.130:80 Route 1 0 0
-> 192.168.152.131:80 Route 1 0 0
步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 192.168.152.140/32 dev lo
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
使用浏览器访问http://192.168.152.140/www
不要在lb01访问!可以在lb02测试(未加入lvs“团伙”)
问题1:浏览器访问没有发现轮询效果
答:lvs的轮询不像nginx明显,可以使用多个客户端访问(Windows和Linux)
#lvs为大并发提供访问服务,同一客户端同一IP访问,永远分配同一个web服务器
# 轮询针对宏观上的轮询,针对全国的访问才轮询,轮询不平均,近似的比例
# 多个客户端去测试
问题2:使用抓包工具,发现进行通信的是Windows的IP和lb01的80端口,但是lb01明明没有80端口?
答:Windows抓包查看,可以发现数据的源MAC地址是wen01或web02
Linux:tcpdump -nn port 80;tcpdump -nn -e port 80
# web服务器不通过IP地址轮询,通过MAC地址
数据包通过负载均衡发送给后端--数据包的源IP源MAC不会改变,目标MAC改为后端真是服务的MAC地址
后端直接将数据发送给客户端
缺点:不安全,而且消耗公网地址
工作中:基本用到这种模式
老版本nginx支持http负载,新版nginx本支持TCP负载(包括http,mysql等底层使用tcp的协议,因为http协议是通过tcp协议建条路实现的,http在七层需要现在tcp四层先建协议,nginx支持多实例,lvs的DR模式不支持)
量大才用lvs的DR模式,一般量小用nginx更好
问题3:客户端的操作有什么含义?
1. realserver 为什么要在lo接口上配置VIP?
答:既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。
在lo上配置vip能够完成接收包并将结果返回client。
(网卡对于不是自己的IP地址的数据包会丢弃,虽然目标mac是自己的,但是IP不是)
2. 在eth0网卡上配置VIP可以吗?
答:不可以,将VIP设置在eth0网卡上,会影响RS的arp请求,造成整体lvs集群arp缓存表紊乱,以至于整个负载均衡集群都不能正常工作。
(lo只能本机访问到所以不会产生冲突,绑定的vip IP是32位掩码,eth0接收请求转发给lo)
3.为什么要抑制arp响应?
先回顾ARP知识了解arp_announce和arp_ignore作用。
为了提高IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫做ARP缓存。
Windows 查看arp缓存命令 arp -a
Linux 查看arp缓存命令 arp -n
Linux解析IP对应的MAC地址 arping -c 1 -I eth0 192.168.152.130 ##arp ping1次,从eth0 目标地址192.168.152.130
ARP缓存表是把双刃剑
① 主机有了arp缓存表,可以加快ARP的解析速度,减少局域网内广播风暴。因为arp是发广播解析的,频繁的解析也是消耗带宽的,尤其是机器多的时候。
② 正是有了arp缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是arp欺骗攻击。–》有同学恶作剧,伪装班主任告诉快递员错误的教室编号。
③ 切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端arp缓存表没有更新。
当集群一台提供服务的lb01宕机后,然后VIP会转移到备机lb02上,但是客户端的ARP缓存表的地址解析还是宕机的lb01的MAC地址。从而导致,即使lb02上添加VIP,也会发生客户端无法访问的情况。
解决的办法是:当lb01宕机,vip地址迁移到lb02时,需要通过arping命令通知所有网络内机器更新本地的arp缓存表,从而使得客户机访问时重新广播获取MAC地址。
这个是自己开发服务器可用脚本及所有高可用软件必须考虑到的问题。
ARP广播进行新的地址解析:
arping -I eth0 -c 1 -U VIP ##-U全网更新
arping -I eth0 -c 1 -U 192.168.152.140
测试命令:
ip addr del 192.168.152.140/24 dev eth0 ##在lb01删除
ip addr add 192.168.152.140/24 dev eth0 ##在lb02添加
ip addr show eth0
arping -I eth0 -c 1 -U 192.168.152.140 ##在lb02
Windows查看 arp -a
前言:lvs在DR模式下需要关闭arp功能
**arp_announce :**值为 以下0、1、2
对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出ARP请求的接口
0-(默认)在任意网络接口(eth0,eth1,lo)上的任何本地地址 ##默认回应
1- 尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起arp请求的源IP地址是被设置应该由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内ip之一,如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
2- 对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址,首先是要选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址,如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接收到该ARP回应的网络接口来进行发送。 ##不是自己的不回
arp_ignore
定义对目标地址为本地IP的arp询问不同的应答模式0
0- (默认值):回应任何网络接口上对任何本地IP地址的arp查询请求
1- 只回答目标IP地址是来访问网络接口本地地址的ARP查询请求
2- 只回答目标IP地址是来访问网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3- 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 保留未使用
8- 不回应所有(本地地址)的arp查询
LVS(负载均衡)+keepalived(高可用)
声明:接下来的实验又是一个新的开始,配置负载均衡不需要ipvsadm这个工具,因为keepalived(自动)本来就是另一个自动管理工具。