keepalived的作用就是解决单点问题,当其中一个调度器宕机另一个备用的调度器取而代之,从而实现高可用。keepalived有两个节点,一个为活动节点Active和备份节点Passive。在lvs集群上实现高可用需要有vip,ipvs规则,使用nginx集群实现高可用需要vip和nginx服务。

        vip在某个时刻只能在一个节点上,当一个节点宕机了另外一个节点必须取得vip并配置再自己的主机上才能作为访问入口。那么怎么样才能知道活动节点宕机了呢?主节点定时发送组播信息及heartbeat心跳信息,各个主机时间要同步,二者之间约定当主节点宕机后备用调度器就将IP抢过来配置再自己的主机上。对高可用集群来讲,节点之间所征用的资源主要在两个方面,IP和存储。在存储上如nfs可解决并发存储问题。

        lvs:vip,ipvs rules

        nginx:vip,nginx service

VRRP协议:

        vrrp:virtual route redundent protocol,虚拟路由冗余协议。 keepalived就是vrrp协议在linux主机上的以守护进程的实现,能够根据配置文件自动生成ipvs规则,能够对RS做健康状态监测。

20160916105621861.jpg

        Scheduler:调度器

        Memory Mngt:内存管理

        Control Plance Configuration Parser:配置文件分析器的主控工具,能够reload配置文件,类似Nginx 的master进程。

        Core components:核心组件,包括VRRP Strack,也就是vrrp协议的实现。Checkers检测功能。checkers是一个线程,VRRP Stack也是一个线程。

        IPVS wrapper:就是能够根据配置文件生成规则的组件。

        Watch Dog:内部自我救赎的高可用机制,自动监控VRRP进程是否正常,如果进程挂掉就会把它重新启动起来。

配置文件

安装keepalived:

        CentOS 6.4版本以后keepalived已近被收录发行版,可以直接使用yum install keepalived。

        主配置文件位置:/etc/keepalived/keepalived.conf

        服务启动脚本:/etc/sysconfig/keepalived

配置文件的组成部分:

        GLOBAL CONFIGURATION        全局配置段

        VRRPD CONFIGURATION          vrrp守护进程

                vrrp instance        虚拟路由器

                vrrp synchoinzation group

        LVS CONFIGURATION


HA Cluster配置前提:

        1、要能够使用主机名与对方主机进行通讯,本机的主机名与hosts中定义的主机保存一致,要与hostname(uname -n)获得的名称保持一致,修改主机名的命令有:在6中修改文件/etc/sysconfig/network,在7中hostnamectl set-hostname HOSTNAME。各个节点要能够互相解析主机名。一般通过hosts文件解析。

        2、各节点时间同步。

        3、确保iptables端口开放及关闭selinux。

        配置文件中的 global_defs{} 配置段是全局配置,vrrp_instance{} 是用来做虚拟路由实例的。


        切换到 /etc/keepalived/keepalived.conf 先将配置文件备份,然后将所有的 virtual_server{} 配置段注释,因为此时用不到。

全局配置:

        global_defs {

                notification_email {                #当服务器故障发送邮件到这些邮箱

                    acassen@firewall.loc

                    failover@firewall.loc

                    sysadmin@firewall.loc

                }

                notification_email_from Alexandre.Cassen@firewall.loc    #发送这些邮件使用的账户

                smtp_server 192.168.200.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                #初始状态,MASTER和BACKUP

                interface ens33              #IP地址配置再那个网卡上

                virtual_router_id 51        #虚拟路由的ID, 工作在同一个虚拟路由上的这个ID要相同。

                priority 100                    #0-255,优先级,要想成为MASTER就要定义高的优先级

                advert_int 1                    #心跳信息的发送间隔

                authentication {             #认证信息

                    auth_type PASS         #认证方式为简单字符认证

                    auth_pass 1111          #认证用的字符串,同一个虚拟机实例上要一样

                }

                virtual_ipaddress {        #虚拟IP地址,这个地址将会配置再上面设置的 interface 上。

                    192.168.200.16

                    192.168.200.17

                    192.168.200.18/24 dev eth2 label eth2:1        #这个配置方法只能在Centos6上,在7上只能用IP/mask方式。

                }

                nopreempt                  #非抢占模式,默认抢占模式

        }


开启日志:

        在 /etc/sysconfig/keepalived 修改该为: KEEPALIVED_OPTIONS="-D -S 3"

        在 /etc/rsyslog.conf 中在下面添加 local3.*       /var/log/keepalived.log,然后重启日子服务systemctl restart rsyslog.service。

        这些修改在每个虚拟路由上都要修改,这个日子功能不影响keepalived的正常工作,不开启也可以。这个日子记录了keepalived的心跳信息,启动关闭等等信息。


