企业部分实战---LVS+Keepalived实现高可用负载均衡

  • 一、Keepalived概述
  • 二、LVS概述
  • 三、LVS实现负载均衡
  • 四、LVS+keepalived实现负载均衡健康监测


一、Keepalived概述

keepalived是一个类似于layer3,4,5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。Layer4主要以TCP端口的状态来决定服务器工作正常与否。
如webserver的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

二、LVS概述

LVS集群采用IP负载均衡技术,属于IP层的交换(L4)具有很好的吞吐率。调度器分析客户端到服务器的IP报头信息,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。主要包含四大部分:
负载调度器(loadbalancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。当客户请求到达时,调度器只根据负载情况从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;
服务器池(serverpool),是一组真正执行客户请求的服务器,执行的任务有WEB、MAIL、FTP和DNS等。服务器池的结点数目是可变的,当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载;
后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务;
Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统中每个结点的状况。

LVS+keepalived架构图

gunicorn实现负载均衡_linux

三、LVS实现负载均衡

实验环境:

#若在虚拟环境中需执行此步骤创建两个新的虚拟机,VMWARE可忽略此步骤
     
   真实主机:
          cd /var/lib/libvirt/images/
          ls
          qemu-img create -f qcow2 -b rhel7.6.qcow2 server3
          qemu-img create -f qcow2 -b rhel7.6.qcow2 server4

实现步骤:

server1:
      pcs cluster disable --all
      pcs cluster stop --all
      systemctl status pcsd
      systemctl disable --now pcsd
      ssh server2 systemctl disable --now pcsd

gunicorn实现负载均衡_linux_02

在server3和server4设置相同的配置
server3: 
          hostnamectl set-hostname server3
          cd /etc/yum.repos.d/
          vim dvd.repo
          yum install httpd
          systemctl enable --now httpd
          systemctl start httpd
          cd /var/www/html/
          echo server3> index.html
          ip addr add 172.25.12.100/24 dev eth0
          yum install -y arptables
          arptables -A INPUT -d 172.25.12.100 -j DROP
          arptables -A OUTPUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.3
 
 server4:
  		  hostnamectl set-hostname server4
          cd /etc/yum.repos.d/
          vim dvd.repo
          yum install httpd
          systemctl enable --now httpd
          systemctl start httpd
          cd /var/www/html/
          echo server4> index.html
          ip addr add 172.25.12.100/24 dev eth0
          yum install -y arptables
          arptables -A INPUT -d 172.25.12.100 -j DROP
          arptables -A OUTPUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.4
          arptables-save > /etc/sysconfig/arptables #将策略保存到/etc/sysconfig/arptables文件中

gunicorn实现负载均衡_服务器_03

gunicorn实现负载均衡_linux_04

server2:
          curl server3
          curl server4
          yum install ipvsadm -y
          ip addr add 172.25.12.100/24 dev eth0
          ipvsadm -A -t 172.25.12.100:80 -s rr
          ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -g
          ipvsadm -a -t 172.25.1.100:80 -r 172.25.12.4:80 -g
          ipvsadm -ln

gunicorn实现负载均衡_IP_05


测试:

curl 172.25.12.100

负载均衡(轮询机制)实现

gunicorn实现负载均衡_gunicorn实现负载均衡_06

gunicorn实现负载均衡_gunicorn实现负载均衡_07

四、LVS+keepalived实现负载均衡健康监测

1.实验目的

上个实验中实现了负载均衡。本实验中我们将结合keepalived实现负载均衡高级群的健康监测,即在一真实主机的apache关闭后,主机可以监测到,并不再访问这台关闭apache的主机。

2.实验环境
五台虚拟机:westos1为主机,server1、server2为VS调度,server3、server4为RS真实主机。
3.实验步骤
1)环境搭建

server1、server2:
ipvsadm -C            清除IPVS中的IP,因为IPVS的配置会与keepalived冲突
ipvsadm -ln
ip addr del 172.25.12.100/24 dev eth0
yum install keepalived -y
vi /etc/keepalived/keepalived.conf   编写此文件相当于用配置文件的方式实现负载均衡
server1和server2配置文件基本相同
server1 keepalived.conf:

! Configuration File for keepalived

global_defs {
  notification_email {
    root@localhost
  }
  notification_email_from keepalived@localhost
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  #vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp_instance VI_1 {
   state MASTER
   interface eth0
   virtual_router_id 121  #注意:此处的id最好不要重复
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.12.100
   }
}

virtual_server 172.25.1.100 80 {
   delay_loop 6
   lb_algo rr
   lb_kind DR
   #persistence_timeout 50
   protocol TCP

   real_server 172.25.12.3 80 {
       weight 1
       TCP_CHECK {
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
       }
   }

   real_server 172.25.12.4 80 {
       weight 1
       TCP_CHECK {
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
       }
   }
}

重启服务进行测试:

systemctl restart keepalived.service 
    
   tail -f /var/log/messages 
    
   ipvsadm -ln      执行此命令后发现ip已配置完毕

gunicorn实现负载均衡_负载均衡_08


2) 健康检测

RS真实主机健康检测,关闭server3的httpd服务 systemctl stop httpd

在真机中进行测试:

curl 172.25.12.100

发现主机已知晓3的服务关闭,并且主机策略已不存在server3,并发送邮件给了server1、server2

gunicorn实现负载均衡_负载均衡_09

gunicorn实现负载均衡_IP_10

再开启server3中的httpd,并在主机中检测,发现已恢复正常

gunicorn实现负载均衡_负载均衡_11

gunicorn实现负载均衡_IP_12


3)DS健康检测

关闭server1中的keepalived服务
     
    [root@server1 ~]# systemctl stop keepalived.service 

    此时在server2中:
     
    tail -f /var/log/messages
     
    发现server2已接管server1

在主机中探测RS发现不收任何影响,即keepalived解决了DS的单点故障

gunicorn实现负载均衡_linux_13