十 LVS 负载均衡
回顾nginx 反向代理负载均衡
负载均衡的妙用
负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,
来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、
提高网络的灵活性和可用性。
单台计算机无法承受大规模的并发访问或数据流量了,
此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,
即减少用户等待响应的时间又提升了用户体验;
7*24小时的服务保证,任意一个或多个有限后端节点设备宕机,不能影响整个业务的运行。
为什么要学lvs
工作在网络模型的7层,可以针对http应用做一些分流的策略,比如针对域名、
目录结构,Nginx单凭这点可利用的场合就远多于LVS了。
最新版本的Nginx也支持4层TCP负载,曾经这是LVS比Nginx好的地方。
Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,
这个也是它的优势之一,相反LVS对网络稳定性依赖比较大。
Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。
LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
简单一句话,当并发超过了Nginx上限,就可以使用LVS了。
日1000-2000W PV或并发请求1万以下都可以考虑用Nginx。
大型门户网站,电商网站需要用到LVS
LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,
可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,
是中国国内最早出现的自由软件项目之一。
官网:http://www.linuxvirtualserver.org/index.html
中文资料
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介绍
早在2.2内核时, IPVS就已经以内核补丁的形式出现。
从2.4.23版本开始,IPVS软件就合并到Linux内核的常用版本的内核补丁的集合。
从2.4.24以后IPVS已经成为Linux官方标准内核的一部分。
LVS无需安装
安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive
ipvsadm是通过命令行管理,而keepalive读取配置文件管理
后面我们会用Shell脚本实现keepalive的功能
LVS相关名词介绍
LVS集群的工作模式--DR直接路由模式
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,
而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提高集群系统的伸缩性。
但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,
即必须在同一局域网环境。
通过在调度器LB上修改数据包的目的MAC地址实现转发。
注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,
因此,并发访问量大时使用效率很高,比Nginx代理模式强于此处。
因DR模式是通过MAC地址的改写机制实现转发的,
因此,所有RS节点和调度器LB只能在同一个局域网中。
需要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题。
强调下:RS节点的默认网关不需要是调度器LB的DIP,
而应该直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),
理论上讲,只要RS可以出网即可,不需要必须配置外网IP,但走自己的网关,那网关就成为瓶颈了。
由于DR模式的调度器仅进行了目的MAC地址的改写,因此,
调度器LB无法改变请求报文的目的端口。LVS DR模式的办公室在二层数据链路层(MAC),
NAT模式则工作在三层网络层(IP)和四层传输层(端口)。
当前,调度器LB支持几乎所有UNIX、Linux系统,但不支持windows系统。
真实服务器RS节点可以是windows系统。
总之,DR模式效率很高,但是配置也较麻烦。
因此,访问量不是特别大的公司可以用haproxy/Nginx取代之。
这符合运维的原则:简单、易用、高效。
日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/Nginx(LVS的NAT模式)
直接对外的访问业务,例如web服务做RS节点,RS最好用公网IP地址。
如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。
回顾--ARP网络知识
ARP协议,全称"Address Resolution Protocol",中文名是地址解析协议,
使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。
10.0.0.1 ARP 00:50:56:c0:00:08
域名:老男孩教育
IP:汇德商厦403
MAC地址:教室的编号
快递员给学生送快递,最多就知道学校的地址(IP),但是不知道学生在哪个教室。
班主任就是ARP协议,告诉快递员具体的教室。
ARP协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!
为了提高IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫做ARP缓存。
Windows查看ARP缓存命令 arp -a
Linux查看ARP缓存命令 arp -n
Linux解析IP对应的MAC地址 arping -c 1 -I eth0 10.0.0.6
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
arping -I eth0 -c 1 -U 10.0.0.3
测试命令
ip addr del 10.0.0.13/24 dev eth0
ip addr add 10.0.0.13/24 dev eth0
ip addr show eth0
arping -I eth0 -c 1 -U 10.0.0.13
windows查看arp -a
arp_announce和arp_ignore详解
lvs在DR模式下需要关闭arp功能
arp_announce
对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应.
当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.
此时会检查来访IP是否为所有接口上的子网段内ip之一.
如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.
如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
lvs在DR模式下需要关闭arp功能
arp_ignore
定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
抑制RS端arp前的广播情况
抑制RS端arp后广播情况
LVS集群的工作模式总结
DR(Direct Routing)直接路由模式
NAT(Network Address Translation)
TUN(Tunneling)隧道模式
FULLNAT(Full Network Address Translation)
LVS集群的工作模式--NAT
通过网络地址转换,调度器LB重写请求报文的目标地址,根据预设的调度算法,
将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须要通过调度器,
经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。
收费站模式---来去都要经过LB负载均衡器。
LVS集群的工作模式--隧道模式
采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,
调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,
而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。
由于一般网络服务应答数据比请求报文大很多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
VS/TUN工作流程,它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。
调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,
将原请求的报文封装在另一个 IP报文中,再将封装后的IP报文转发给选出的真实服务器;
真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文,
服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,
然后根据路由表将响应报文直接返回给客户。
LVS集群搭建
环境准备
1.准备4台安装好CentOS7.4系统的虚拟机,内存512M。
2.所有虚拟机的防火墙和Selinux关闭
3.主机名及IP地址关系如下:
用之前部署好的 服务器,关闭nginx负载
lb03 10.0.0.5
lb04 10.0.0.6
web01 10.0.0.7
web02 10.0.0.8
4.web03和web04安装Tomcat软件,并满足下面条件:
curl http://10.0.0.7/页面底部得到结果为web03
curl http://10.0.0.8/页面底部得到结果为web04
5.安装好wireshark 2.2.2版本 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、udp链接超时时间(--set)
步骤4:添加虚拟服务(-A),调度算法见man ipvsadm
步骤5:将虚拟服务关联到真实服务上(-a)
步骤6:查看配置结果(-ln)
ip addr add 10.0.0.3/24 dev eth0 label eth0 手动添加。以后通过keepalived就可以了
# ip a s eth0 查看vip
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20 ----wrr轮询算法 -p 会话保持时间默认300秒,这个设置相当于池塘
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 这两个设置相当于标签 -g 表示 DR模式
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1 -----------------------------
ipvsadm -ln 显示
web服务器配置(在web01/web02同时操作下面步骤)
步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 10.0.0.3/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 ---system control 系统控制
使用浏览器访问http://10.0.0.3/
不要在lb01访问!可以在lb02测试(未加入LVS“团伙”)
请求时 源mac地址是访问者 目标mac是负载
响应时 源mac是web服务的 目标mac是访问者
lvsadm的规则是临时的 web绑定的vip也是临时的
lvsadm的规则可以用keepalived解决
web的vip绑定通过修改lo网卡解决
[root@web01 network-scripts]# cp ifcfg-lo ifcfg-lo:1
# vim /etc/sysconfig/network-scripts/ifcfg-lo:1
安装配置Keepalive
步骤1:在lb03和lb04安装Keepalive
yum -y install keepalived
步骤2:配置Keepalive, lb03和lb04的配置文件分成三部分配置
1.global_defs --全局定义
2.vrrp 实例配置 --VIP
3.virtual_server配置 --lvs的配置
第一部分:全局定义
###########lb01###########
global_defs {
router_id LVS_01
}
###########lb02###########
global_defs {
router_id LVS_02
}
第二部分:VIP配置
###########lb01###########
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.13/24
}
}
###########lb02###########
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.13/24
}
}
第三部分:lvs的配置
virtual_server 10.0.0.3 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeput 50
protocol TCP
#等价ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20 ----wrr轮询算法 -p 会话保持时间默认300秒,这个设置相当于池塘
real_server 10.0.0.7 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.8 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#等价ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
重启 keepalived
# /etc/init.d/keepalived restart
清掉之前ipvsadm 规则
ipvsadm -C
重启 keepalived 再查看规则 ipvsadm -ln获取到了
ip a 也能看到虚拟 ip 10.0.0.3
测试 关掉lb01的 keepalived 虚拟ip没了 查看lb02 获取到了 虚拟ip
==========================================
这部分两台负载一样。
根据配置文件对比前面学过的ipvsadm命令
启动Keepalive
检查lb03的vip,ipvsadm -ln是否还在,清除掉。
systemctl start keepalived.service
systemctl status keepalived.service
ip addr show eth0
ipvsadm -ln
可以测试keepalive高可用,故障转移(包含VIP及LVS配置)。
web服务器配置
(在web03/web04同时操作下面步骤)
步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 10.0.0.13/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
测试Keepalive健康检查功能
关闭web03
LVS故障排错
常见LVS负载均衡高可用解决方案
开发类似keepalived的脚本,早期的办法,现在不推荐使用。
heartbeat+lvs+ldirectord脚本配置方案,复杂不易控制,不推荐使用
RedHat工具piranha,一个web界面配置LVS。
LVS-DR+keepalived方案,老师推荐最优方案,简单、易用、高效。
问题1:浏览器访问没有发现轮询效果
答:LVS的轮询不像Nginx明显,可以使用多个客户端访问(Windows和Linux)
问题2:使用抓包工具,发现进行通信的是windows的IP和lb03的80端口,但是lb03明明没有80端口?
答:Windows抓包查看,可以发现数据包的源MAC地址是web01或web02
Linux:tcpdump -nn port 80; tcpdump -nn -e port 80
问题3:客户端的操作有什么含义?
1. RealServer为什么要在lo接口上配置VIP?
答:既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。
在lo上配置vip能够完成接收包并将结果返回client。
2.在eth0网卡上配置VIP可以吗?
答:不可以,将VIP设置在eth0网卡上,会影响RS的arp请求,
造成整体LVS集群arp缓存表紊乱,以至于整个负载均衡集群都不能正常工作。
3.为什么要抑制ARP响应?
先回顾ARP知识及了解arp_announce和arp_ignore作用。