手动将主节点将为备用节点:

        在配置文件中加上这一段脚本,这个脚本的作用是每隔一段时间执行一次,当检测到有down文件时就将此节点的权重减2,从而实现将主节点降低为备用节点,只要在响应目录中添加上down文件就可以控制此操作。

        vrrp_script chk_schedown{

                script "[[ -f /etc/keepalived/own ]] && exit 1 || exit 0"

                interval 2                #每隔多长时间检测一次

                weight -2                #减少的权重

        }

        下面这个脚本作用和上面的一样,如果上面的配置不行,实现不了就用下面这个。

        vrrp_script hand_down {

            script "/etc/keepalived/run.sh"        #这里放着一个shell脚本,注意权限问题

            interval 1

            weight -2

        }

        run.sh

        #!/bin/bash

        if [ -f /etc/keepalived/down ]; then

                exit 1

        else

                exit 0

        fi

        这段脚本和其他的配置段是平级的,不存在包含关系。上面只是定义脚本,还没有去调用,调用脚本需要在 vrrp_instance 中定义,定义格式如下,track_script 是用来监控脚本的,track_interface 是用来监控端口的。

        vrrp_instance VI_1 {

            ........

            track_script {

                chk_schedown

            }

        }

        配置完成后重启keepalived,然后在 /etc/keepalived/ 下创建 down文件就可以将某个路由降级为备用节点。


基于LVS实现高可用的配置方法:

        基于LVS的nat模式下实现高可用需要有vip和dip,且是可动的,dip是调度器与后端集群通讯的ip,vip是客户端请求的ip,当vip变动时,dip也要vip跟着变动,也就是说vip和dip必须同时在一个调度器上。

        vrrp_svnc_group VG_1{

            group {

                VI_1     #name of vrrp_instance (below)

                VI_2     #one for each moveable IP

            }

        }

        vrrp_instance VI_1 {

            eth0

            vip

        }

        vrrp_instance VI_1 {

            eth0

            dip

        }


两遍都出现VIP现象:

        这种情况是两个主机通讯问题造成的,关闭防火墙或设置响应的规则即可解决。


双主模式

        一本情况下两个调度器只有一个是正常工作的,还有一个就会处于闲置状态,这样会造成资源浪费,如果把两个调度器都使用起来呢,首先要将域名解析到两个IP上,这样访问者会被分流到两个IP上,两个调度器上正常工作时各自配置一个IP,也是VIP,当其中一个调度器宕机就将另一个作为备用节点,也就是两个vip在一个主机上。

配置过程:

        将每个主机上的 keepalived 都配置两个 vrrp_instance ,且如下配置都是不一样的。

        vrrp_instance VI_2 {  

            state MASTER

            interface ens33

            virtual_router_id 61

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass fa2a8saex

            }

            virtual_ipaddress {

                192.168.96.140/24

            }

            track_script {

                chk_schedown            #用来手动宕机,可以一样也可以不一样

            }

        }

        state 一个为主的MASTER,一个为备用的BACKUP。

        virtual_router_id 虚拟路由ID,同一组要一样,因为这是不同的两组,所以要不一样。

        priority 优先级,抢占模式各自的主节点要比备用的优先级高。

        virtual_ipaddress 使用的vip也要不一样。

        两个主机的配置是一样的模式,注意双主模式不要限定组播地址 vrrp_mcast_group4 这样会导致只有一组生效,因为默认不同的组的组播地址是不一样的。


实例配置:

        这是其中一个的配置,另一个配置根据上面的条件做响应修改即可。

        global_defs {

           notification_email {

               root@localhost

           }

           notification_email_from keepalived@localhost

           smtp_server 127.0.0.1

           smtp_connect_timeout 30

           router_id node1.zhuqiyang.com

        }

        vrrp_script chk_schedown {

            script "/etc/keepalived/run.sh"

            interval 2

            weight -2

        }

        vrrp_instance VI_1 {

            state BACKUP

            interface ens33

            virtual_router_id 51

            priority 99

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass fa2a8dae

            }

            virtual_ipaddress {

                192.168.96.139/24

            }

            track_script {

                chk_schedown

            }

        }

        #这是双主模型,单组下面这个不加即可。

        vrrp_instance VI_2 {

            state MASTER

            interface ens33

            virtual_router_id 61

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass fa2a8saex

            }

            virtual_ipaddress {

                192.168.96.140/24

            }

            track_script {

                chk_schedown

            }

        }

通过脚本发送通知

        当主机状态改变时,需要发送信息通知给管理员,keepalived可以通过写脚本的方式发送邮件。具体配置为在实例vrrp_instance 中配置如下内容,每个实例都要配置响应的脚本内容。

        vrrp_instance VI_1 {

            .......

            notify_master "/etc/keepalived/test.sh master"

            notify_backup "/etc/keepalived/test.sh backup"

            notify_fault "/etc/keepalived/notify.sh fault"

        }

        这个notify.sh的内容如下,也可以自定义内容。

        #!/bin/bash

        vip=192.168.96.139

        contact='root@localhost'

        notify() {

            mailsubject="`hostname` to be $1: $vip floating"

            mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"

            echo $mailbody | mail -s "$mailsubject" $contact

        }

        case "$1" in

            master)

                notify master

        #        /etc/rc.d/init.d/haproxy start

                exit 0

            ;;

            backup)

                notify backup

        #        /etc/rc.d/init.d/haproxy stop

                exit 0

            ;;

            fault)

                notify fault

        #        /etc/rc.d/init.d/haproxy stop

                exit 0

            ;;

            *)

                echo 'Usage: `basename $0` {master|backup|fault}'

                exit 1

            ;;

        esac

