keepalived实现前端负载均衡器的高可用

概述:

    在之前的内容中,我们了解了当一个网站并发量大时,可以利用前端负载均衡器将用户请求调度到后端的多个real server上,实现分散服务压力,横向扩展的方式,形成LB集群,但是试想一下,作为前端负载均衡器:

    如果是LVS,万一作为前端调度器的Director故障,则会导致所有服务器不可用,还有LVS无法对后端的各个Real Server做健康状况检测,无论后端Real Server是否故障,作为LVS调度器而言,都会将请求调度到根据算法指定的Real Server上,也就是如果某个Real Server故障,那么调度到该Real Server上的请求将会无法正常响应。

    如果是Nginx作为前端调度器,虽然Nginx可以对后端的Upstream Server做健康状况探测,当某个节点故障时,不会将请求调度到该节点上;但是,万一Nginx调度器的节点本身发生故障,也会造成所有的服务不可用,也就是Nginx自身就是单点故障所在。

    针对以上的情况,我们有必要对服务器进行高可用,当某个节点故障时,不会让整个服务不可用,本篇就介绍一下利用keepalived实现对前端调度器的高可用的实现方案,具体分为以下几个部分:

    1、keepalived的相关概念简介

    2、keepalived实现vrrp(实现虚拟IP资源的转移)

    3、keepalived实现对LVS负载均衡调度器的高可用(主/备模型)

    4、keepalived实现对Nginx服务的高可用(主/备模型)

    5、keepalived实现双主模型的高可用实现方案(主/主模型)

      

第一章    keepalived的相关概念简介

    1、VRRP协议,virtual redundant route protocol,虚拟冗余路由协议

        能够把多个物理路由器虚拟为一个虚拟路由器对外提供服务,vrrp协议能够自动的识别当前哪个是活动节点,当活动节点故障后,能够自动的将另一个作为活动节点对外提供服务

        vrrp对外提供服务是,是利用虚拟出来一个地址,包括mac也是虚拟出来的,对外提供服务

    2、VRRP协议的相关术语解释

        虚拟路由器:由一个主路由器和多个备份路由器组成,将其虚拟为一个路由器向外提供服务(注意,可能虚拟出来的不止一个虚拟路由器)

        VRID:虚拟路由器标识,当虚拟出来多个虚拟路由器时,用来唯一标识某个虚拟路由器的ID号,0-255之间的有效数字

        Master路由器:物理路由器中的主路由器,ACTIVE,用来承担报文转发任务的路由器,一般一个虚拟路由器集群只有一个Master路由器

        Backup路由器:当Master路由器发生故障时,能够代替Master路由器工作的路由器

        虚拟IP地址(VIP):虚拟路由器向外提供服务的IP地址,一个虚拟路由器可以有一个或多个IP地址

        IP地址拥有者:物理路由器的接口的IP地址与虚拟IP地址相同的路由器,称为IP地址拥有者,也就是Master路由器

        虚拟MAC(VMAC):虚拟路由器的虚拟MAC地址,虚拟MAC地址的格式为00-00-5E-00-01-{VRID},因此,VRID范围就是0-255,VMAC前5段是固定的,后面是VRID

        优先级:VRRP是根据优先级来决定谁是Master路由器,谁是Backup路由器,优先级由数字表示,可用范围为0-254

    3、VRRP的工作模式:

        抢占方式:仅根据优先级来判断哪个路由器作为Master路由器。当原来的Master故障后,Backup路由器会作为新的Master路由器,但是当原来的Master恢复后,由于其优先级高,会又变回Master路由器,从新将资源抢占回来

        非抢占方式:当原来的Master故障后,Backup路由器会作为新的Master路由器,当原来的Master恢复后,不会抢占成为Master路由器,而是作为Backup路由器

        为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

            <1>Master路由器的选举

            <2>Master路由器的状态通告(传递心跳信息,优先级等)

            <3>为了提高安全性,还需要提供认证功能(防止外来的路由器随意加入到集群中),支持的认证方式有:

                无认证

                简单字符串认证,预共享秘钥

                md5认证

    4、keepalived简介

    keepalived最初的设计目标是为了实现lvs设备的高可用,keepalived能够根据配置文件中的定义生成ipvs规则,并能够对各个real server的健康状态进行检测(LVS实际上按照高可用的角度来讲,只有两个资源,一个是VIP,一个是内核上的ipvs规则)

    keepalived的功能主要是:

        <1> vrrp协议的软件实现,原生设计的目的是为了高可用ipvs服务

        <2> vrrp协议完成地址流动

        <3> 为vip地址所在的地址生成ipvs规则(在keepalived配置文件中预先定义)

        <4> 为ipvs集群的各RS做健康状态检测

        <5> 基于脚本调用接口,通过执行脚本完成脚本中定义的功能(如对其他服务的高可用),进而影响集群事物

    5、keepalived的软件结构

    Software Design.gif

     

        一般启动keepalived之后,会启动一个主进程(读取和分析配置文件,并根据配置文件,指挥两个子进程完成相关工作),两个子进程,其中一个子进程用来实现VRRP协议,另一个是checkers进程,用来监控lvs后端的各个real server的健康状况,还有一些外围其他服务的监控脚本的实现

        主进程还能利用内核提供的watchdog模块,实现对两个子进程的健康性检查,当发现某个子进程故障后,主进程会kill掉这个子进程,然后再从新启一个子进程

        watchdog能够让两个子进程每隔一段时间,向主进程的socket套接字上发送信息,当某一时刻,主进程无法收到子进程的信息,就判断子进程故障,然后就杀掉,重启子进程

        两个节点之间哪个为主,哪个为备用节点,是由优先级来决定的,当初始时,优先级高的为主节点,当其中某一个节点故障,无法启动,则另一个节点会替换上来,作为主的,向外提供服务。另一种情况,当节点本身正常,但是节点上的某服务,也就是某资源不正常时,这时keepalived的子进程checkers就会将当前节点的优先级降级,从而实现了另一个备用节点的优先级要高于该节点,当下次节点间相互通告信息时,备用节点就会发现自己的优先级比当前活动节点的优先级要高,然后就提升为主节点,启动资源,对外提供服务

        优先级的数字是0-255,值越大,优先级越高,0和255被系统自身占用,不能作为可用的优先级的数字进行调整

   

