负载均衡(load balance)集群,提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。html
懵逼了,Nginx这么好用,为何还要用LVS。linux
简单一句话,当并发量超过Nginx上线,就可使用LVS了。nginx
日1000-2000W PV 或者并发请求10000一下均可以考虑用Nginx。web
大型门户网站,点上网站须要用到LVS。算法
并发访问量达到几十万用LVSvim
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,能够在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最先出现的自由软件项目之一。
windows
官网:http://www.linuxvirtualserver.org/index.html后端
# 中文资料 ,网址里面加zh 就是中文的了 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
CIP:客户端主机IP地址浏览器
VIP:负载均衡主设备缓存
DIP:负载服务器的IPDIZHI
RIP:真实web服务器地址
DR模式是经过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提升集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。
DR模式主要实现过程:
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做用。
只有抑制了,才能只有LB去响应
收费站模式 --- 来去都要通过LB负载均衡器。
经过网络地址转换,调度器LB重写请求报文的目标地址,
根据预设的调度算法,将请求分派给后端的真实服务器,
真实服务器的响应报文处理以后,返回时必需要经过调度器,
通过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。
采用NAT技术时,
因为请求和响应的报文都必须通过调度器地址重写,当客户请求愈来愈多时,调度器的处理能力将成为瓶颈,
为了解决这个问题,调度器把请求的报文经过IP隧道(至关于ipip或ipsec )转发至真实服务器,
而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。
因为通常网络服务应答数据比请求报文大不少,采用 VS/TUN技术后,集群系统的最大吞吐量能够提升10倍。
VS/TUN工做流程,
它的链接调度和管理与VS/NAT中的同样,只是它的报文转发方法不一样。
调度器根据各个服务器的负载状况,链接数多少,动态地选择一台服务器,
将原请求的报文封装在另外一个 IP报文中,再将封装后的IP报文转发给选出的真实服务器;
真实服务器收到报文后,先将收到的报文解封得到原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),因此就处理这个请求,而后根据路由表将响应报文直接返回给客户。
类比地铁站多个闸机。
LVS的DR和NAT模式要求RS和LVS在同一个vlan中,致使部署成本太高; TUNNEL模式虽然能够跨vlan,但RealServer上须要部署ipip隧道模块等,网络拓扑上须要连通外网,较复杂,不易运维。
为了解决上述问题,
开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了作DNAT,还作SNAT(用户ip->内网ip),
从而实现LVS-RealServer间能够跨vlan通信,RealServer只须要链接到内网。
ARP协议,全程“Address Resolution Protocol”,中文名是地址解析协议,使用ARP协议可实现经过IP地址得到对应主机的物理地址(MAC地址)。
10.0.0.1 ------>ARP ------> 00:50:55:AV:c4:09
ARP是第三层协议,工做在第二层
一个比喻:
快递员给学生送快递,最多就知道学校地址(IP),可是不知道学生在那个教室,坐在哪一个位置,班主任就是ARP歇息,告诉快递员具体的教室。
ARP协议要求通讯的主机双方必须在同一个物理网段(即局域网环境)!
经过抓包软件WireShark看一下,抓包VM8网卡搜arp,回车
在Linux里面ping 10.0.0.5
查看抓包过程
删除缓存后,从新广播
为了提升IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫作ARP缓存。
Windows查看ARP缓存命令 arp -a Linux查看ARP缓存命令 arp -n Linux解析IP对应的MAC地址 arping -c 1 -I eth0 10.0.0.6
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
LVS在DR模式下须要关闭arp功能
对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制:
肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 - 尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.
此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.
首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.
若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送.
定义对目标地址为本地IP的ARP询问不一样的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应 4-7 - 保留未使用 8 - 不回应全部(本地地址)的arp查询
1.准备4台安装好CentOS7.4系统的虚拟机,内存512M。 2.全部虚拟机的防火墙和Selinux关闭 3.主机名及IP地址关系以下: lb03 10.0.0.15 (将以前部署的keeplived和nginx关掉) lb04 10.0.0.16 (将以前部署的keeplived和nginx关掉) web03 10.0.0.17 web04 10.0.0.18 4.web03和web04安装Tomcat软件,并知足下面条件: curl http://10.0.0.17/页面底部获得结果为web03 10.0.0.17 curl http://10.0.0.18/页面底部获得结果为web04 10.0.0.18 5.安装好wireshark 2.2.2版本 2.2.x版本以上便可
# 查看系统的LVS模块。 lsmod|grep ip_vs # 默认没有加载模块,须要安装管理工具才会激活。 yum -y install ipvsadm keeplivaed -y # 查看当前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、udp连接超时时间(--set) 步骤4:添加虚拟服务(-A),调度算法见man ipvsadm 步骤5:将虚拟服务关联到真实服务RS上(-a) 步骤6:查看配置结果(-ln) ip addr add 10.0.0.13/24 dev eth0 label eth0:1 ipvsadm -C ipvsadm --set 30 5 60 ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20 wrr是加权轮询,-p是会话保持时间,至关于建立了一个池塘 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
-g 表示DR模式,默认的
已配置好,能够转发了,能够做MAC地址的转换了
步骤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
可使用了!
使用浏览器访问http://10.0.0.13/,同时使用wireshark抓取数据包http
不要在lb03本地访问测试!能够在lb04测试(未加入LVS“团伙”)
LVS不像nginx那样1:1很强烈的规律,只有访问频率很高的时候,近似的1:1
添加的内核参数,是永久的
可是添加的规则是临时的,即ipvsadm -ln 的规则(稍后用keepalived好一些)
咱们添加的VIP,lo网卡上绑定的IP是临时的
解决:
一、复制lo网卡的配置文件为ifcfg-lo:1 2、修改配置,名字、IP、子网掩码,以下,而后保存 3、重启网卡 [root@web03 ~]# cd /etc/sysconfig/network-scripts/ [root@web03 network-scripts]# cp ifcfg-lo ifcfg-lo:1 [root@web03 network-scripts]# vim ifcfg-lo:1 DEVICE=lo:1 IPADDR=10.0.0.13 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) NETMASK=255.255.255.255 ONBOOT=yes NAME=lo:1 [root@web03 network-scripts]# systemctl restart network.service
问题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:客户端的操做有什么含义?
接下来的实验又是一个新的开始,配置负载均衡不须要ipvsadm这个工具,由于keepalived原本就是另一个自动管理工具。
步骤1:在lb03和lb04安装Keepalive yum -y install keepalived 步骤2:配置Keepalive, lb03和lb04的配置文件分红三部分配置(man keepalived.conf) 1.global_defs ------>全局定义 2.vrrp 实例配置 ------>VIP 3.virtual_server配置 --->lvs的配置
第一部分-全局定义
###########lb03########### 至关于 global_defs { router_id LVS_03 } ###########lb04########### global_defs { router_id LVS_04 }
router_id 每个keeplive的配置都有的独一无二的,至关于身份证号
第二部分-VIP配置
###########lb03########### 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 { # VIP 10.0.0.13/24 } } ###########lb04########### vrrp_instance VI_1 { 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配置,管理和配置lvs
这部分两台负载同样。根据配置文件对比前面学过的ipvsadm命令
virtual_server 10.0.0.13 80 { # 至关于 ipvsadm -A -t 10.0.0.13:80 delay_loop 6 # 循环次数 lb_algo wrr # 轮询的模式 lb_bind DR # 模式 nat_mask 255.255.255.0 persistence_timeout 50 # 会话保持的时间 也是-A中的 protocol TCP real_server 10.0.0.17 80 { # 至关于ipvs -a weight 1 TCP_CHECK { # 端口的检测,如端口挂掉怎么作,还有其余如HTTP_CHECK等 connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.18 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
那么主备有什么区别呢?推荐使用beyongdCompare软件对比
vim /etc/keepalived/keepalived.conf 修改配置文件
重启两台主机的keepalived 服务
先检查lb03的vip,ipvsadm -ln是否还在,清除掉。
ipvsadm -ln
ipvsadm -C /etc/init.d/keepalived restart
ipvsadm -ln 检查 配置规则,又从新有了
# Centos7的操做 systemctl start keepalived.service systemctl status keepalived.service ip addr show eth0 ipvsadm -ln 能够测试keepalive高可用,故障转移(包含VIP及LVS配置)。
测试keepalive的高可用功能
关闭lb01的keepalived服务,而后查看lb02的ip,检查VIP
测试Keepalive的健康检查功能
关闭web03
部署NAT模式
完成Keepalived多实例