keepalived原理、keepalived+LVS_DRkeepalived+Nginx的实现

一.keepalived和其工作原理:

keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。

keepalived的工作原理:

keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。

VRRP协议:Virtual Route Redundancy Protocol虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。在介绍VRRP之前先介绍一些关于VRRP的相关术语:

虚拟路由器:由一个 Master 路由器和多个 Backup 路由器组成。主机将虚拟路由器当作默认网关。

VRID:虚拟路由器的标识。有相同 VRID 的一组路由器构成一个虚拟路由器。

Master 路由器:虚拟路由器中承担报文转发任务的路由器。

Backup 路由器: Master 路由器出现故障时,能够代替 Master 路由器工作的路由器。

虚拟 IP 地址:虚拟路由器的 IP 地址。一个虚拟路由器可以拥有一个或多个IP 地址。

IP 地址拥有者:接口 IP 地址与虚拟 IP 地址相同的路由器被称为 IP 地址拥有者。

虚拟 MAC 地址:一个虚拟路由器拥有一个虚拟 MAC 地址。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。

优先级: VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。

非抢占方式:如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障, Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。

抢占方式:如果 Backup 路由器工作在抢占方式下,当它收到 VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的 Master 路由器的优先级高,就会主动抢占成为 Master 路由器;否则,将保持 Backup 状态。

虚拟路由示例示意图:

wKiom1Yvcm6TLWz8AAEOfFyE9Rs687.jpg

VRRP将局域网内的一组路由器划分在一起,形成一个VRRP备份组,它在功能上相当于一台路由器的功能,使用虚拟路由器号进行标识。虚拟路由器有自己的虚拟IP地址和虚拟MAC地址,它的外在变现形式和实际的物理路由完全一样。局域网内的主机将虚拟路由器的IP地址设置为默认网关,通过虚拟路由器与外部网络进行通信。

虚拟路由器是工作在实际的物理路由器之上的。它由多个实际的路由器组成,包括一个Master路由器和多个Backup路由器。 Master路由器正常工作时,局域网内的主机通过Master与外界通信。当Master路由器出现故障时, Backup路由器中的一台设备将成为新的Master路由器,接替转发报文的工作。

VRRP的工作工程:

(1) 虚拟路由器中的路由器根据优先级选举出 Master Master 路由器通过发送免

ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从

而承担报文转发任务;

