模块简单设计——用HA保证服务高可用性

为了保障服务的稳定运行,我们可以采用keepalived或者HA的解决方案,下面是一个HA的安装配置示例:

 

首先分别在两台服务器上安装HA(yast -i heartbeat)

server1:192.168.1.100

server2:192.168.1.101

编辑/etc/ha.d/authkeys

auth 3
#1 crc
#2 sha1 HI!
3 md5 ciaoskey

编辑/etc/ha.d/ha.cf

logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 30
warntime 10
udpport 19871
ucast eth0 192.168.1.101
#for server 2 configure 
#ucast eth0 192.168.1.100
auto_failback on
node    server1 server2
ping 102.168.1.1

编辑/etc/ha.d/haresources

server1  IPaddr::192.168.1.110/32 nginxd

 两台服务器均监听110这个虚拟IP,前端浏览器访问192.168.1.110即可。

 

ha服务就可以通过/etc/init.d/heartbeat start|stop|reload等管理了

下面做一个简单的测试

A,分别启动两台机器的heartbeat

ciaos:~ # /etc/init.d/heartbeat start
Starting High-Availability services2012/11/22_17:10:41 INFO:  Resource is stopped
heartbeat: udpport setting must precede media statementsheartbeat: baudrate setting must precede media statementsheartbeat[10368]: 2012/11/22_17:10:41 info: Version 2 support: false
heartbeat[10368]: 2012/11/22_17:10:41 WARN: Logging daemon is disabled --enabling logging daemon is recommended
heartbeat[10368]: 2012/11/22_17:10:41 info: **************************
heartbeat[10368]: 2012/11/22_17:10:41 info: Configuration validated. Starting heartbeat 2.1.3
                                                                      done

(用浏览器访问192.168.1.110显示first server)

B,关闭100上面的HA,如下:

ciaos:~ # /etc/init.d/heartbeat stop
Stopping High-Availability services                                   done
logd[10282]: 2012/11/22_17:10:04 debug: Stopping ha_logd with pid 9650
logd[10282]: 2012/11/22_17:10:04 info: Waiting for pid=9650 to exit
logd[10282]: 2012/11/22_17:10:05 info: Pid 9650 exited

(用浏览器访问192.168.1.110显示second server)

C,重启100的HA,用浏览器访问结果恢复为first server

这样,一个简单的主备WEB服务器就搭建完毕

 

附LSB格式脚本/etc/init.d/nginxd如下(需要拷贝到heartbeat的安装目录下)(网上那个版本找不到status命令,我这里写了个函数简单代替,程序还有点问题)

#!/bin/sh

. /usr/lib/ocf/resource.d//heartbeat/.ocf-shellfuncs

RETVAL=0
prog="nginx"

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/logs/nginx.pid

nginx_check()
{
    if [[ -e $nginxPid ]]; then
        ps aux |grep -v grep |grep -q nginx
        if (( $? == 0 )); then
            echo "$prog already running..."
            exit 1
        else
            rm -rf $nginxPid &> /dev/null
        fi
    fi
}

start()
{
    nginx_check
    if (( $? != 0 )); then
        true
    else
        echo -n $"Starting $prog:"
        `$nginxd -c $nginxConf`
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
        return $RETVAL
    fi
}

stop()
{
    echo -n $"Stopping $prog:"
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
    echo -n $"Reloading $prog:"
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}

status()
{
    nginx_check
    if (( $? != 0 )); then
        return 0
    else
        return 1
    fi
}

monitor()
{
    status $prog &> /dev/null
    if (( $? == 0  )); then
        RETVAL=0
    else
        RETVAL=7
    fi
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        monitor)
                monitor
                ;;
        *)
                echo $"Usage: $0 {start|stop|restart|reload|status|monitor}"
                RETVAL=1
esac
exit $RETVAL

猜你喜欢

转载自ciaos.iteye.com/blog/1733004
今日推荐