美文网首页程序员
双机热备技术

双机热备技术

作者: zhangkay | 来源:发表于2018-01-16 22:35 被阅读0次

    redis双机热备的流程:原理是将一个服务器作为主服务器,另一个服务器作为从服务器,做到在主服务器宕机后迅速切换到辅助缓存服务器。以主服务器为例子;
    首先是安装redis,需要用到root用户的权限:
    然后创建redis的主目录:
    mkdir -p /usr/local/redis-master/{bin,conf,logs}

    cp -a src/redis-server /usr/local/redis-master/bin/

    cp -a src/redis-cli /usr/local/redis-master/bin/

    cp -a src/redis-benchmark /usr/local/redis-master/bin/

    cp -a src/redis-sentinel /usr/local/redis-master/bin/

    cp -a src/redis-check-dump /usr/local/redis-master/bin/

    cp -a src/redis-check-aof /usr/local/redis-master/bin/

    然后创建redis的启动脚本vi /usr/local/redis-master/redis-start.sh:

    !/bin/bash

    REDISPATH=/usr/local/redis-2.8.3
    REDISCLI=$REDISPATH/bin/redis-cli
    LOGFILE=$REDISPATH/logs/redis-state.log
    LOCALIP=x #自身IP
    REMOTEIP=y #监控服务器的IP

    REMOTEREDISROLE=$REDISCLI -h $REMOTEIP info | grep "role"
    if grep "role:master" <<< $REMOTEREDISROLE ; then
    #start as slave
    $REDISPATH/bin/redis-server $REDISPATH/conf/redis_slave.confif [ "$?" == "0" ];then
    echo "[INFO]date +%F/%H:%M:%S :$LOCALIP start as slave successful." >> $LOGFILEelseecho "[ERROR]date +%F/%H:%M:%S :$LOCALIP start as slave error." >> $LOGFILE
    fi
    else#start as master
    $REDISPATH/bin/redis-server $REDISPATH/conf/redis_master.confif [ "$?" == "0" ];then
    echo "[INFO]date +%F/%H:%M:%S :$LOCALIP start as master successful." >> $LOGFILEelseecho "[ERROR]date +%F/%H:%M:%S :$LOCALIP start as master error." >> $LOGFILE
    fi
    fi

    给脚本赋予权限 chmod 755 /usr/local/redis-master/bin/redis-start.sh;
    然后创建redis的关闭脚本 vi /usr/local/redis-master/redis-stop.sh

    !/bin/bash

    REDISPATH=/usr/local/redis-master
    LOGFILE=$REDISPATH/logs/redis-state.log
    kill -9 ps -ef|grep '/bin/redis-server'|grep -v grep|awk '{print $2}'
    if [ "$?" == "0" ];then
    echo "[INFO]date +%F/%H:%M:%S :redis shutdown completed!" >> $LOGFILE
    elseecho "[ERROR]date +%F/%H:%M:%S :redis is not started." >> $LOGFILE
    fi

    chmod 755 /usr/local/redis-master/bin/redis-stop.sh;

    然后复制现在redis配置文件到用户目录:
    cp -a -R -p redis.conf /usr/local/redis-master/conf/redis_master.conf
    cp -a -R -p redis.conf /usr/local/redis-slave/conf/redis_slave.conf

    然后修改相应的配置文件:

    vi /usr/local/redis-master/conf/redis_master.conf

    daemonize no

    daemonize yes

    bind 127.0.0.1

    bind x #相应的IP地址
    logfile "/usr/local/redis-master/logs/redis.log"

    vi /usr/local/redis-master/conf/redis_slave.conf

    daemonize no

    daemonize yes

    bind 127.0.0.1

    bind y
    logfile "/usr/local/redis-master/logs/redis.log"

    slaveof <masterip> <masterport>

    slaveof y #相应的IP地址和端口

    然后修改这个redis-master的用户组别和权限:
    chown -R cpay:cpay /usr/local/redis-master;
    chmod -R 755 /usr/local/redis-master;

    然后再安装keepalived:
    1.下载keepalived源码Release 1.2.9

    注意:最新版为1.2.10测试过程中出错.
    wget http://www.keepalived.org/software/keepalived-1.2.9.tar.gz
    2.安装keepalived

    需要安装以下依赖包: make gcc libpopt-dev libnl-dev libcurl4-openssl-dev popt openssl
    cd

    tar –zxvf keepalived-1.2.9.tar.gz

    cd keepalived-1.2.9

    ./configure --prefix=/usr/local/keepalived

    make && make install

    然后复制指定文件到系统/etc文件夹:

    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

    chmod 755 /etc/rc.d/init.d/keepalived

    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    chmod 755 /etc/sysconfig/keepalived

    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

    chmod 755 /usr/sbin/keepalived
    mkdir /etc/keepalived

    安装完成后进行配置:
    mv /usr/local/keepalived/etc/keepalived/keepalived.conf /usr/local/keepalived/etc/keepalived/keepalived.conf-bak
    vi /usr/local/keepalived/etc/keepalived/keepalived.conf

    vrrp_script chk_redis {
    script "/usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh" ###监控脚本
    interval 2 ###监控时间
    }
    vrrp_instance VI_1 {
    state MASTER ###设置为MASTER
    interface eth3 ###监控网卡,依据实际情况来定
    virtual_router_id 51
    priority 101 ###权重值
    advert_int 1
    authentication {
    auth_type PASS ###加密
    auth_pass redis ###密码
    }
    track_script {
    chk_redis ###执行上面定义的chk_redis
    }
    virtual_ipaddress {
    z ###VIP
    }
    }
    将配置文件复制到系统目录
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived;
    chmod 755 /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived;

    然后创建用于监视redis的脚本(主):
    mkdir /usr/local/keepalived/etc/keepalived/scripts
    vi /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh

    !/bin/bash

    REDISPATH=/usr/local/redis_slave
    REDISCLI=$REDISPATH/bin/redis-cli
    LOGFILE=$REDISPATH/logs/redis-state.log
    LOCALIP=1xx
    REMOTEIP=xxx
    VIP=xxx
    REMOTEPASSWORD=art390
    LOCALPASSWORD=art390
    REMOTEPORT=6378
    LOCALPORT=6378
    REMOTECLI="$REDISCLI -h $REMOTEIP -p $REMOTEPORT -a $REMOTEPASSWORD"
    LOCALCLI="$REDISCLI -h $LOCALIP -p $LOCALPORT -a $LOCALPASSWORD"
    VIPALIVE=ip a | grep "$VIP"
    if [ "$VIPALIVE" == "" ]; then
    echo "[info]:"date" keepalived server is pengding or stop" >> $LOGFILE
    else
    echo "VIP IS HERE" >> $LOGFILE
    #check local service is running
    if [ $LOCALCLI ping = "PONG" ]; then
    echo "now local is in use" >> $LOGFILE
    # check local redis server role.
    echo $LOCALCLI info | grep "role" >> $LOGFILE
    if grep "role:slave" <<< $REDISROLE; then
    #change local redis server as master
    echo "[info1]:"date" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
    $LOCALCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

                        #change remoting redis server as slave
                        if [ `$REMOTECLI ping` = "PONG" ];then
                                REMOTEREDISROLE=`$REMOTECLI info | grep "role"`
                                if grep "role:master" <<< $REMOTEREDISROLE; then
                                        echo "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE
                                        $REMOTECLI SLAVEOF $LOCALIP 6378 >> $LOGFILE  2>&1
                                fi
                        fi
                fi
        else
                echo "[warn]:"`date`"  redis server($LOCALIP) is not health..." >> $LOGFILE
                sleep 1
                if [ "`$LOCALCLI PING`" != "PONG" ]; then
                        echo "[error]:"`date`"  redis server($LOCALIP) will be stop..." >> $LOGFILE
                        service keepalived stop
                fi
        fi
    

    fi

    然后给脚本配置权限:chmod 755 /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh

    从服务器的脚本为:

    !/bin/bash

    REDISPATH=/usr/local/redis_slave
    REDISCLI=$REDISPATH/bin/redis-cli
    LOGFILE=$REDISPATH/logs/redis-state.log
    LOCALIP=xxx
    REMOTEIP=xxx
    VIP=xxx
    REMOTEPASSWORD=art390
    LOCALPASSWORD=art390
    REMOTEPORT=6378
    LOCALPORT=6378
    REMOTECLI="$REDISCLI -h $REMOTEIP -p $REMOTEPORT -a $REMOTEPASSWORD"
    LOCALCLI="$REDISCLI -h $LOCALIP -p $LOCALPORT -a $LOCALPASSWORD"
    VIPALIVE=ip a | grep "$VIP"
    if [ "$VIPALIVE" == "" ]; then
    echo "[info]:"date" keepalived server is pengding or stop" >> $LOGFILE
    else
    echo "VIP IS HERE" >> $LOGFILE
    #check local service is running
    if [ $LOCALCLI ping = "PONG" ]; then
    echo "now local is in use" >> $LOGFILE
    # check local redis server role.
    echo $LOCALCLI info | grep "role" >> $LOGFILE
    if grep "role:slave" <<< $REDISROLE; then
    #change local redis server as master
    echo "[info1]:"date" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
    $LOCALCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

                        #change remoting redis server as slave
                        if [ `$REMOTECLI ping` = "PONG" ];then
                                REMOTEREDISROLE=`$REMOTECLI info | grep "role"`
                                if grep "role:master" <<< $REMOTEREDISROLE; then
                                        echo "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE
                                        $REMOTECLI SLAVEOF $LOCALIP 6378 >> $LOGFILE  2>&1
                                fi
                        fi
                fi
        else
                echo "[warn]:"`date`"  redis server($LOCALIP) is not health..." >> $LOGFILE
                sleep 1
                if [ "`$LOCALCLI PING`" != "PONG" ]; then
                        echo "[error]:"`date`"  redis server($LOCALIP) will be stop..." >> $LOGFILE
                        service keepalived stop
                fi
        fi
    

    fi

    注意:一定要先启动redis,再启动keealived,否则redis_check.sh会将keepalived自动关闭。

    脚本创建完成以后,我们开始按照如下流程进行测试:
    1.启动Master上的Redis
    /usr/local/redis-2.8.3/redis-start.sh

    关闭时,直接杀死进程或执行以下脚本

    /usr/local/redis-2.8.3/redis-stop.sh

    2.启动Slave上的Redis
    /usr/local/redis-2.8.3/redis-start.sh

    关闭时,直接杀死进程或执行以下脚本

    /usr/local/redis-2.8.3/redis-stop.sh

    3.启动Master上的Keepalived
    /etc/rc.d/init.d/keepalived start

    关闭方法

    /etc/rc.d/init.d/keepalived stop

    4.启动Slave上的Keepalived
    /etc/rc.d/init.d/keepalived start

    关闭方法

    /etc/rc.d/init.d/keepalived stop

    相关文章

      网友评论

        本文标题:双机热备技术

        本文链接:https://www.haomeiwen.com/subject/ycneoxtx.html