在这里我们要讲Keepalived的使用,在讲Keepalived之前,我们要先讲讲VRRP的使用。因为Keepalived加入VRRP功能,使得现在的Keepalived具有服务器运行检测功能与HA Cluster功能。

一、VRRP定义

VRRP(Virtual Routing Redundent Protocol):虚拟路由冗余协议,它是一种协议,将多态物理设备组合成一台虚拟设备。

   1、备份组中路由器的优先级

在一个备份组中,有一个主(master),多个从(slave),当主服务器(master)宕机了,从服务器就要取而代之,但是那么多从服务哪个取代呢?它有一个根据优先级的选举协议,优先级高的谁就成为主的了,或者让它工作在抢占模式下,谁反应快,谁就成为主的了。所以它是一主多从的工作机制,但是多个从平时都不上线,这就造成了资源的浪费,所以我们常见的就是一主一从,实际它是可以实现一主多从的。

VRRP优先级的取值范围为0~255(数值越大表名优先级越高),可配置的范围是1~254,优先级0为形同保留,255则是系统保留给IP地址拥有者,当路由器为IP地址拥有者时,其优先级始终为255,所以,当备份组内存在IP地址拥有者时,只要其工作正常,则为Master路由器。

在一个物理设备上,可以配置多个组,靠组ID区别不同的组。在同一个组内,所有的工作都在同一个组内工作的。

   2VRRP工作过程

(1)路由器使用VRRP功能后,会根据优先级确定自己在备份中的角色。优先级高的为Master,低的为Backup,Master定义发送VRRP通告报文,通知备份组中的其它路由器自己工作正常。Backup则启动定时器等待通告报文的到来。

(2)在抢占模式下,当Backup收到VRRP通告的报文后,会拿自己的优先级比较通报报文中的优先级,如果大于通告报文中的优先级,则成为Master ,如果小于通告报文中的优先级,则还是Backup

(3)在非抢占模式下,只要Master路由器没有出现问题,备份组中的路由器始终保持着自己原来的状态,即使后来有的Backup有更高的优先级也不会成为Master

(4)如果Backup的定时超时后仍然没有收到Master路由器发送来的VRRP通告报文,则认为Master已经无法正常工作了,此时Backup会认为自己是Master,并对外发送VRRP通告报文,备份组内的路由会根据优先级选举出来Master,承担报文的转发功能。

二、Keepalived定义及主要功能

Keepalived:最初目的为ipvs提供高可用功能的,所以我们实现ipvs高可用的时候我们使用Keepalived来配置更简

主要提供三个功能

  1、IP:对IP地址实现飘移,依赖于ARRP协议

  2、lvs:重新启用一份ipvs规则

  3、health check:健康检查

三、配置安装Keepalived实现LVS服务的高可用

我们这里使用四台虚拟机,其中HA1和HA2当做高可用的Web服务,另外两个做成real server。这里我们要先在HA1和HA2上面安装keepalived,这个软件我们这些下载到本地了,大家配置了上官网上下载(keepalived-1.2.7-5.el5.i386.rpm)   软件包,因为安装这个包还需要解决依赖关系,所以这里我们还需要安装yum库,安装完成后我们就开始安装keepalived。

1、安装yum

我们这里用挂载光盘来安装yum库,进而安装开发环境,需要安装Development Libraries和Development Tools但是Development Tools默认都安装过了,所以我们这里安装一个就行了。安装完成后开发环境就安装成功了。

194608367.png

[root@localhost ~]# mkdir /mnt/cdrom    ###创建cdrom目录
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom  ###挂载光盘(当场有效,开机无效)
[root@localhost ~]# vim /etc/fstab  ###在配置文件中挂载光盘(当场无效,开机有效)
/dev/cdrom              /mnt/cdrom              ext3    defaults        0 0
[root@localhost ~]# cd /etc/yum.repos.d/  ###进入yum.repos.d目录下面
[root@localhost yum.repos.d]# vim server.repo  ###编辑server.repo
[base]
name=Server
baseurl=file:///mnt/cdrom/Server
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum groupinstall "Development Libraries"

