龙空技术网

LVS+Nginx环境搭建(DR模式)

小林软件工作室 172

前言:

当前朋友们对“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.17
2、关闭网络配置器

在LVS服务器和nginx服务器上都进行关闭网络配置管理器, 因为是在本地, 不关闭可能会引起网络接口的冲突

systemctl stop NetworkManagersystemctl disable NetworkManager
3、在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 forever
4、在两台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 forever
5、在两台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 lo
6、在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          0
8、测试

此时集群列表中客户端请求数据和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的算法