热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

十LVS负载均衡

回顾nginx反向代理负载均衡负载均衡的妙用负载均衡(LoadBalance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理

回顾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<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<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作用。

 


推荐阅读
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 负载均衡基础概念与技术解析
    随着互联网应用的不断扩展,用户流量激增,业务复杂度显著提升,单一服务器已难以应对日益增长的负载需求。负载均衡技术应运而生,通过将请求合理分配到多个服务器,有效提高系统的可用性和响应速度。本文将深入探讨负载均衡的基本概念和技术原理,分析其在现代互联网架构中的重要性及应用场景。 ... [详细]
  • 深入解析OSI七层架构与TCP/IP协议体系
    本文详细探讨了OSI七层模型(Open System Interconnection,开放系统互连)及其与TCP/IP协议体系的关系。OSI模型将网络通信过程划分为七个层次,每个层次负责不同的功能,从物理层到应用层逐步实现数据传输和处理。通过对比分析,本文揭示了OSI模型与TCP/IP协议在结构和功能上的异同,为理解现代网络通信提供了全面的视角。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
author-avatar
林x强
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有