第二章    keepalived实现vrrp(实现虚拟IP资源的转移)

    1、实验环境

    blob.png

    2、实验前准备工作

        <1> 各个节点的时间同步

        在某个节点(本例中为10.1.32.68主机)上安装ntp服务,作为时间服务器,修改其配置文件中server相关的参数,将server修改为127.127.1.0,从本机同步时间,启动ntpd服务

        blob.png

        其他keepalived向该服务器同步时间

        blob.png

        验证各个keepalived节点的时间是否一致

        blob.png

        <2> 节点之间可基于ssh秘钥进行认证

        blob.png        

        blob.png        

        <3> 各节点解析的主机名与实际主机名保持一致

        在各个节点上的/etc/hosts文件中编辑主机名与IP的对应关系,实现解析结果与实际主机名的一致性

        blob.png

        blob.png

        <4> 确保iptables和selinux不会阻碍实验的正常进行
        blob.png

    3、配置实验环境

    blob.png    

    blob.png

    4、安装keepalived

    blob.png

    blob.png

    

    5、配置node72的keepalived服务

    [root@node72 ~]#     ########   备份配置文件   ########
    [root@node72 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@node72 ~]#     ########   编辑修改配置文件  ########
    [root@node72 ~]# vim /etc/keepalived/keepalived.conf    
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         root@localhost             ########  定义节点状态发生变化时发送通知的目标邮箱地址    ########
       } 
       notification_email_from keepalived_test@nwc.com   ########  定义发件人的信息    ########
       smtp_server 127.0.0.1     ########  定义邮箱服务器地址   ########
       smtp_connect_timeout 30   ########  定义邮箱服务器的链接超时时间    ########
       router_id node72       ########   定义本机的路由器ID,自定义即可   ########
       vrrp_mcast_group4 224.0.32.18    ########   定义心跳信息通告的组播地址,同一个集群的组播地址一样   ########
    }  
    
    vrrp_instance VI_1 {  ########   定义一个虚拟路由器的实例,实例名称为VI_1  ########
        state MASTER      ########   定义本节点在该虚拟路由器实例中的初始角色,MASTER还是BACKUP   ########
        interface eno16777736   ########   虚拟路由器的工作的接口   ########
        virtual_router_id 32    ########   虚拟路由器ID(也就是VRID),用以区别不同的虚拟路由器实例   ########
        priority 100         #####定义当前节点在该虚拟路由器实例中的优先级,MASTER要比BACKUP节点的优先级高#####
        advert_int 1    ########   定义通告信息发送的时间间隔   ########
        authentication {   ########  定义认证机制和认证的秘钥    ########
            auth_type PASS     ########  PASS为简单字符认证,建议使用PASS即可    ########
            auth_pass 12345678   ########   认证的秘钥,最大有效值为8位长度   ########
        }   
        virtual_ipaddress {   ########   定义该虚拟路由器的VIP   ########
            10.1.32.1/16 dev eno16777736 label eno16777736:0
            ########  VIP为10.1.32.1/16,定义在eno16777736接口的 eno16777736:0别名上   ########
        }   
    }
    
    track_interface {  ###定义要监控的接口,一旦接口出现故障,则节点会转为FAULT状态,触发重新选举,实现资源转移###
        eno16777736
    }

    blob.png

    6、配置node73的keepalived服务

    [root@node73 ~]#     ########   备份配置文件   ########
    [root@node73 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@node73 ~]#     ########   编辑修改配置文件  ########
    [root@node73 ~]# vim /etc/keepalived/keepalived.conf    
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         root@localhost             ########  定义节点状态发生变化时发送通知的目标邮箱地址    ########
       } 
       notification_email_from keepalived_test@nwc.com   ########  定义发件人的信息    ########
       smtp_server 127.0.0.1     ########  定义邮箱服务器地址   ########
       smtp_connect_timeout 30   ########  定义邮箱服务器的链接超时时间    ########
       router_id node73       ########   定义本机的路由器ID,自定义即可   ########
       vrrp_mcast_group4 224.0.32.18    ########   定义心跳信息通告的组播地址,同一个集群的组播地址一样   ########
    }  
    
    vrrp_instance VI_1 {  ########   定义一个虚拟路由器的实例,实例名称为VI_1  ########
        state BACKUP      ########   定义本节点在该虚拟路由器实例中的初始角色,MASTER还是BACKUP   ########
        interface eno16777736   ########   虚拟路由器的工作的接口   ########
        virtual_router_id 32    ########   虚拟路由器ID(也就是VRID),用以区别不同的虚拟路由器实例   ########
        priority 95         ########  定义当前节点在该虚拟路由器实例中的优先级    ########
        advert_int 1    ########   定义通告信息发送的时间间隔   ########
        authentication {   ########  定义认证机制和认证的秘钥    ########
            auth_type PASS     ########  PASS为简单字符认证,建议使用PASS即可    ########
            auth_pass 12345678   ########   认证的秘钥,最大有效值为8位长度   ########
        }   
        virtual_ipaddress {   ########   定义该虚拟路由器的VIP   ########
            10.1.32.1/16 dev eno16777736 label eno16777736:0
            ########  VIP为10.1.32.1/16,定义在eno16777736接口的 eno16777736:0别名上   ########
        }   
    }
    
    track_interface {  ###定义要监控的接口,一旦接口出现故障,则节点会转为FAULT状态,触发重新选举,实现资源转移###
        eno16777736
    }

    blob.png

    7、验证VRRP的高可用性

    blob.png

    blob.png

    blob.png

    blob.png

    8、利用自定义脚本,在keepalived中调用自定义的脚本实现节点状态转移时的通知机制

        实现当节点状态发生转移时,发送邮件给当前系统的root用户

    编写脚本:
    [root@node72 ~]# 
    [root@node72 ~]# vim /etc/keepalived/notify.sh
    
    #!/bin/bash
    # Author:nwc
    # Time:2016-11-01 12:56:17
    #
    
    contact='root@localhost'
    ##定义变量contact,其值为root@localhost,指明通告给谁,也就是邮件发送给谁
    vip="10.1.32.1"
    ##定义变量vip,其值为VIP的地址
    
    notify() {
        mailsubject="`hostname` to be $1: $vip floating"
        mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1"
        echo $mailbody | mail -s "$mailsubject" $contact
    }
    ##定义一个notify函数,用于发送邮件,定义了邮件的主题和邮件的正文部分,函数可以接受函数自身的位置参数
    
    case $1 in
    master)
        notify master
    ;;
    backup)
        notify backup
    ;;
    fault)
        notify fault
    ;;
    *)
        echo "Usage: `basename $0` master|backup|fault"
    ;;
    esac
    ##定义一个循环,当脚本的位置参数$1为对应值时,调用函数发送邮件

    blob.png

    blob.png

    blob.png

     