nginx高可用集群

        先配置后端的服务器集群,每台主机上都安装好httpd服务,然后再在两个调度器上分别安装上nginx,再配置 upstream ,然后再在location中配置proxy_pass 。

        upstream webservers {

                server 192.168.96.128:80 weight=1;

                server 192.168.96.130:80 weight=1;

        }

        上面这个upstream 配置在 http{} 内即可。

        location / {

                proxy_pass http://webservers/;

        }

        这个location 配置在 server{} 中。

        后端的集群主机中在各自的主页写上不一样的内容以便调试区分。这些工作完成后就可以在开启 keepalived 服务了,然后访问vip就可以看到负载均衡的高可用服务了。


nginx宕机处理:

        当nginx意外宕机但是 keepalived 依然运行,虽然这时候已近不能提供服务但是vip任然在当前的主机上,这时候应该将当前主机的keepalived降权为备用主机,让正常服务的nginx主机作为调度器。实现这个功能就是将 vrrp_script { } 中设置为检测nginx主机是否服务正常,如果不正常则将主机降权为备用节点,然后设置 track_script { } 去跟踪设置的脚本即可。

        vrrp_script chk_nginx {

            script "/etc/keepalived/chk_nginx.sh"

            interval 1

            weight -2

        }

        在chk_nginx.sh脚本中的内容如下,就是检测nginx服务是否正常。

        #!/bin/bash

        killall -0 nginx &> /dev/null

        exit $?


        下面这个是追踪脚本chk_nginx的设置。

        track_script {

            chk_nginx

        }

        设置完成后重启keepalived服务,然后将nginx停止服务,看备用节点是否将vip抢过去了。

        一般情况下如果nginx宕机了需要将nginx修复上线,如果修复不了就备用节点成为主节点,当nginx宕机了如何修复呢,可以在notify的触发事件中重启nginx服务。只要在触发的脚本中添加重启nginx服务的命令即可。

        #!/bin/bash

        vip=192.168.96.139

        contact='root@localhost'

        notify() {

            mailsubject="`hostname` to be $1: $vip floating"

            mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"

            echo $mailbody | mail -s "$mailsubject" $contact

        }

        case "$1" in

            master)

                notify master

                systemctl restart nginx.service

                exit 0

            ;;

            backup)

                notify backup

                systemctl restart nginx.service

                exit 0

            ;;

            fault)

                notify fault

        #        /etc/rc.d/init.d/haproxy stop

                exit 0

            ;;

            *)

                echo 'Usage: `basename $0` {master|backup|fault}'

                exit 1

            ;;

        esac


双主模式高可用集群:

        双主模型(active/active)高可用集群的实现就是创建两个vrrp实例,其中一个为主另一个则为备用,这样两台调度器就可以同时进行工作了,利用域名解析将域名解析到两个vip,一个配置实例如下,红色的表示不一样的地方。

        ! Configuration File for keepalived

        global_defs {

           notification_email {

               root@localhost

           }

           notification_email_from root@localhost

           smtp_server 127.0.0.1

           smtp_connect_timeout 30

           router_id node4.zhuqiyang.com

        }

        vrrp_script hand_down {

            script "/etc/keepalived/run.sh"

            interval 1

            weight -2

        }

        vrrp_script chk_nginx {

            script "/etc/keepalived/chk_nginx.sh"

            interval 1

            weight -2

        }

        vrrp_instance VI_1 {

            state MASTER

            interface ens33

            virtual_router_id 51

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass fa2a8dae

            }

            virtual_ipaddress {

                192.168.96.139/24 dev ens33 label ens33:0

            }

            track_script {

                chk_nginx

            }

            notify_master "/etc/keepalived/notify.sh master"

            notify_backup "/etc/keepalived/notify.sh backup"

            notify_fault "/etc/keepalived/notify.sh fault"

        }

        

        vrrp_instance VI_2 {

            state BACKUP

            interface ens33

            virtual_router_id 61

            priority 99

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass fa2av8da9

            }

            virtual_ipaddress {

                192.168.96.140/24 dev ens33 label ens33:1

            }

            track_script {

                chk_nginx

            }

            notify_master "/etc/keepalived/notify.sh master"

            notify_backup "/etc/keepalived/notify.sh backup"

            notify_fault "/etc/keepalived/notify.sh fault"

        }

        配置完成后尝试着将其中一个调度器的nginx服务关闭,在另一个调度器上查看是两个vip是否已经配置上,然后在启动停掉的nginx服务,再看看vip是否被抢回来,两个vip分别配置在两个调度器上。