2、安装keepalived

# yum -y--nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm
# rpm -qlkeepalived   ###查看配置文件
/etc/keepalived   ###配置文件目录
/etc/keepalived/keepalived.conf    ###主配置文件
/etc/keepalived/keepalived.conf.haproxy_example   ###自己设置的主配置文件将haproxy配置成高可用功能了
/etc/keepalived/notify.sh   ###这里我们设置的脚本,网上下载是没有的。
# scpkeepalived-1.2.7-5.el5.i386.rpm node1:/root  ###把下载的软件包给前HA2发过去。

195723107.png

   3、查看并解释配置文件。

195906942.png

四、配置real server

     我们需要设置IP地址与director在同一个网段内,首先我们要先关闭selinux,然后安装http服务器进行访问测试,然后编辑网页,网页编辑完成后我们就要开启服务,下来进行网页测试。

#setenforce0   ###关闭selinux
# yum installhttpd   ###安装http服务
# vim  /var/www/html/index.html  ###编辑网页
# service httpdrestart  ###开启服务

200047851.png200103567.png

我们这里使用的是一个脚本,此脚本只需要在real server中使用就行了。

# vim start.sh###编辑脚本,脚本内容如下:

#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.58.1
host=`/bin/hostname`
case "$1" in
start)
       # Start LVS-DR real server on this machine.
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore  ###设置相应级别
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce  ###设置通告级别
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0
;;
stop)
        # Stop LVS-DR real server loopback device(s).
        /sbin/ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
            # Either the route or the lo:0 device
            # not found.
            echo "LVS-DR real server Stopped."
        else
            echo "LVS-DR real server Running."
        fi
;;
*)
            # Invalid entry.
            echo "$0: Usage: $0 {start|status|stop}"
            exit 1
;;
esac

## chmod +x start.sh
# ./start.sh start
# ifconfig (显示的是只是添加的内容)

200308871.png

# scp start.sh172.16.58.10:/root/  ###将脚本复制到另一个real server上进行执行。

五、修改主配置文件

1、修改HA1中的keepalived的配置文件

下面我们就去HA1和HA2中修改主配置文件,我们在修改主配置文件的时候首先就是要将主配置文件复制一份,然后在修改,这样避免出错后,无法修改。

