#####LVS负载均衡#####

###LVS(Linux虚拟机服务器)###

  • .LVS是什么?LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。

  • .LVS能干什么?LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

  • 【1】技术简介
    LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

  • 【2】集群采用三层结构
    一般来说,LVS集群采用三层结构,其主要组成部分为:
    A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
    B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
    C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

  • 【3】调度器
    调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
    在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。
    对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。

  • 【4】分布式锁管理器
    此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。
    负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。

  • 【5】监视器
    Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。
    特点:
    可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

  • LVS基本工作原理
    在这里插入图片描述1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间

  1. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链

  2. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链

    扫描二维码关注公众号,回复: 6610481 查看本文章
  3. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

###LVS DR模式和与原理###
.DR(Direct Routing)模式的网络结构:
1.重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
在这里插入图片描述
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
配置实验环境:

三台机器:
Director节点: (eth0: 172.25.46.1 vip eth0 172.25.46.100)
Real server2: (eth0: 172.25.46.2 vip lo 172.25.46.100)
Real server3: (eth0: 172.25.46.3 vip lo 172.25.46.100)

  • Real serve3和 Real server2都安装上 yum install -y httpd并编写前端页面(为了实验效果的显现,设置不同内容)
server2主机:
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
server2
[root@server2 html]# systemctl start httpd

server3主机:
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html
server3
[root@server3 html]# systemctl start httpd

  • Director节点server1 安装 yum install -y ipvsadm(调度器)
  • 添加策略
    -A添加一条新的虚拟服务
    -a 添加真实服务器的操作
    -t TCP协议的虚拟服务
    -s :调度算法(rr|wrr|lc|)
    -r :对应真实ip
    -g rh(路由)
    rr 调度算法:轮询
[root@server1 ~]# ipvsadm -l   
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server1 ~]# ipvsadm -A -t 172.25.46.100:80 -s rr  ##-A添加一条新的虚拟服务  -t TCP协议的虚拟服务  -s 对后端主机的调度算法:轮巡
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.2:80 -g  ##给server2加vip
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.3:80 -g  ##给server3加vip
[root@server1 ~]# ipvsadm -l  ##显示调度次数
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.46.100:http rr
  -> 172.25.46.2:http             Route   1      0          0         
  -> 172.25.46.3:http             Route   1      0          0         

添加vip
给所有服务器把VIP地址配在各自的网络设备上

