首页 > 代码库 > keepalived

keepalived

            Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.

        Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。


下面我们来实现简单的冗余功能:

两台Centos6.5的主机

分别安装keepalived

Master:172.16.1.20

Backup:172.16.1.1

wKiom1Qg0dDy9y13AAFJdXQeP0A245.jpg


一、安装配置

1、分别在两台主机上

#yum install keepalived -y

2、编辑Master配置文件

wKiom1QgzZ2RNaWKAAGeEUBKk8s130.jpg

3、编辑Backup配置文件

wKioL1QgzcKw8PsrAAGET9OLs-s520.jpg

4、在任意一台主机上ping上面任意一个虚拟IP

wKiom1Qgzi-yVx9ZAAFzzi8WvRI038.jpg

#############################################################################

                    但是这种方式存在恼裂的可能,即两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,这时两个节点均强行绑定虚拟IP,导致不可预料的后果。 
                    这时就需要设置仲裁,即每个节点必须判断自身的状态(应用服务状态及自身网络状态),要实现这两点可使用自定义shell脚本实现,通过周期性地检查自身应用服务状态,并不断ping网关(或其它可靠的参考IP)均可。当自身服务异常、或无法ping通网关,则认为自身出现故障,就应该移除掉虚拟IP(停止keepalived服务即可)。


思路:

    添加一个脚本,为隔一段时间就会启动一次并检测自身的状态


    vrrp_script check_local {                 //定义一个名称为check_local的检查脚本

    script "/usr/local/check_local.sh" #shell脚本的路径

    interval 5  }

    再在vrrp_instance配置中加入以下代码使用上面定义的检测脚本:

    track_script {

            check_local

    }


脚本内容:(来自互联网)

    #!/bin/bash

     

    pidfile=/var/lock/subsys/`basename $0`.pid

    if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then

        exit 1

    fi

    trap "rm -fr $pidfile ; exit 0" 1 2 3 15

    echo $$ > $pidfile

    maxfails=3

    fails=0

    success=0

    while [ 1 ]

    do

        /usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null

        if [ $? -ne 0 ] ; then

            let fails=$[$fails+1]

            success=0

        else

            fails=0

            let success=$[$success+1]

        fi

        if [ $fails -ge $maxfails ] ; then

            fails=0

            success=0

            #check keepalived is running ? try to stop it

            service keepalived status | grep running

            if [ $? -eq 0 ] ; then

                logger -is "local service fails $maxfails times ... try to stop keepalived."

                service keepalived stop 2>&1 | logger

            fi

        fi

        if [ $success -gt $maxfails ] ; then

            #check keepalived is stopped ? try to start it

            service keepalived status | grep stopped

            if [ $? -eq 0 ] ; then

                logger -is "service changes normal, try to start keepalived ."

                service keepalived start

            fi

            success=0

        fi

        sleep 3

    done



双主模型:

wKiom1Qg0xOyxirBAAJ9kRZzf3U089.jpg






本文出自 “菜鸟前行之路” 博客,谢绝转载!

keepalived