(2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工

作状况;

(3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级

重新选举新的 Master

(4) 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新

Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP

地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的

ARP 相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台

设备。

(5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方

式(抢占方式和非抢占方式)决定是否重新选举 Master

VRRP优先级的取值范围为0到255(数值越大表明优先级越高)

keepalived的工作原理就是基于VRRP实现的,keepalived的体系结构图如下

wKioL1YvcrPCGlZqAAJmPFXrK7Q619.jpg


在这个机构图中,处于内核的IPVSNETLINK,其中NETLINK是提供高级路由及其他相关的网络功能,如果在负载均衡器上启用iptables/netfilter,将会直接影响它的性能。对于图中不同模块功能的介绍如下:

VRRP Stack负责负载均衡器之间的失败切换FailOver

Checkers负责检查调度器后端的Real server 或者 Upstream Server的健康状况;

WatchDog 负责监控checkersVRRP进程的状况;

IPVS wrapper 用来发送设定的规则到内核IPVS

Netlink Reflector 用来设定VRRPvip地址。

keepalived运行时,会启动3个进程,分别为:core(核心进程)checkvrrp

core:负责主进程的启动,维护和全局配置文件的加载;

check:负责健康检查

vrrp:用来实现vrrp协议

keepalived配置文件的介绍:

yum安装好keepalived之后,keepalived会产生一个配置文件/etc/keepalived/keepalived.conf ,配置文件包含了三个段:全局定义段,VRRP实例定义段和虚拟服务器定义段。

global_defs {
   notification_email { #指定keepalived在发生切换时需要发送email到的对象。
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc#指定发件人
   smtp_server 192.168.200.1 #指定smtp服务器地址
   smtp_connect_timeout30  #指定smtp连接超时时间
   router_id LVS_DEVEL  #运行keepalived的一个标识
}
vrrp_sync_group VG_1{ #监控多个网段的实例              
    group{              
        inside_network#实例名              
        outside_network              }
        notify_master /path/xx.sh #指定当切换到master时,执行的脚本       
        netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本       
        notify_fault "path/xx.shVG_1" #故障时执行的脚本       
        notify /path/xx.sh  #脚本所在目录       
        smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知}
vrrp_instance VI_1 {
    state MASTER #指定哪个为master,哪个为backup
    interface eth0  #设置实例绑定的网卡
    virtual_router_id 51 #VPID标记
    priority 100 #优先级,高优先级的会抢占为master (默认为抢占模式)
    advert_int 1 #检查间隔,1秒
    authentication { #设置认证
        auth_type PASS #认证方式
        auth_pass 1111  #认证字符串(使用 openssl rand -hex 6生成随机字符串)
    }
    virtual_ipaddress {  #设置VIP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING>scope <SCOPE> label <LABEL>
        192.168.200.17/24 deveth1
        192.168.200.18/24 deveth2 label eth2:1
    }
    notify_master<STRING>|<QUOTED-STRING>
    notify_backup<STRING>|<QUOTED-STRING>
    notify_fault<STRING>|<QUOTED-STRING>
    notify<STRING>|<QUOTED-STRING>
    smtp_alert
}
 
virtual_server 192.168.200.100 443 {
    delay_loop 6  #健康检查时间间隔,单位秒
    lb_algo rr              #负载调度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR  #LVS的类型:有NAT|DR|TUN
    nat_mask255.255.255.0  #子网掩码
    persistence_timeout50   #会话保持时间,单位秒(可以适当延长时间以保持session)
    protocol TCP  #转发协议类型,有TCP和UDP两种
sorry_server 127.0.0.1 80 #web服务器全部失败,可以指定Sorry web
    real_server 192.168.201.100443 {   #定义RS 服务
    weight 1#权重
inhibit_on_failure #当服务器健康检查失效时,将weight设置为0不是直接从ipvs中删除
notify_up <STRING>|<QUOTED-STRING>#Server启动时执行的脚本
notify_down <STRING>|<QUOTED-STRING>#Server down时执行的脚本
 
#后端RS服务器的检查 (HTTP_GET 和SSL_GET):
    SSL_GET { 
       url {  #检查url,可以指定多个,status_codeand digest
         path /
          digest ff20ad   #或者status_code 200 ....
         }
        connect_timeout 3 #连接超时时间
        nb_get_retry 3  #重连次数
        delay_before_retry 3 #重连间隔时间
    }
#也可以通过TCP_CHECK判断RealServer的健康状况:
    }
}

二.keepalived+LVS_DR模型负载均衡实现集群高可用:

1.    单主模型(master/backup

实验环境:

wKioL1YvgWuh5T2_AAF1iwiNXIQ626.jpg

环境搭建:

1.分别在两台Director上安装keepalived和相关的配置:

安装前注意事项:

本机的主机名,要与hostname(uname -n)获得的名称保持一致;各节点要能相互解析主机名,一般建议通过hosts文件进行解析;各节点要进行时间同步(使用ntp时间服务器同步),确保iptablesselinux不会成为服务阻塞。

(1)Master上配置时间服务器并进行同步:

yum 安装ntp服务器:yum install ntp -y

配置成本地时间服务器:编辑配置文件~]# vim/etc/ntp.conf添加如下内容:

        restrict 172.16.0.0 netmask 255.255.0.0 nomodify notrap        
        server 127.127.1.0
        fudge 127.127.1.0 stratum 8
        #server 0.centos.pool.ntp.org iburst
        #server 1.centos.pool.ntp.org iburst
        #server 2.centos.pool.ntp.org iburst
        #server 3.centos.pool.ntp.org iburst


启动服务即可。其他节点可以通过命令ntpdate netserverIP来进行时间同步如:ntpdate172.16.99.3

(2)安装keepalived和相关配置:

a.分别在172.16.99.3172.16.99.5上安装keepalived;此处可以yum安装或者源码安装。此处使用yum安装:yum install keepalived -y

b.配置:在172.16.99.3上的配置信息。

        global_defs {        
           notification_email {
             admin@zkchang.com
           }
           notification_email_fromkanotify@zkchang.com
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_down {   #为测试使用
            script "[[ -f/etc/keepalived/down ]] && exit 1 || exit 0"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
            sorry_server 172.16.99.380
            track_script {
                chk_down
            }
        }
        virtual_server 172.16.99.200 80 {
            delay_loop 6
            lb_algo rr
            lb_kind DR
            persistence_timeout 50
            protocol TCP
            real_server 172.16.99.1180 {
                weight 1
                HTTP_GET {
                    url {
                      path /
                      status_code 200
                    }
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry3
                }
            }
            real_server 172.16.99.1280 {
               weight 1
               HTTP_GET {
                   url {
                       path /
                       status_code 200
                   }
                   connect_timeout 3
                   nb_get_retry 3
                   dalay_before_retry3
               }
            }
        }

在备用节点Backup172.16.99.5上的配置,只需要修改state BACKUPvirtual_router_id 77priority 99即可,其他的配置和Master上的配置完全相同。

2.分别在两台RS上进行相关的配置:

通过编写脚本进行相应的配置:

在其中一台的RS172.16.99.11上的配置

        #!/bin/bash        
        echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
        echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0172.16.99.200 netmask 255.255.255.255 broadcast 172.16.99.200 up
        route add -host172.16.99.200 dev lo:0

另一台RS脚本信息和172.16.99.11上的相同;

两台RS开启web服务器。为了演示实验效果,让网页内容不同:

RS1网页内容为:

<h1>The web is 99.11 </h1>

RS2网页内容为:

<h1>The web is 99.12</h1>

关闭两台的iptables防火墙,关闭selinux.

3.启动keepalived进行测试


wKiom1Yvg1rxGmsPAAFb1uY3WRs921.jpg

查看一下ipvsadm 规则是否已经自动生成:

wKioL1Yvg42RTeu7AAE6Hz-MxOg379.jpg

在目录/etc/keepalived/下创建一个文件down,进行测试,当创建文件后,MASTER主机weight将会减2,最终导致VIPBACKUP抢占,keepalived默认工作在抢占模式。

1.172.16.99.3/etc/keepalived/目录下创建down文件,查看VIP地址是否还存在:

日志文件

wKioL1YvhFCyUvO2AANhYtJtKXY595.jpg

wKiom1YvhB3gHO6WAAJF6RPrKmI038.jpg

2.172.16.99.5上查看VIP是否存在

日志文件:  


wKiom1YvhJCwuz9QAANYdv1iCWY793.jpg

wKioL1YvhMSSLpDEAAJ1dnn0F1g830.jpg

2.双主模型(MASTER/MASTER

实验结构:

wKiom1YvhPSAIHLWAAJm2nvTnuY076.jpg

双主模型的实现主要是让主Director和备用Director都能接受客户端的访问,设置两个VIP,通过DNS服务器轮询解析这两个VIP来完成。

双主模型的实现只需在单主模型的配置下,在配置文件中再加一个vrrp_instanceVI_2。只需做一下相应的修改,如下:

1.其中一台Director172.16.99.3

vrrp_instance VI_1state MASTER时:

vrrp_instance VI_2 {

   stateBACKUP

   interface eth0

   virtual_router_id 177

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass d7a9dfb86ec4

   }

   virtual_ipaddress {

       172.16.99.100/32 dev eth0 label eth0:1

   }

   track_script {

        chk_down

   }

其他的virtual_server 区域的配置和vrrp_instance VI_1的相同

2.在另一台Director172.16.99.5)上的配置:只需将上述的配置文件复制过去,然后修改以下几项:

vrrp_instance VI_2中,state MASTERpriority 100

重新启动keepalived

99.3的日志文件和IP

wKioL1YvhYCjnnAQAAOOyADMoUs389.jpg

wKioL1YvhbuiWJLyAAKiJtpCIk4474.jpg

99.5的日志文件和IP

wKioL1YvhevjUh-4AAR9RuYzl30412.jpg

            wKiom1YvhgDAYC55AAL1PgnCTqs456.jpg

2.在两台RS进行相关配置:

通过脚本进行修改:

        #!/bin/bash        
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0 172.16.99.200 netmask 255.255.255.255  broadcast 172.16.99.200 up
        route add -host 172.16.99.200 dev lo:0
        ifconfig lo:1 172.16.99.100 netmask 255.255.255.255  broadcast 172.16.99.100 up
        route add -host 172.16.99.100 dev lo:1

wKioL1YvhprSf-l6AAH2TGUPdKg695.jpg

两台RS配置相同:

4.测试:

wKioL1YvhunCxW6mAAHF6QMqkHE472.jpg

在一台Director/etc/keepalived/目录下创建文件down,会发现两个VIP会集中到另一台上:

wKiom1Yvhu3BvxJ6AAPPDhvtF1o158.jpg


三.keepalived+Nginx负载均衡实现集群高可用:

实现双主模型:(MASTER/MASTER

实验结构图:

wKioL1Yvh2aSZi0RAAIciNGeF3A976.jpg

实验步骤:

1.在两台Nginx负载均衡器上进行配置keepalived和实现Nginx的负载均衡:

a.实现Nginx的负载均衡

编辑nginx的配置文件/etc/nginx/nginx.conf添加如下内容:

http{}内添加:

    upstream Rserver {

        server 172.16.99.11:80 weight=1;

        server 172.16.99.12:80 weight=1;

        server 172.16.99.10:80 backup; 

        #当两台Upstream server宕机了,就会               

      # 显示此web服务器的界面消息

    }

再编辑/etc/nginx/conf.d/default.com文件,在server{}内添加:

    location / {

        proxy_pass http://Rserver/;

        root   /web/nginx/;

        index index.html index.htm;

    }

两台Nginx的负载均衡器配置相同。

进行测试,判断nginx是否实现了负载均衡

b.编辑keepalived的配置文件(双主模型)来实现Nginx负载均衡器的高可用:

配置内容如下:(先在172.16.99.3上配置)

        global_defs {        
           notification_email {
             admin@zkchang.com
           }
           notification_email_fromkanotify@zkchang.com
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_nginx {  #检查Nginx的运行状态
            script "killall -0nginx &> /dev/null"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
           track_script {
                chk_nginx  
           }
        }
        vrrp_instance VI_2 {
          state BACKUP
          interface eth0
          virtual_router_id 100
          priority 99
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass d7a9dfb86ec4
          }
          virtual_ipaddress {
              172.16.99.100/32 deveth0 label eth0:1
          }
          track_script {
                chk_down
                chk_nginx
          }
        }

172.16.99.5上的配置,只需将此配置文件复制过去,然后修改以下几项:

vrrp_instance VI_1中:

state BACKUP

 priority 99

vrrp_instance VI_2中:

state MASTER

 priority 100

2.启动keepalived进行测试:

wKiom1YviBHiHkRSAAMe86HmI-c194.jpg

wKioL1YviEXiNkpvAAMf7jVpOG8118.jpg

进行访问:

wKiom1YviGjDBJ5NAAJZrvYNJaU483.jpg

172.16.99.5Nginx服务关闭:VIP172.16.99.100)将转移到另一台的eth0:1上如下图:访问服务器能正常显示网页内容。

wKiom1YviMaCW76LAALouCHNYA4647.jpg

wKioL1YviPnhP2ovAAMXtRD1_OQ978.jpg

如果后端Upstream server 服务器都宕机了,客户端在此访问时,将会显示server172.16.99.10:80 backup; web服务器的界面消息。如:

wKiom1YviPWhnV7gAAHbwYE62B8646.jpg