! 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 LVS_DEVEL
}
vrrp_instance VI_1 {    ###定义虚拟路由(可以定义多个虚拟路由组)
    state MASTER     ###状态(有两种,一种MASTER另一种BACKUP)【提示:只在初始的时候定义主、从】
    interface eth0    ###在哪个接口上实现配置地址和完成选举
    virtual_router_id 77    ###在VI_1下面定义的虚拟ID,必须要和别的人不一样
    priority 101     ###优先级
    advert_int 1     ###多长时间通告一次(这里是1秒钟)
    authentication {   ###认证
        auth_type PASS     ###表示用字符串来认证
        auth_pass password   ###生成随机串(最好是随机的)
    }
    virtual_ipaddress {    ###提供虚拟IP(可以是一个,也可以是多个)
        172.16.58.1 
    }
}
virtual_server 172.16.58.1 80 {    ###定义虚拟服务器,后面是VIP,最后面是端口【提示:可以定义多个集群服务】
    delay_loop 6
    lb_algo wlc     ####负载均衡调度方法,rr为轮询
    lb_kind DR    ###LVS的类型
    nat_mask 255.255.0.0
    protocol TCP   ###端口协议使用TCP
    real_server 172.16.58.8 80 {    ###real server地址,端口
        weight 1     ###权重
            url {
              path /   ###获取web服务器的根目录,直接获取主页,显示200正常,显示404等为不正常
              status_code 200
            }
            connect_timeout 2    ###多长时间探测一次(2s),如果3s中后获取不到,则为不健康
            nb_get_retry 3     ###在探测不健康的时候要尝试几次(3次)
            delay_before_retry 1   ###每一次尝试之前要延迟多长时间 (1s)
        }
     virtual_server 172.16.58.1 80 {
        delay_loop 6
        lb_algo wlc
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
    real_server 172.16.58.10 80 {
        weight 1
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
}

2、将HA1中配置文件复制到HA2

修改好配置文件后,我们还需要将这个配置文件复制到HA2一份,不只是复制过去就行了,我们还需要修改配置文件的。

202829620.png

   3、开启两个HA服务

#service keepalived start   ###启动keepalived
#ip add show   ###查看网络状态

202941965.png

4、安装ipvsadm (两个服务上都要安装)

# ip add show
# servicekeepalived restart  ###重启keepalived
# ipvsadm -L –n  ###查看每一个real server对外所提供用户请求的次数

203738439.png

六、实现基于web服务的高可用集群(在HA1HA2上)

1、工作图

203844291.png

简述:当客户端通过路由器访问我们的服务器的时候,只能访问到我们的MASTER服务器上,当MASTER出现问题的时候,它的VIP会飘移到BACKUP上,会替代MASTER而成为MASTER的。

2、编辑网页并进行测试

# service keepalived stop    ###停止keepalived
# yum -y install httpd   ###装好web服务
# vim /var/www/html/index.html   ###编辑网页
<h1>node1</h1>    ###HA1网页内容
<h1>node2</h1>    ###HA2网页内容
# service httpd start       ###启动服务

首先确保服务不会成为高可用集群的故障,我们首先要启动服务,然后进行测试。

204015284.png

204016374.png

   3、修改keepalived配置文件并设置脚本

   这里我们还需要将配置文件中的内容修改,我们修改后的内容如下:

! Configuration File for keepalived
global_defs {
   notification_email {
         linuxedu@foxmail.com
         mageedu@126.com
   }
   notification_email_from kanotify@magedu.com
   smtp_connect_timeout 3
   smtp_server 127.0.0.1
   router_id LVS_DEVEL
}
vrrp_script chk_httpd{
    script "killall -0 httpd"
    interval 2
        # check every 2 seconds
    weight -2
        # if failed, decrease 2 of the priority
    fall 2
        # require 2 failures for failures
    rise 1
        # require 1 sucesses for ok
}
vrrp_script chk_schedown {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 2
   weight -2
}
vrrp_instance VI_1 {
    interface eth0
        # interface for inside_network, bound by vrrp
    state MASTER
        # Initial state, MASTER|BACKUP
        # As soon as the other machine(s) come up,
        # an election will be held and the machine
        # with the highest "priority" will become MASTER.
        # So the entry here doesn't matter a whole lot.
    priority 101
        # for electing MASTER, highest priority wins.
        # to be MASTER, make 50 more than other machines.
    virtual_router_id 51
        # arbitary unique number 0..255
        # used to differentiate multiple instances of vrrpd
        # running on the same NIC (and hence same socket).
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
        # optional, monitor these as well.
        # go to FAULT state if any of these go down.
    virtual_ipaddress {
        172.16.58.1/16 dev eth0 label eth0:0
    }
        #addresses add|del on change to MASTER, to BACKUP.
        #With the same entries on other machines,
        #the opposite transition will be occuring.
        #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    track_script {
        chk_httpd
        chk_schedown
    }
    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 {
#    interface eth0
#    state MASTER  # BACKUP for slave routers
#    priority 101  # 100 for BACKUP
#    virtual_router_id 52
#    garp_master_delay 1
#
#    authentication {
#        auth_type PASS
#        auth_pass password
#    }
#    track_interface {
#       eth0
#    }
#    virtual_ipaddress {
#        172.16.58.2/16 dev eth0 label eth0:1
#    }
#    track_script {
#        chk_httpd
#        chk_mantaince_down
#    }
#
#    notify_master "/etc/keepalived/notify.sh master eth0:1"
#    notify_backup "/etc/keepalived/notify.sh backup eth0:1"
#    notify_fault "/etc/keepalived/notify.sh fault eth0:1"
#}

开始的时候我就说过,我们这里自己设置的有脚本,大家如果想配置,脚本的内容如下:

#vim notify.sh
脚本内容如下:
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# description: An example of notify script
#
ifalias=${2:-eth0:0}
interface=$(echo $ifalias | awk -F: '{print $1}')
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')
#contact='linuxedu@foxmail.com'
contact='root@localhost'
workspace=$(dirname $0)
notify() {
    subject="$ip change to $1"
    body="$ip change to $1 $(date '+%F %H:%M:%S')"
    echo $body | mail -s "$1 transition" $contact
}
case "$1" in
    master)
        notify master
        exit 0
    ;;
    backup)
        notify backup
        /etc/rc.d/init.d/httpd restart
        exit 0
    ;;
    fault)
        notify fault
        exit 0
    ;;
    *)
        echo 'Usage: $(basename $0) {master|backup|fault}'
        exit 1
    ;;
