前言:
当前朋友们对“lvs的算法”都比较着重,你们都需要分析一些“lvs的算法”的相关文章。那么小编同时在网上汇集了一些对于“lvs的算法””的相关资讯,希望姐妹们能喜欢,同学们一起来学习一下吧!一、LVS简介
LVS(linux virtual server)——->linux虚拟服务器,目前LVS模块已经被集成在linux内核中了。该项目在linux内核中实现了基于ip的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己欲设算法将该请求发送给后端的某台web服务器,比如轮询调度法,一共有8中调度方法。LVS工作模式可以分为NAT模式、TUN模式和DR模式。
二、三种LVS工作模式详细1、基于NAT的LVS模式负载均衡
NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外王,以及外部用户可以访问位于公司内部的私有的ip主机。
工作过程:
(1):用户通过互联网DNS服务器解析到公司负载均衡设备上的外网地址,相对于真实服务器而言,LVS外网ip又称为vip,用户通过访问vip,即可连接后端的真实服务器,而此时用户对这一切都是不可知的,用户认为自己还在访问真实的后端服务器,也不知道自己访问的vip只是一个调度器。
(2):用户将请求发送至调度器上,此时LVS根据算法选择一个后端的真实服务器,将数据请求包转发给真实服务器,并在转发之前LVS会修改数据包中的目标地址以及目标端口,此时修改为真实的服务器ip地址
(3):真实的服务器将响应的数据包返回给LVS调度器,调度器在响应数据包后会将源地址和源端口修改为vip及调度器相应端口,修改完成后,由调度器响应数据包发送给终端
LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash’表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。
NAT的优点时服务器可以运行在任何支持TCP/IP的操作系统,他只需要在调度器上配置一个ip,服务器组可以用私有的ip地址。
NAT的缺点时伸缩能力有限,当服务器节点数目上升到20时,调度器本身有可能成为系统的新瓶颈,因为请求和响应的报文都需要经过调度器。
2、 基于TUN的LVS负载均衡
LVS(NAT)模式的集群环境中,所有数据包的请求的回应的哦欧需要经过调度器处理,但是在TUN模式中,将NAT模式中的问题有所解决。因为数据包的请求包往往远远小于响应数据包的大小。因为响应数据包中有包含客户需要的具体数据所以,TUN的原理就是将请求与响应数据分离。,让调度器仅仅处理数据请求,让真实的服务器响应数据包直接返回给客户。
IP(隧道)是一种数据包分装技术,他可以经原始的数据包分装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的vip地址的数据包分装,通过隧道转发给真实的后端服务器,通过将客户端发往调度器的原始数据包分装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务的ip地址以及对应端口),lLVS(Tun)模式要求真实的服务器可以与外部网络连接,真实服务器在受到请求数据包后直接给客户端返回响应数据。
LVS(Tun)技术对服务器有要求,即所有服务器必须支持”IP Tunneling”或者IP Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。
3、LVS(DR)负载均衡
在LVS(TUN)模式中,需要LVS调度器与真实的服务器之间创建隧道连接,这样就会增加服务器的负担。DR模式也叫路由模式,该模式中LVS依然仅承担数据的请求以及根据算法调度出合理的后端服务器,最终由后端真实服务器负责响应数据包发送返回给客户端。与隧道模式不同的是,DR模式要求调度器与后端服务器必须在统一个局域网内u,VIP地址需要在调度器与后端所有服务器之间共享,因为最终的真实服务器会给客户端回应数据包时需要设置源IP为VIP,目标IP为客户端IP,这样客户端访问的时调度器VIP地址,回应的源地址也是VIP,这样客户端是感觉不到后端服务器的存在。由于多台计算机都设置了同样的VIP地址,所以在直接路由模式中要求调度器的VIP是对外可见的,客户端将请求数据包发送到调度器主机,而所有的真实服务器的VIP必须配置在Non-ARP的网络上ARP是一个协议。调度器根据算法在选出真实的服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实的MAC地址,通过交换机将该数据帧发给真实的服务器。
二、LVS+Nginx环境搭建
这里搭建的是DR模式。
1、环境
lvs 192.168.192.15nginx01 192.168.192.11nginx01 192.168.192.12vip 192.168.192.172、关闭网络配置器
在LVS服务器和nginx服务器上都进行关闭网络配置管理器, 因为是在本地, 不关闭可能会引起网络接口的冲突
systemctl stop NetworkManagersystemctl disable NetworkManager3、在LVS服务器(DR)构建虚拟IP
cd /etc/sysconfig/network-scripts/
可用ip addr查看自己的网网卡名称,我的双机ens33
拷贝ifcfg-ens33重命名为ifcfg-ens33:1
cp ifcfg-ens33 ifcfg-ens33:1
修改ifcfg-ens33:1,写入如下内容5项内容即可
BOOTPROTO=staticDEVICE=ens33:1ONBOOT=yesIPADDR=192.168.192.17NETMASK=255.255.255.0
这里VIP用192.168.192.17
重启网络服务
service network restart
稍等一会,再执行ip addr就可以看到多了17
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:5c:fa:ce brd ff:ff:ff:ff:ff:ff inet 192.168.192.15/24 brd 192.168.192.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.192.17/24 brd 192.168.192.255 scope global secondary ens33:1 valid_lft forever preferred_lft forever4、在两台nginx(SR)构建虚拟IP
在SR上构建虚拟机IP,但只是用于返回数据,而不能被用户访问到,这时候需要操作ifcfg-lo。
将ifcfg-lo拷贝一份ifcfg-lo:1,并修改ifcfg-lo:1配置
cd /etc/sysconfig/network-scripts/cp ifcfg-lo ifcfg-lo:1vi ifcfg-lo:1
内容如下
DEVICE=lo:1IPADDR=192.168.192.17NETMASK=255.255.255.255NETWORK=127.0.0.0# 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)BROADCAST=127.255.255.255ONBOOT=yesNAME=loopback
刷新lo
ifup lo
用ip addr查看可以看到
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.192.17/32 brd 192.168.192.17 scope global lo:1 valid_lft forever preferred_lft forever5、在两台Nginx服务器(RS)配置地址解析协议
下面的操作,两台RS都需要进行操作
arp-ignore:ARP响应级别(处理请求)
0:只要本机配置了ip,就能响应请求1:请求的目标地址到达对应的网络接口,才会响应请求
这里会设置为1
arp-announce:ARP通告行为(返回响应)
0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告 1:尽可能避免本网卡与不匹配的目标进行通告 2:只在本网卡通告
这里会设置为2
上面的两个设置,目的就是精确到只有某一个网卡能处理响应对应的请求。
配置文件:/etc/sysctl.conf,将如下文件拷贝进去:
#configration for lvsnet.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_announce = 2
刷新配置
sysctl -p
添加路由
route add -host 192.168.192.17 dev lo:1
此时如果无法识别route,需要安装相关工具
yum install net-tools
添加了一个host地址,目的是用于接收数据报文,接收到了数据报文后会交给lo:1处理。(防止关机失效,需要将上述命令添加到/etc/rc.local中)
添加完host后,可以查看一下:route -n,能明显看到效果
[root@localhost network-scripts]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.192.2 0.0.0.0 UG 100 0 0 ens33192.168.192.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33192.168.192.17 0.0.0.0 255.255.255.255 UH 0 0 0 lo6、在lvs服务器(DR)上安装集群管理工具ipvsadm
ipvsadm用于对lvs集群进行管理,需要手动安装。DS安装即可。
安装命令
yum install ipvsadm
查看版本
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
到这里,环境就已经准备好了
7、集群配置(只需要在DS操作)
ipvsadm命令
ipvsadm -A:用于创建集群ipvsadm -E:用于修改集群ipvsadm -D:用于删除集群ipvsadm -C:用于清除集群数据ipvsadm -R:用于重置集群配置规则ipvsadm -S:用于保存修改的集群规则ipvsadm -a:用于添加一个rs节点ipvsadm -e:用于修改一个rs节点ipvsadm -d:用于删除一个rs节点
lvs服务器(DS)添加集群TCP服务地址:(外部请求由该配置指定的VIP处理)
ipvsadm -A -t 192.168.192.17:80 -s rr
参数说明
-A:添加集群配置-t:TCP请求地址(VIP)-s:负载均衡算法
负载均衡算法
rr:轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况wrr:加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。Wlc:加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RSDh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RSSH:源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RSLc:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.Lblc:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。
查看结果
[root@localhost network-scripts]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.192.17:80 rr
lvs服务器(DS)配置Nginx服务器(RS)
ipvsadm -a -t 192.168.192.17:80 -r 192.168.192.11:80 -gipvsadm -a -t 192.168.192.17:80 -r 192.168.192.12:80 -g
参数说明
-a:给集群添加一个节点-t:指定VIP地址-r:指定real server地址-g:表示LVS的模式为dr模式
添加了节点后,我们通过ipvsadm -Ln查看,可以看到多了2个节点。
[root@localhost network-scripts]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.192.17:80 rr -> 192.168.192.11:80 Route 1 0 0 -> 192.168.192.12:80 Route 1 0 08、测试
此时集群列表中客户端请求数据和TCP通信数据会持久化保存,为了更好看到页面请求轮训效果,我们可以把时间设置成2秒保存,如下命令:
#--set tcp tcpfin udp set connection timeout valuesipvsadm --set 5 5 5
先开启80端口
firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --reload
浏览器访问
可以看到,成功在192.168.192.11和192.168.192.12的nginx上切换。
看看当前对应的Nginx的ip
#--connection -c output of current IPVS connectio[root@localhost network-scripts]# ipvsadm -LncIPVS connection entriespro expire state source virtual destinationTCP 00:03 ESTABLISHED 192.168.192.1:49355 192.168.192.17:80 192.168.192.11:80
完成!
标签: #lvs的算法