集群及高可用之LVS负载均衡(三种工作模式介绍)

linux自动化运维也好,云计算自动化运维也罢,基础技术都必须掌握严实,今天我们一起来完整的介绍一下真正的集群以及高可用技术中的LVS负载均衡技术。博客的引入内容是参考博客园的一位博主的文字内容,又加以详细补充完善,加上自己实践的两种LVS的工作模式。
参考的博客园:https://www.cnblogs.com/xiaocheche/p/7695024.html

1.1 什么是集群?

随着互联网的发展,大量的客户端请求蜂拥而至,同时服务器的负载也越来越大,然而单台服务器的负载又是有限的,这样就会导致服务器响应客户嘴请求的时间越长,模至产生拒绝服务的情况。

另外,目前的网站多 数是7x24小时提供不同断网络服务,如果仅采用单点服务器对外提供网络服务,那么在出现单点故障时,将导致整个网络服务中断。这时我们需要部署集群架构,最终将成百上千台主机有机地结合在一起, 以满足当前大数据时代的海量访问负载。

在部署集群环境时可以选择的产品有很多,有些是基于硬件实现的,有些是基于软件实现的。其中负载均衡的硬件设备有F5的BIG-IP、Radware 的Apirector,以及梭子鱼的负载均衡设备等,软件有基于Linux的LVS、Nginx和HAProxY等产品。在集群环境中的核心是负载均衡和高可用,最近几次博客更新内容围绕这两点核心功能进行软件实现。

1.2 LVS负载均衡简介:(本博客中的结构图和拓扑图,我采用的是PPT绘制)

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导开发的开源负载均衡项目。目前LVS已经被集成到Linux内核模块中,(其体系结构图如下所示:)

该项目在Linux内核中实现了 基于IP的数据请求 负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的WEB请求会发送给LVS调度器,调度器根据自己预设的算法决定将请求发送给后端的某台WEB服务器。

比如轮询算法 可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也都是相同的服务,最终用户不管访问哪台真实的服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。

最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户所需要的数据发送给终端用户,LVS工作模式分为NAT模式,TUN模式以及DR模式;

集群及高可用之LVS负载均衡(三种工作模式介绍)_第1张图片

1.3 基于NAT的LVS负载均衡:

NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使位于企业内部的私有IP可以访问外网,以及外部用户可以访问位于公司内部的私有IP地址主机,VS/NAT 的拓扑图如下图所示:
LVS负载调度器使用两块网卡配置不同的IP地址,eth1设置为私钥IP与内部网络通过交换设备相互连接,eth0设置为外网IP与外部网络连通;

第一步:
用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网IP地址,
相对于真实服务器而言,LVS的外网IP又称为VIP(Virtual IP Address),
用户通过访问VIP,即可连接后端的真实服务器,而这一切对用户而言都是透明的,
用户以为自己访问的就是真实的服务器,
但他并不知道自己访问的VIP仅仅是一个调度器,
也不清楚后端的真实服务器到底在哪里,有多少台真实服务器;

第二步:用户将数据请求发送至外网IP地址,此时LVS将根据预设的算法选择后端的一台真实服务器,将数据请求包发送给真实服务器,并且在转发之前LVS会 修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选中的真实服务器IP地址以及相应的端口;

第三步:真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应数据包后会将源地址与源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送给终端用户,另外由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据该记录信息选出相同的真实服务器及端口信息;

集群及高可用之LVS负载均衡(三种工作模式介绍)_第2张图片

1.4 基于TUN的LVS负载均衡

在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个 集群环境的瓶颈,

我们知道数据请求包往往远远小于响应数据包的大小

因为响应数据包中包含有客户端需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器将响应数据包直接返回给客户端,

VS/TUN工作模式中的IP隧道(IP tunning)是一种数据包封装技术,它 可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口,目标地址及端口),
从而实现将一个目标为调度器VIP的数据包封装,通过隧道转发给后端的 真实服务器,通过将客户端发送调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口)

LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据;
其拓扑图如下:

集群及高可用之LVS负载均衡(三种工作模式介绍)_第3张图片

1.5 基于DR的LVS负载均衡

在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担,与LVS(TUN)类似,DR模式也叫直接路由模式,该模 式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端,

与隧道模式不同的是,直接路由模式要求调度器与后端服务器必须在一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源地 址为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),

客户端是感觉不到后端服务器存在的,由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所 有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,

真实服务器的VIP对外界是不可见的, 但真实服务器却可以接收目标地址为VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址,调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的服务器的MAC地址,通过交换机将该数据帧转发给真实服务器,整个过程中,真实服务器的VIP不需要对外界可见。
其拓扑图如图所示:

集群及高可用之LVS负载均衡(三种工作模式介绍)_第4张图片

