文章目录
lvs负载均衡群集
前情回顾–nginx反向代理型负载均衡
负载均衡的妙用
负载均衡(Load Balance) 集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
- 单台计算机无法承受大规模的并发访问或数据流量,此时需要搭建负载均衡集群把流量分摊到多台设备上分别处理,既减少用户等待响应的时间又提升了用户体验;
- 7*24小时的服务保证,任意一个或多个有限后端节点设备宕机,不能影响整个业务的运行
- nginx变种tengine,如果出错可以快速定位到哪台机器
为什么要学lvs(优点)
nginx优势:
- 工作在网络模型的7层。可以针对http应用做一些分流的策略,比如针对域名、目录结构,nginx单凭这点可利用的场合就远多于lvs了
- 最新版本的nginx也支持4层TCP负载,曾经这是lvs比nginx好的地方。
- nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载,这个也是他的优势之一,相反lvs对网络稳定性依赖比较大。
- nginx安装和配置比较简单,测试起来比较方便,它基本能把错误日志打印出来。lvs的配置、测试就要花比较长的时间了,lvs对网络依赖比较大。
lvs优势:
- 简单一句话,当并发超过了nginx上限,就可以使用lvs了。
- 日1000-2000w pv或并发请求1万以下都可以考虑用nginx。
- 大型门户网站,电商网站需要用到lvs。(淘宝)
- 4层传输层,7层应用层,根据arp规则分配,在4层不知道ur地址还是一个加密包裹状态只能根据地址分发,在应用层知道包裹里的东西,根据内容分发(4层与7层的区别)
lvs介绍
lvs是Linux Virtual server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在Unix/Linux平台下实现负载均衡集群功能,该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。
中文资料:
- lvs项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html
- lvs集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html
- lvs集群中的IP负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html
- lvs集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html
lvs内核模块ip_vs介绍
(如何快速转发)
lvs集群搭建
环境准备:
- 准备4台安装好centos7.2系统的虚拟机,内存512M。
- 所有虚拟机的防火墙和selinux关闭
- 主机名及IP地址关系如下:
服务 | 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 |
- web01 和web02只需要安装nginx软件,并满足下面条件:
curl http://192.168.152.130/www/得到结果为web01
curl http://192.168.152.131/www/得到结果为web02
- 安装好wireshark 2.2.x版本以上
安装ipvsadm管理工具(只在lb01操作)
查看系统的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
配置lvs负载均衡服务(只在lb01操作)
步骤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
web服务器配置(在web01/web02同时操作下面步骤)
步骤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
问题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地址只有lb的vip 192.168.152.140
- 数据包的接收MAC地址也是lb01的网卡MAC地址
- 数据包的返回MAC地址可能是web01的网卡MAC,也可能是web02的网卡MAC地址。
- cip:client IP address
- Vip:virtual IP address
- Dip:Director IP address
- RIP:real server IP address
- RS:real server
数据包通过负载均衡发送给后端--数据包的源IP源MAC不会改变,目标MAC改为后端真是服务的MAC地址
后端直接将数据发送给客户端
缺点:不安全,而且消耗公网地址
工作中:基本用到这种模式
lvs 集群的工作模式–DR直接路由模式******
- 通过在调度器上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
- 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高,比nginx代理模式强于此处。
- 因DR模式是通过MAC地址的改写机制实现转发的,因此,所有RS节点和调度器LB只能在同一个局域网中。
- 需要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题。
- 强调下:RS节点的默认网关不需要是调度器LB的DIP(用机房的IP地址做网关),而应该直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论上讲,只要RS可以出网即可,不需要必须配置外网IP,但走自己的网关,那网关就成为了瓶颈了。
- 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端口。LVS DR模式的办公室在二层数据链路层(MAC),NAT模式则工作在三层网络层(IP)和四层传输层(端口)。
- 当前,调度器LB支持几乎所有UnIX、Linux系统,但不支持Windows系统。真实服务器RS节点可以是Windows系统(Windows可以只提供服务)。
- 总之,DR模式效率很高,但配置也比较麻烦。因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000w PV或并发请求1万以下都可以考虑haproxy/nginx(LVS的NAT模式)
- 直接对外的访问业务,例如web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。(lvs可以做mysql的负载均衡,只对读做负载均衡)
老版本nginx支持http负载,新版nginx本支持TCP负载(包括http,mysql等底层使用tcp的协议,因为http协议是通过tcp协议建条路实现的,http在七层需要现在tcp四层先建协议,nginx支持多实例,lvs的DR模式不支持)
量大才用lvs的DR模式,一般量小用nginx更好
问题3
问题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作用。
回顾–ARP网络知识*****
arp缓存
为了提高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缓存表没有更新。
服务器切换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
arp_announce 和 arp_ignore 详解(抑制arp响应)
前言: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集群的工作模式总结
- DR(direct Routing)直接路由模式,
- 会搭建
- 懂原理
- NAT(Network Address Translation)
- TUN(Tunneling)隧道模式
- FULLNAT(Full Network Address Translation)#全NAT转换
扩展:
LVS(负载均衡)+keepalived(高可用)
声明:接下来的实验又是一个新的开始,配置负载均衡不需要ipvsadm这个工具,因为keepalived(自动)本来就是另一个自动管理工具。