第三章    keepalived实现对LVS负载均衡调度器的高可用(主/备模型)

    1、实验环境

    blob.png

    2、准备实验环境、各节点时间同步,ssh秘钥登录,节点解析与主机名一致配置过程省略

    3、根据实验环境,配置LVS-DR模型各个Real Server对应的配置(本例中利用脚本实现)

    脚本为:
    #!/bin/bash

    case $1 in
    start)
            echo 1 > /proc/sys/net/ipv4/conf/all/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/lo/arp_announce
    
            ifconfig lo:0 10.1.32.1 netmask 255.255.255.255 broadcast 10.1.32.1
    
            route add -host 10.1.32.1 dev lo:0
    ;;
    stop)
            echo 1 > /proc/sys/net/ipv4/conf/all/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/lo/arp_announce
    
            ifconfig lo:0 down
    ;;
    *)
            echo "error"
            exit
    ;;
    esac

    blob.png

    blob.png

    

    4、在各个Real Server上提供httpd服务,提供测试页面,以供测试之用

    blob.png    

    blob.png

    5、在Director1上安装配置keepalived,实现对LVS调度器的高可用

    ! Configuration File for keepalived

    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived_test@nwc.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node72
       vrrp_mcast_group4 224.0.32.18
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 32
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345678
        }
        virtual_ipaddress {
            10.1.32.1/16 dev eno16777736 label eno16777736:0
        }
            track_interface {
        eno16777736 
        }   
    
       notify_master "/etc/keepalived/notify.sh master"
       notify_backup "/etc/keepalived/notify.sh backup"
       notify_fault "/etc/keepalived/notify.sh fault"
    }  


    virtual_server 10.1.32.1 80 {   ####将哪个ip的哪个端口定义为LVS的负载均衡集群服务####
        delay_loop 6    ###  定义服务轮询时间间隔,单位秒  ###
        lb_algo rr    ### 定义集群调度算法 ###
        lb_kind DR    ### 定义LVS的工作模型 NAT|DR|TUN ###
    #    nat_mask 255.255.255.0    ### 当工作模型是NAT时,NAT的掩码 ###
    #    persistence_timeout 50    ### 定义LVS的是否启用持久连接,不加此选项,代表不启用,如果启用,定义时长 ###
        protocol TCP   ### 定义集群的服务的协议类型,keepalived只支持TCP的 ###
        
    sorry_server 10.1.32.72 80
    ###定义当LVS后端的real sever全部不可用后的错误页面的服务器###
    
        real_server 10.1.32.68 80 {  ### 定义一个后端real server ###
           weight 1   ### 指明权重 ###
            HTTP_GET {  ### 指明检测健康状况的方法 ###
                url {   ## 表示请求某个URL进行检查,要求响应状态码为200 ###
                  path /
                  status_code 200
                } 
                connect_timeout 3   ###检测时,对方无响应的超时时间###
                nb_get_retry 3   ### 检测重试次数 ###
                delay_before_retry 3   ### 每次检测的间隔时间 ###
            }   
        }   
        real_server 10.1.32.168 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
    }

   

    6、在Director2上安装配置keepalived,实现LVS调度器的高可用

    ! Configuration File for keepalived    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived_test@nwc.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node73
       vrrp_mcast_group4 224.0.32.18
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eno16777736
        virtual_router_id 32
        priority 95
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345678
        }
        virtual_ipaddress {
    	10.1.32.1/16 dev eno16777736 label eno16777736:0
        }
        track_interface {
            eno16777736
        }
       notify_master "/etc/keepalived/notify.sh  master"
       notify_backup "/etc/keepalived/notify.sh backup"
       notify_fault "/etc/keepalived/notify.sh fault"
    }
    
    sorry_server 10.1.32.73 80
     
    virtual_server 10.1.32.1 80 {
        delay_loop 6
        lb_algo rr 
        protocol TCP
        
        real_server 10.1.32.68 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
        real_server 10.1.32.168 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
    }

    

    7、在两台Director上提供httpd服务,用于实现提供当所有Real Server都不可用时的错误页面

    blob.png

    blob.png

    8、在两台Director上启动keepalived服务,客户端访问VIP,验证是否正常

    blob.png

    blob.png

    停掉某个Real Server,验证对后端的real server的健康性检测是否生效

    blob.png

    停掉keepalived的主节点后的Director后,验证服务是否可用

    blob.png    

    停掉两个Real Server,验证错误页面服务器的配置是否生效

    blob.png

    停掉两个节点的keepalived服务后,服务就无法正常访问了

    blob.png

    