esac

4、在HA2上编辑keepalived的配置文件,完成后进行测试

# vim keepalived.conf

204324960.png

# service keepalived start   ###启动keepalived
# ifconfig   ###在主服务器上使用它

204408193.png

这时候我们给HA1上使用了别名,我们使用别名访问一下。

204438775.png

   5、模拟MASTER出故障

这时候我们把主服务器的Web服务器停了,我们看看ip地址是否会飘移到从服务器上。从下面的两个图可以看到,它真的转移了,如果不相信我们可以测试下网页,我们可以看到它的页面内容也是我们原来设置从服务器的内容。

# service httpd stop    ###停止主服务器的Web服务

主服务器上:

204536398.png

从服务器上:

205012143.png

  6、测试一下:

205106106.png

七、双主模型

1、工作图:

205401903.png

简述:当客户端发送访问上面的服务器时,上面的服务器比较繁忙,我们就要用两台主机都进行工作,不过这里我们要使用两个虚拟IP地址,这两个虚拟IP地址是不一样的。我们这里是两个组,第一个组上面是主,下面是从,第二组下面是主,上面是从。如果有一个组中的MASTER挂了,它的VIP就会飘移到另一个组的上面。

2、修改配置文件

在上面基于web服务的高可用集群中,我们把keepalived配置文件中的最下面#开头的行开启了,开启后我们还要进行编辑,在HA1中将VI_2我们需要将state MASTER改为state BACKUP,我们把优先级改为100,只要比MASTER的优先级小就行。内容如下:

vrrp_instance VI_2 {
    interface eth0
    state BACKUP  # BACKUP for slave routers
    priority 100  # 100 for BACKUP         
    virtual_router_id 52
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
    virtual_ipaddress {
        172.16.58.2/16 dev eth0 label eth0:1
    }
    track_script {
        chk_httpd
        chk_mantaince_down
    }
    notify_master "/etc/keepalived/notify.sh master eth0:1"
    notify_backup "/etc/keepalived/notify.sh backup eth0:1"
    notify_fault "/etc/keepalived/notify.sh fault eth0:1"
}
# service keepalived restart   ###启动keepalived服务器
#ifconfig

  3、查看IP地址配置

   查看HA1的IP地址配置:

205651485.png

查看HA2的IP地址配置:

205652971.png

   4、测试:

205836159.png

205838506.png

   5、模拟HA1发生故障

# cd /etc/keepalived/
# touch down

查看HA2上IP地址配置:

210223508.png

   6、测试一下

我们会发现用172.16.58.6和172.16.58.7访问的都是由HA2返回的结果。

210110175.png

210111335.png