随着移动互联网的加速,应用大规模同时使用的情况成为了常态,如微博、知乎、今日头条等大型应用,作为Linux运维从业者,高并发场景的解决能力成为了高薪的关键。
今天我们特别邀请了资深的Linux运维老司机
惨绿少年Linux
来给大家普及高并发场景 LVS的实现过程,助你高薪之路顺畅。
作者:惨绿少年Linux,马哥Linux原创作者社群特约作者,资深Linux运维工程师,作者博客:www.nmtui.com,擅长虚拟化、OpenStack等前沿技术。
1.1 负载均衡介绍
1.1.1 负载均衡的妙用
负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
单台计算机无法承受大规模的并发访问或数据流量了,此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减少用户等待响应的时间又提升了用户体验;
7*24小时的服务保证,任意一个或多个有限后端节点设备宕机,不能影响整个业务的运行。
1.1.2 为什么要用lvs
工作在网络模型的7层,可以针对http应用做一些分流的策略,比如针对域名、目录结构,Nginx单凭这点可利用的场合就远多于LVS了。
最新版本的Nginx也支持4层TCP负载,曾经这是LVS比Nginx好的地方。
Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一,相反LVS对网络稳定性依赖比较大。
Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
那为什么要用lvs呢?
简单一句话,当并发超过了Nginx上限,就可以使用LVS了。
日1000-2000W PV或并发请求1万以下都可以考虑用Nginx。
大型门户网站,电商网站需要用到LVS。
1.2 LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。
1.2.1 相关参考资料
LVS官网: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
1.2.2 LVS
内核模块
ip_vs
介绍
早在2.2内核时, IPVS就已经以内核补丁的形式出现。
从2.4.23版本开始,IPVS软件就合并到Linux内核的常用版本的内核补丁的集合。
从2.4.24以后IPVS已经成为Linux官方标准内核的一部分。
LVS无需安装
安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive
ipvsadm是通过命令行管理,而keepalive读取配置文件管理
后面我们会用Shell脚本实现keepalive的功能
1.3 LVS集群搭建
1.3.1
集群环境说明
主机说明
[root@lb03 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@lb03 ~]# uname -a
Linux lb03 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@lb03 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic
firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@lb03 ~]# getenforce
Disabled
web环境说明
[root@lb03 ~]# curl 10.0.0.17
web03
[root@lb03 ~]# curl 10.0.0.18
web04
web服务器的搭建参照:
Tomcat: http://www.cnblogs.com/clsn/p/7904611.html
Nginx: http://www.cnblogs.com/clsn/p/7750615.html
1.3.2
安装
ipvsadm
管理工具
安装管理工具
查看当前LVS状态,顺便激活LVS内核模块。
查看系统的LVS模块。
[root@lb03 ~]
ip_vs_wrr 12697 1
ip_vs 141092 3 ip_vs_wrr
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
1.3.3 LVS
集群搭建
配置LVS负载均衡服务(在lb03操作)
步骤
1
:在
eth0
网卡绑定
VIP
地址(
ip
)
步骤
2
:清除当前所有
LVS
规则(
-C
)
步骤
3
:设置
tcp
、
tcpfin
、
udp
链接超时时间(
--set
)
步骤
4
:添加虚拟服务(
-A
),
-t
指定虚拟服务的
IP
端口,
-s
指定调度算法
调度算法见
man ipvsadm
,
rr wrr
权重轮询
-p
指定超时时间
步骤
5
:将虚拟服务关联到真实服务上(
-a
)
-r
指定真实服务的
IP
端口
-g LVS
的模式
DR
模式
-w
指定权重
步骤
6
:查看配置结果(
-ln
)
命令集:
ip addr add 10.0.0.13/24 dev eth0
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.17:80 -g -w 1
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.18:80 -g -w 1
ipvsadm -ln
检查结果:
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.13:80 wrr persistent 20
-> 10.0.0.17:80 Route 1 0 0
-> 10.0.0.18:80 Route 1 0 0
ipvsadm参数说明:(更多参照 man ipvsadm)
1.3.4
在
web
浏览器配置操作
步骤
1
:在
lo
网卡绑定
VIP
地址(
ip
)
步骤
2
:修改内核参数抑制
ARP
响应
命令集:
ip addr add 10.0.0.13/32 dev lo
cat >>/etc/sysctl.conf<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
至此LVS集群配置完毕!
1.3.5
进行访问测试
浏览器访问:
命令行测试:
[root@lb04 ~]# curl 10.0.0.13
web03
抓包查看结果:
arp
解析查看:
[root@lb04 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.254 ether 00:50:56:e9:9f:2c C eth0
10.0.0.18 ether 00:0c:29:ea:ca:55 C eth0
10.0.0.13 ether 00:0c:29:de:7c:97 C eth0
172.16.1.15 ether 00:0c:29:de:7c:a1 C eth1
10.0.0.17 ether 00:0c:29:4a:ac:4a C eth0
1.4 负载均衡(LVS)相关名词
术语说明:
DS:Director Server。指的是前端负载均衡器节点。
RS:Real Server。后端真实的工作服务器。
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
RIP:Real Server IP,后端服务器的IP地址。
CIP:Client IP,访问客户端的IP地址。
1.4.1 LVS
集群的工作模式
--DR
直接路由模式
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提高集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。
DR直接路由模式说明:
a
)通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
b)请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高,比Nginx代理模式强于此处。
c)因DR模式是通过MAC地址的改写机制实现转发的,因此,所有RS节点和调度器LB只能在同一个局域网中。需要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题。
d)强调下:RS节点的默认网关不需要是调度器LB的DIP,而应该直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论上讲,只要RS可以出网即可,不需要必须配置外网IP,但走自己的网关,那网关就成为瓶颈了。
e)由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端口。LVS DR模式的办公室在二层数据链路层(MAC),NAT模式则工作在三层网络层(IP)和四层传输层(端口)。
f)当前,调度器LB支持几乎所有UNIX、Linux系统,但不支持windows系统。真实服务器RS节点可以是windows系统。
g)总之,DR模式效率很高,但是配置也较麻烦。因此,访问量不是特别大的公司可以用haproxy/Nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/Nginx(LVS的NAT模式)
h)直接对外的访问业务,例如web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。
DR的实现原理和数据包的改变
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
1.5 在web端的操作有什么含义?
1.5.1 RealServer
为什么要在
lo
接口上配置
VIP
?
既然要让
RS
能够处理目标地址为
vip
的
IP
包,首先必须要让
RS
能接收到这个包。
在
lo
上配置
vip
能够完成接收包并将结果返回
client
。
1.5.2
在
eth0
网卡上配置
VIP
可以吗?
不可以,将
VIP
设置在
eth0
网卡上
,
会影响
RS
的
arp
请求
,
造成整体
LVS
集群
arp
缓存表紊乱,以至于整个负载均衡集群都不能正常工作。
1.5.3
为什么要抑制
ARP
响应?
① arp协议说明
ARP
协议
,
全称
"Address Resolution Protocol",
中文名是地址解析协议,使用
ARP
协议可实现通过
IP
地址获得对应主机的物理地址
(MAC
地址
)
。
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缓存表是把双刃剑
a)
主机有了
arp
缓存表,可以加快
ARP
的解析速度,减少局域网内广播风暴。因为
arp
是发广播解析的,频繁的解析也是消耗带宽的,尤其是机器多的时候。
b)
正是有了
arp
缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是
arp
欺骗攻击。
c)
切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端
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.13
测试命令
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
接口: 10.0.0.1 --- 0x12
Internet 地址 物理地址 类型
10.0.0.13 00-0c-29-de-7c-97 动态
10.0.0.15 00-0c-29-de-7c-97 动态
10.0.0.16 00-0c-29-2e-47-20 动态
10.0.0.17 00-0c-29-4a-ac-4a 动态
10.0.0.18 00-0c-29-ea-ca-55 动态
③
arp_announce
和
arp_ignore
详解
# 配置的内核参数
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
lvs
在
DR
模式下需要关闭
arp
功能
arp_announce
对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
arp_ignore定义
对目标地定义对目标地址为本地IP的ARP询问不同的应答模式0
抑制RS端arp前的广播情况
抑制RS端arp后广播情况
1.6 LVS集群的工作模式
DR(Direct Routing)直接路由模式
NAT(Network Address Translation)
TUN(Tunneling)隧道模式
FULLNAT(Full Network Address Translation)
|
1.6.1 LVS
集群的工作模式
--NAT
通过网络地址转换,调度器LB重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。
收费站模式---来去都要经过LB负载均衡器。
NAT方式的实现原理和数据包的改变
l
RS
应该使用私有地址,
RS
的网关必须指向
DIP
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS-NAT
模型的特性
l
DIP
和
RIP
必须在同一个网段内
l
请求和响应报文都需要经过
Director Server
,高负载场景中,
Director Server
易成为性能瓶颈
l
支持端口映射
l
RS
可以使用任意操作系统
l
缺陷:对
Director Server
压力会比较大,请求和响应都需经过
director server
1.6.2 LVS
集群的工作模式
--
隧道模式
TUN
采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
VS/TUN工作流程,它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
TUN原理和数据包的改变
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
l
RIP
、
VIP
、
DIP
全是公网地址
LVS-Tun
模型特性
l
RS
的网关不会也不可能指向
DIP
l
所有的请求报文经由
Director Server
,但响应报文必须不能进过
Director Server
l
不支持端口映射
l
RS
的系统必须支持隧道
1.6.3 LVS
集群的工作模式
--FULLNAT
LVS
的