第四章    keepalived实现对Nginx服务的高可用(主/备模型)

    1、实验环境

    blob.png

    2、在两个nginx节点上yum安装keepalived,rpm安装nginx;在两个web服务器上安装httpd,提供测试页面

        

    3、配置网络环境

    blob.png

    blob.png

    blob.png

    blob.png

    4、启动后端两台web服务器,验证服务是否正常

    blob.png

    blob.png

    5、配置nginx将用户请求反代到两台web服务器,验证服务是否正常

    blob.png

    blob.png

    blob.png

    blob.png

    6、在ngx1上配置keepalived,实现对nginx服务的高可用

    6.1.png

    7、在ngx2主机上配置keepalived对nginx服务进行高可用

    7.1.png

    8、启动两个节点的keepalived,验证高可用是否生效

    GIF1.gif

    blob.png

    blob.png

    

    9、利用状态转移时的通知脚本机制,定义当节点状态发生变化时,后续的动作。

        本例以:当节点变为主节点时不做任何操作,当节点变为备用节点时,停止nginx

    脚本为
    #!/bin/bash
    # Author:nwc
    # Time:2016-11-01 12:56:17
    #
    
    contact='root@localhost'
    ##定义变量contact,其值为root@localhost,指明通告给谁,也就是邮件发送给谁
    vip="10.1.32.1"
    ##定义变量vip,其值为VIP的地址
    
    notify() {
        mailsubject="`hostname` to be $1: $vip floating"
        mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1"
        echo $mailbody | mail -s "$mailsubject" $contact
    }
    ##定义一个notify函数,用于发送邮件,定义了邮件的主题和邮件的正文部分,函数可以接受函数自身的位置参数
    
    case $1 in
    master)
        notify master
    ;;
    backup)
        notify backup
        nginx -s reload
    ;;
    fault)
        notify fault
    ;;
    *)
        echo "Usage: `basename $0` master|backup|fault"
    ;;
    esac
    ##定义一个循环,当脚本的位置参数$1为对应值时,调用函数发送邮件

    在keepalived配置文件中进行引用

    9.1.png

