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)
上一篇 2016-11-01 20:47
下一篇 2016-11-01 21:25

相关推荐

  • 简单路由实验

    今天学习了路由相关的基础知识,为了加深印象,做了如下的一个实验。根据下面的网络拓扑图分别配置两台PC和路由,以实现PC1和PC2能够互相ping通。实验环境为VM虚拟机 在实验开始前,我们需要在路由添加两块网卡,PC机添加一块网卡,此实验网卡的链接方式是桥接,一共需要4台虚拟机,两台做PC机,两台做路由器 1、R2路由器的配置 [root@linuxpao&…

    Linux干货 2016-09-05
  • 网络组(Network Teaming)

    网络组(Network Teaming) 网络组:是将多个网卡聚合在一起的方法,从而实现容错和提高吞吐量 网络组不同于旧版中bonding技术,提供更好的性能和扩展性 网络组由内核驱动和teamd守护进程实现. 多种方式runner     broadcast     roundrobin     …

    Linux干货 2017-03-26
  • N22-第十周作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) (1)POST:加电自检,利用COMS里记录的配置信息检测硬件是否都工作正常 (2)Boot Sequence: 按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备 Grub引导程序:提供一个菜单,允许用户选择要启动的系统或不同的内核版本, 把用户选定的内…

    Linux干货 2016-10-25
  • vim编辑器使用详解

    1.vi (virtual interface)文本编辑器     文本编辑种类:     行编辑器:sed     全屏编辑器:nano vi     vim vi-improved  &…

    Linux干货 2016-08-15
  • Linux 网络属性管理

    在介绍Linux网路属性管理之前,我还要介绍下以太网(Enternet) 以太网的工作原理 以太网才用带冲突检测的载波侦听多路访问(CSMA/CD)机制。以太网中节点都可以看到在网络中发送的所有信息,因此,我们说以太网是一种广播网络。 以太网的工作过程如下: 当以太网中的一台主机要传输数据时,它将按如下步骤进行: 1.监听信道上是否有信号在传输。如果有的话,…

    Linux干货 2016-03-20
  • Linux 第六天: (08月03日) Linux权限管理

    Linux 第六天: (08月03日) Linux权限管理         chown USER:GROUP FILE 变更文件或目录所属主chown -R 递归chown –reference=<> 参考 chgrp GROUP DIR(or FILE) 变更文件或目录所属组   &…

    Linux干货 2016-08-08