server1主机:

 [root@serve[root@server1 ~]# ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:d9:67:4d brd ff:ff:ff:ff:ff:ff
    inet 172.25.46.1/24 brd 172.25.46.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fed9:674d/64 scope link 
       valid_lft forever preferred_lft forever
[root@server1 ~]# ip addr add 172.25.46.100/24 dev eth0
[root@server1 ~]# ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:d9:67:4d brd ff:ff:ff:ff:ff:ff
    inet 172.25.46.1/24 brd 172.25.46.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.25.46.100/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fed9:674d/64 scope link 
       valid_lft forever preferred_lft forever
server2主机:
[root@server2 html]# ip addr add 172.25.46.100/24 dev eth0

server3主机:
[root@server3 html]# ip addr add 172.25.46.100/24 dev eth0

测试:
server2、server3都可能被访问到 (此时设置的轮询策略还没开始实施,当调度器发送请求时两个主机都会抢请求)
在这里插入图片描述

[root@foundation46 ~]# arp -an | grep 172.25.46.100  ##查看绑定的MAC地址
? (172.25.46.100) at 52:54:00:41:f0:9f [ether] on br0
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# arp -d 172.25.46.100  ##删除MAC绑定的地址
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# arp -an | grep 172.25.46.100
? (172.25.46.100) at 52:54:00:41:f0:9f [ether] on br0
[root@foundation46 ~]# arp -d 172.25.46.100
[root@foundation46 ~]# curl 172.25.46.100
server2

server1主机:  
[root@server1 ~]# ipvsadm -l  ##显示调度
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http rr
  -> 172.25.46.2:http             Route   1      0          0     ##请求并未经过调度器,而是server3自己抢占成功
  -> 172.25.46.3:http             Route   1      0          0         

为了避免以上情况的发生(抢占),就要绑定调度器的MAC地址编写调度策略轮询
给server2、server3安装 arptables.x86_64
为arptables网络的用户控制过滤的守护进程

server2主机
[root@server2 html]# yum install -y arptables.x86_64
[root@server2 html]# arptables -A INPUT -d 172.25.46.100 -j DROP  
[root@server2 html]# arptables -A OUTPUT -s 172.25.46.100 -j mangle --mangle-ip-s 172.25.46.2
[root@server2 html]# arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server2 

Chain OUTPUT (policy ACCEPT)
-j mangle -s server2 --mangle-ip-s server2 

Chain FORWARD (policy ACCEPT)

server3主机:
[root@server3 html]# yum install -y arptables.x86_64
[root@server3 html]# arptables -A INPUT -d 172.25.46.100 -j DROP
[root@server3 html]#  arptables -A OUTPUT -s 172.25.46.100 -j mangle --mangle-ip-s 172.25.46.3
[root@server3 html]#  arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server3 

Chain OUTPUT (policy ACCEPT)
-j mangle -s server3 --mangle-ip-s 172.25.46.2 
-j mangle -s server3 --mangle-ip-s server3 

Chain FORWARD (policy ACCEPT)

测试:
在这里插入图片描述
在这里插入图片描述
调度算法:加权轮询
调度器server1 编辑,server2、server3不变

[root@server1 ~]# ipvsadm -C  #删除所有策略
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server1 ~]# ipvsadm -A -t 172.25.46.100:80 -s wrr  ##加权调度策略
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.2:80 -g -w 3  ##设置3次
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.3:80 -g -w 1  ##一次
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http wrr
  -> 172.25.46.2:http             Route   3      0          0         
  -> 172.25.46.3:http             Route   1      0          0  
       [root@server1 ~]# ipvsadm -S
-A -t server1:http -s wrr
-a -t server1:http -r 172.25.46.2:http -g -w 3
-a -t server1:http -r 172.25.46.3:http -g -w 1

测试:
在这里插入图片描述
在这里插入图片描述
###DR模式下的LVS健康检查(ldirectord)###
为什么需要健康检查?
如果后端真实服务器出现问题,那么在测试端测试的时候会返回一个错误页面;对后端服务器作健康检查可以保证只返回正确的页面
server3httpd关闭出现错误页面:(不做健康检查时)
在这里插入图片描述
安装ldirectord
先配置HighAvailability的yum源
在这里插入图片描述
在这里插入图片描述
安装 ldirectord-3.9.5-3.1.x86_64.rpm

[root@server1 ~]# ls
ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 
[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm   #安装成功自动生成以下配置文件
warning: ldirectord-3.9.5-3.1.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 7b709911: NOKEY
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.5
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz

编辑配置文件

[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http wrr
  -> 172.25.46.2:http             Route   3      0          0         
  -> 172.25.46.3:http             Route   1      0          0         
[root@server1 ha.d]# ipvsadm -C
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# vim ldirectord.cf 
#Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
#logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="[email protected]"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no

 #Sample for an http virtual service
virtual=172.25.46.100:80
        real=172.25.46.2:80 gate
        real=172.25.46.3:80 gate
        fallback=127.0.0.1:80 gate
        service=http
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        #receive="Test Page"
        #virtualhost=www.x.y.z

[root@server1 ha.d]# systemctl start ldirectord #开启服务
测试:
后端真实服务器都正常的时候:实行轮询
在这里插入图片描述
server3宕机
[root@server3 html]# systemctl stop httpd
只会调度server2
在这里插入图片描述
给server1安装httpd并设置前端访问页面,将所有的服务都宕掉server1会顶替
在这里插入图片描述
开启server3的服务,会自动跳转到server3
[root@server3 html]# systemctl start httpd

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44821839/article/details/92800827