第五章    keepalived实现双主模型的高可用实现方案(主/主模型)

    1、实验环境

    blob.png

    2、利用上个实验的环境,实现将前端nginx做成双主模型

        在上个实验的基础上,只需要配置定义两个vrrp实例,其中一个vrrp实例的ngx1节点上是主节点,在ngx2节点上是备用节点,另一个vrrp实例在ngx1上是备用节点,在ngx2上是主节点

    5.2.1.png

    5.2.2.png

    

    3、启动keepalived服务,验证配置

    GIF222.gif

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/56546

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类…

    Linux干货 2015-07-24
  • linux入门

    linux入门 Centos中分root用户和普通用户,root为超级管理员,几乎具有所有的系统控制 刚进入linux系统,Ctrl+Alt+F[1-6]可以切换虚拟终端  (tty) 图形终端:CentOS 6: Ctrl + Alt + F7       CentOS 7:在哪个终端启动,即位于哪个虚拟终端 伪终端…

    Linux干货 2017-02-16
  • linux路由转发(软路由)实验

        一。实验网络拓扑             (R1,R2由 Linux 虚拟机添加双网卡做软路由实现)              &n…

    Linux干货 2016-09-05
  • 配置yum服务器——以centOS 6.9系统为例

    准备工作 关闭防火墙  关闭防火墙service iptables stop  设置防火墙开机不启动chkconfig iptables off  查看一下防火墙状态 iptables -vnL 如下图,可以看到已经关闭 关闭SElinux 使用命令 vim /etc/selinux/config 将SELINUX=enable…

    Linux干货 2017-08-05
  • Linux文本处理三剑客之GNU awk的使用

    awk: Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 有多种版本:New awk(nawk),GNU awk(gawk) gawk –模式扫描和处理语言 基本用法:     awk[options] ‘program’ var=value file…   &nb…

    Linux干货 2016-10-06
  • Lnmp安装脚本

    1、源码编译安装LNMP架构环境; 此题略 此链接为安装nginx时,编译参数和各个模块和第三方模块的介绍,十分丰富,安装前可以参考学习 https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/ 2、编写一个脚本完成以下功能:    (1)、一键搭建…

    Linux干货 2016-12-05