1.6 LVS复制均衡调度算法:

根据前面的介绍,我们了解了LVS的三种模式,但不管实际环境中采用的是哪种模式,调度器进行调度的策略与算法都是LVS的核心技术,LVS在内核中主要实现了以下 八种调度算法:
       轮询调度;
       加权轮询调度;
       最小连接调度;
       加权最小连接调度;
       基于局部性最少的连接;
       带复制的基于局部性最少连接;
       目标地址散列调度;
       源地址散列调度;

轮询算法(RR):

按依次循环的方式将请求调度到不同的服务器上,该算法最大的特定就是实现简单,
轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器;  

加权轮询算法(WRR):

主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,
如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求回事服务器A的两倍,
权值越高的服务器,处理的请求越多; 

最小连接调度算法(LC):

把请求调度到连接数最小的服务器上,而加权最小连接算法(WLC)则是给每个服务器一个权值,
调度器会尽可能保持服务器连接数量与权值之间的平衡;  

基于局部性的最少连接调度算法(lblc):

是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近目标IP地址所使用的服务器,
如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,
否则会继续选择其他可行的服务器;
带复制的基于局 部性最少连接算法记录的不是一个目标IP与一台服务器之间连接记录,
它会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负载过高; 

目标地址散列调度算法(DH):

是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,
发往该目标IP的请求会固定发给该服务器;

源地址散列调度算法(SH):

与目标地址散列调度算法类似,但它是根据源地址散列算法进行行静态分配固定的服务器资源;
1.7 部署LVS服务:

LVS现在已经集成在Linux内核模块中,但整个LVS环境中又分为内核层与用户层,
内核层复制核心算法的实现,用户层需要安装ipvsadm工具,通过命令将管理员需要 的工作模式与实现算法传递给内核来实现

LVS的内核模块名称为Ip_vs,我们可以使用YUM方式安装ipvsadm,也可以自行去官网下载使用源码安装;

1.7.1 YUM安装:

YUM安装需要确保本机可以连接YUM源,可以从YUM源中下载RPM格式软件包;

[root@lvs ~]# yum install -y ipvsadm
1.7.2 源码安装:

源码安装需要使用YUM安装相关的依赖软件包,Ipvsadm源码软件可以从官方网站下载,下载后使用标准的make,make install,编译,安装即可;

[root@lvs ~]#yum  -y  install  gcc popt   popt-devel  popt-static  libn1  libn1-devel
[root@lvs ~]#wget  http://www.linuxvirtualserver.org/softwart/kernel-2.6/ipvsadm-1.26.tar.gz
[root@lvs ~]#tar  -xvf  ipvsadm-1.26.tar.gz  -C   /usr/src
[root@lvs ~]#cd  /usr/src/ipvsadm-1.26
[root@lvs ~]#make
[root@lvs ~]#make  install

1.7.3 命令介绍

相关命令:

无论使用哪种方式安装ipvsadm软件,安装完成后都会生成一个同名的命令工具,我们需要使用该命令来管理配置LVS虚拟服务器组和相应的调度算法;

ipvsadm命令的描述和用法如下:
 描述:Linux虚拟服务器管理工具;
 用法:ipvsadm    选项    服务器地址    -s     算法
    ipvsadm    选项    服务器地址    -r     真实服务器地址【工作模式】【权重】……
 选项:
      -A    添加一个虚拟服务,使用IP地址,端口号,协议来唯一定义一个虚拟服务;
      -E    编辑一个虚拟服务;
      -D    删除一个虚拟服务
      -C    清空虚拟服务表
      -R    从标准输入中还原虚拟服务规则
      -S     保存虚拟服务规则至标准输出,输出的规则可以使用-R导入还原
      -a    在虚拟服务中添加一台真实服务器
      -e    在虚拟服务中编辑一台真实服务器
      -d     在虚拟服务中减少一台真实服务器
       -L    显示虚拟服务列表
       -t    使用TCP服务,该参数后需要跟主机与端口信息
      -u     使用UDP服务,该参数后需要跟主机与端口信息
      -s    指定LVS所采用的调度算法
       -r    设置真实服务器IP地址与端口信息
      -g    设置LVS工作模式为DR直连路由模式
      -i     设置LVS工作模式为TUN隧道模式
       -m     设置LVS工作模式为NAT地址转换模式
       -w     设置指定服务器的权重
      -c     连接状态,需要配合-L使用
      -n     数字格式输出

命令示例:

添加一个虚拟服务,设置调度算法为轮询,所有使用的TCP协议访问10.0.3.168的80端口的请求,最终被调度器通过NAT模式转发给了 192.168.10.3,192.168.10.4,192.168.10.5这三台主机的80端口

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.3:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.4:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.5:80 -m

查看LVS规则表:

