个人随笔
目录
LVS+Nginx环境搭建(DR模式)
2023-08-13 16:33:00

一、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、环境

  1. lvs 192.168.192.15
  2. nginx01 192.168.192.11
  3. nginx01 192.168.192.12
  4. vip 192.168.192.17

2、关闭网络配置器

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

  1. systemctl stop NetworkManager
  2. systemctl disable NetworkManager

3、在LVS服务器(DR)构建虚拟IP

  1. cd /etc/sysconfig/network-scripts/

可用ip addr查看自己的网网卡名称,我的双机ens33

拷贝ifcfg-ens33重命名为ifcfg-ens33:1

  1. cp ifcfg-ens33 ifcfg-ens33:1

修改ifcfg-ens33:1,写入如下内容5项内容即可

  1. BOOTPROTO=static
  2. DEVICE=ens33:1
  3. ONBOOT=yes
  4. IPADDR=192.168.192.17
  5. NETMASK=255.255.255.0

这里VIP用192.168.192.17

重启网络服务

  1. service network restart

稍等一会,再执行ip addr就可以看到多了17

  1. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  2. link/ether 00:0c:29:5c:fa:ce brd ff:ff:ff:ff:ff:ff
  3. inet 192.168.192.15/24 brd 192.168.192.255 scope global ens33
  4. valid_lft forever preferred_lft forever
  5. inet 192.168.192.17/24 brd 192.168.192.255 scope global secondary ens33:1
  6. valid_lft forever preferred_lft forever

4、在两台nginx(SR)构建虚拟IP

在SR上构建虚拟机IP,但只是用于返回数据,而不能被用户访问到,这时候需要操作ifcfg-lo。
将ifcfg-lo拷贝一份ifcfg-lo:1,并修改ifcfg-lo:1配置

  1. cd /etc/sysconfig/network-scripts/
  2. cp ifcfg-lo ifcfg-lo:1
  3. vi ifcfg-lo:1

内容如下

  1. DEVICE=lo:1
  2. IPADDR=192.168.192.17
  3. NETMASK=255.255.255.255
  4. NETWORK=127.0.0.0
  5. # If you're having problems with gated making 127.0.0.0/8 a martian,
  6. # you can change this to something else (255.255.255.255, for example)
  7. BROADCAST=127.255.255.255
  8. ONBOOT=yes
  9. NAME=loopback

刷新lo

  1. ifup lo

用ip addr查看可以看到

  1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  3. inet 127.0.0.1/8 scope host lo
  4. valid_lft forever preferred_lft forever
  5. inet 192.168.192.17/32 brd 192.168.192.17 scope global lo:1
  6. valid_lft forever preferred_lft forever

5、在两台Nginx服务器(RS)配置地址解析协议

下面的操作,两台RS都需要进行操作

arp-ignore:ARP响应级别(处理请求)

  1. 0:只要本机配置了ip,就能响应请求
  2. 1:请求的目标地址到达对应的网络接口,才会响应请求

这里会设置为1

arp-announce:ARP通告行为(返回响应)
0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告 1:尽可能避免本网卡与不匹配的目标进行通告 2:只在本网卡通告
这里会设置为2

上面的两个设置,目的就是精确到只有某一个网卡能处理响应对应的请求。

配置文件:/etc/sysctl.conf,将如下文件拷贝进去:

  1. #configration for lvs
  2. net.ipv4.conf.all.arp_ignore = 1
  3. net.ipv4.conf.default.arp_ignore = 1
  4. net.ipv4.conf.lo.arp_ignore = 1
  5. net.ipv4.conf.all.arp_announce = 2
  6. net.ipv4.conf.default.arp_announce = 2
  7. net.ipv4.conf.lo.arp_announce = 2

刷新配置

  1. sysctl -p

添加路由

  1. route add -host 192.168.192.17 dev lo:1

此时如果无法识别route,需要安装相关工具

  1. yum install net-tools

添加了一个host地址,目的是用于接收数据报文,接收到了数据报文后会交给lo:1处理。(防止关机失效,需要将上述命令添加到/etc/rc.local中)
注:记得加开机自启权限

  1. chmod +x /etc/rc.d/rc.local

添加完host后,可以查看一下:route -n,能明显看到效果

  1. [root@localhost network-scripts]# route -n
  2. Kernel IP routing table
  3. Destination Gateway Genmask Flags Metric Ref Use Iface
  4. 0.0.0.0 192.168.192.2 0.0.0.0 UG 100 0 0 ens33
  5. 192.168.192.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
  6. 192.168.192.17 0.0.0.0 255.255.255.255 UH 0 0 0 lo

6、在lvs服务器(DR)上安装集群管理工具ipvsadm

ipvsadm用于对lvs集群进行管理,需要手动安装。DS安装即可。

安装命令

  1. yum install ipvsadm

查看版本

  1. ipvsadm -Ln
  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

到这里,环境就已经准备好了

7、集群配置(只需要在DS操作)

ipvsadm命令

  1. ipvsadm -A:用于创建集群
  2. ipvsadm -E:用于修改集群
  3. ipvsadm -D:用于删除集群
  4. ipvsadm -C:用于清除集群数据
  5. ipvsadm -R:用于重置集群配置规则
  6. ipvsadm -S:用于保存修改的集群规则
  7. ipvsadm -a:用于添加一个rs节点
  8. ipvsadm -e:用于修改一个rs节点
  9. ipvsadm -d:用于删除一个rs节点

lvs服务器(DS)添加集群TCP服务地址:(外部请求由该配置指定的VIP处理)

  1. ipvsadm -A -t 192.168.192.17:80 -s rr

参数说明

  1. -A:添加集群配置
  2. -tTCP请求地址(VIP)
  3. -s:负载均衡算法

负载均衡算法

  • rr:轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况
  • wrr:加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
  • Wlc:加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS
  • Dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS
  • SH:源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS
  • Lc:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.
  • Lblc:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

查看结果

  1. [root@localhost network-scripts]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 192.168.192.17:80 rr

lvs服务器(DS)配置Nginx服务器(RS)

  1. ipvsadm -a -t 192.168.192.17:80 -r 192.168.192.11:80 -g
  2. ipvsadm -a -t 192.168.192.17:80 -r 192.168.192.12:80 -g

参数说明

  1. -a:给集群添加一个节点
  2. -t:指定VIP地址
  3. -r:指定real server地址
  4. -g:表示LVS的模式为dr模式

添加了节点后,我们通过ipvsadm -Ln查看,可以看到多了2个节点。

  1. [root@localhost network-scripts]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 192.168.192.17:80 rr
  6. -> 192.168.192.11:80 Route 1 0 0
  7. -> 192.168.192.12:80 Route 1 0 0

8、测试

此时集群列表中客户端请求数据和TCP通信数据会持久化保存,为了更好看到页面请求轮训效果,我们可以把时间设置成2秒保存,如下命令:

  1. #--set tcp tcpfin udp set connection timeout values
  2. ipvsadm --set 5 5 5

先开启80端口

  1. firewall-cmd --zone=public --add-port=80/tcp --permanent
  2. firewall-cmd --reload

浏览器访问http://192.168.192.17/

可以看到,成功在192.168.192.11和192.168.192.12的nginx上切换。

看看当前对应的Nginx的ip

  1. #--connection -c output of current IPVS connectio
  2. [root@localhost network-scripts]# ipvsadm -Lnc
  3. IPVS connection entries
  4. pro expire state source virtual destination
  5. TCP 00:03 ESTABLISHED 192.168.192.1:49355 192.168.192.17:80 192.168.192.11:80

完成!

 125

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2