[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.3.168:80 rr
  -> 192.168.10.3:80              Masq    1      0          0         
  -> 192.168.10.4:80              Masq    1      0          0         
  -> 192.168.10.5:80              Masq    1      0          0         
[root@lvs ~]# 

查看当前IPVS调度状态:

[root@lvs ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
[root@lvs ~]# 

删除为虚拟服务提供WEB功能的真实服务器192.168.10.3

[root@lvs ~]# ipvsadm -d -t 10.0.3.168:80 -r 192.168.10.3

虚拟服务规则表备份与还原:

[root@lvs ~]# ipvsadm -Sn >/tmp/ip_vs.bak   #备份至文件
[root@lvs ~]# ipvsadm -C					#清空规则列表
[root@lvs ~]# ipvsadm -R < /tmp/ip_vs.bak  #从文件还原

修改虚拟服务的调度算法为加权轮询:

[root@lvs ~]# ipvsadm -E -t 10.0.3.168:80 -s wrr

创建一个使用WRR算法的虚拟服务,工作模式为直接路由(DR)模式,在该虚拟服务上添加两台真实服务器,并为每台真实服务器设置权重:

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s wrr
[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -r 192.168.10.3:80 -g -w 1
[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -r 192.168.10.4:80 -g -w 2

下面将介绍LVS负载均衡应用案例:

基于NAT工作模式的负载均衡:
其工作模式的负载均衡架构图可参考上图:,服务器IP地址设置见表:所有访问lvs.example.com的这台主机的VIP地址的80端口的请求数据包都将被均衡的调度到三台真实的服务器上。
表:(由于本地做实验,外网就采用10.0.3.168,内网采用192.168.10.254)

服务器名称 网络接口 IP地址
lvs.example.com enp0s3 (内网)、enp0s8(外网) 10.0.3.168(外)、192.168.10.254(内)
web1.example.com enp0s3 192.168.10.3
web2.example.com enp0s3 192.168.10.4
web3.example.com enp0s3 192.168.10.5

LVS负载均衡调度器设置
首先,需要为整个拓扑环境设置网络参数,案例中使用静态IP地址的方式配置网络,由于lvs调度器使用了两块网卡,这里需要对两块网卡进行配置:

[root@lvs ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s8
ONBOOT=yes
IPADDR=10.0.3.168
NETMASK=255.255.255.0
GATEWAY=10.0.3.1
DNS1=202.106.0.20

第二块

[root@lvs ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=951bd2b2-f6b4-4a8b-9644-a57831d648fc
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.254
NETMASK=255.255.255.0
DNS1=202.106.0.20
[root@lvs ~]# systemctl restart network 
[root@lvs ~]# yum install -y ipvsadm

使用ipvsadm命令工具参加一个虚拟服务,并为该虚拟服务设置一组具体的后端服务器主机和虚拟服务调度算法:

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.3:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.4:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.5:80 -m
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
[root@lvs ~]# sysctl -p
[root@lvs ~]# firewall-cmd --permanent --add-port=80/tcp
[root@lvs ~]# firewall-cmd --reload
[root@lvs ~]# systemctl start ipvsadm


下面开始修改后端真实的web服务器,(这里为了验证调度,我把每个web的内容设置了不同,生产环境下,每个web的内容都应该提供相同的页面)

[root@web1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.3
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web1 ~]# yum install -y httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl restart network
[root@web1 ~]# echo "192.168.10.3" > /var/www/html/index.html
[root@web1 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web1 ~]# firewall-cmd --reload



下面web2和web3服务器的配置具体步骤和web1是一样的。IP地址根据自己的需要修改

[root@web2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.4
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web2 ~]# yum install -y httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl restart network
[root@web2 ~]# echo "192.168.10.4" > /var/www/html/index.html
[root@web2 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web2 ~]# firewall-cmd --reload

Web3的操作:

[root@web3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.5
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web3 ~]# yum install -y httpd
[root@web3 ~]# systemctl start httpd
[root@web3 ~]# systemctl restart network
[root@web3 ~]# echo "192.168.10.5" > /var/www/html/index.html
[root@web3 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web3 ~]# firewall-cmd --reload

验证:
客户端使用浏览器访问http://10.0.3.168 ,最终可以访问到真实的服务器锁提供的页面内容,由于LVS采用RR(轮询)算法,所以不同的连接请求江北平均分配到不同的后端真实服务器上。由于本次是做实验,所以不同的浏览器访问的页面结果会不同

集群及高可用之LVS负载均衡(三种工作模式介绍)_第5张图片
集群及高可用之LVS负载均衡(三种工作模式介绍)_第6张图片
下面将更新基于DR工作模式的负载均衡。

你可能感兴趣的:(负载均衡,云计算,运维,Linux)