• redis+keepalived高可用方案


    redis+keepalived高可用方案

    目的:实现redis的高可用

    原理:redis主从复制+keepalived


    一:环境介绍

    Master192.168.10.52

    Slave 192.168.10.53

    VIP 192.168.10.100

    redis端口: 6378


    二:设计思路

    1.masterslave均正常工作时,master负责服务,Slave负责Standby;

    2.master挂掉,Slave正常时,Slave接管服务并升级至master,关闭主从复制,进行读写;

    3.当原master恢复正常时,降级为slave,开启主从复制。


    三:安装服务

    1.安装redis

    bash> wget http://download.redis.io/releases/redis-3.2.8.tar.gz

    bash> tar zxf redis-3.2.8.tar.gz

    bash> cd redis-3.2.8

    bash> make && make PREFIX=/usr/local/redis install

    bash> ln -s /usr/local/redis/bin/* /usr/local/bin/

    bash> mkdir /etc/redis

    bash> cp redis.conf /etc/redis/redis.conf

    bash> sed -i 's/daemonize no/daemonize yes/g' /etc/redis/redis.conf #已守护进程方式运行

    bash> vim /etc/init.d/redis

    #!/bin/bash


    . /etc/rc.d/init.d/functions


    exec=/usr/local/bin/redis-server

    prog=redis

    pidfile="/var/run/redis_6379.pid"

    lockfile=/var/lock/subsys/$prog

    args=" /etc/redis/redis.conf"


    start() {

    [ -x $exec ] || exit 5

    [ -f $config ] || exit 6

    echo -n $"Starting $prog: "

    daemon --pidfile=${pidfile} $exec $args

    retval=$?

    echo

    if [ $retval -eq 0 ]; then

    touch $lockfile || retval=4

    fi

    return $retval

    }


    stop() {

    echo -n $"Stopping $prog: "

    killproc -p ${pidfile} $prog

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

    }


    restart() {

    stop

    start

    }


    reload() {

    restart

    }


    force_reload() {

    restart

    }


    rh_status() {

    # run checks to determine if the service is running or use generic status

    status -p ${pidfile} $prog

    }


    rh_status_q() {

    rh_status >/dev/null 2>&1

    }


    case "$1" in

    start)

    rh_status_q && exit 0

    $1

    ;;

    stop)

    rh_status_q || exit 0

    $1

    ;;

    restart)

    $1

    ;;

    reload)

    rh_status_q || exit 7

    $1

    ;;

    force-reload)

    force_reload

    ;;

    status)

    rh_status

    ;;

    condrestart|try-restart)

    rh_status_q || exit 0

    restart

    ;;

    *)

    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

    exit 2

    esac

    exit $?

    #以上为redis启动脚本

    bash> chmod +x /etc/init.d/redis

    bash> /etc/init.d/redis start

    #至此redis安装完毕

    2.安装Keepalived

    bash> yum install openssl-devel kernel-devel -y

    bash> wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz

    bash> tar zxf keepalived-1.3.5.tar.gz

    bash> cd keepalived-1.3.5

    bash> ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-358.2.1.el6.x86_64/ --prefix=/usr/local/keepalived

    bash> make && make install

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

    bash> cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

    bash> mkdir /etc/keepalived

    bash> cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

    bash> ln -s /usr/local/keepalived/sbin/* /usr/sbin/

    bash> ln -s /usr/local/keepalived/bin/* /usr/sbin/

    #至此keepalived安装完毕


    四:修改配置文件和相关脚本

    1.master上创建配置文件

    bash> vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived


    vrrp_script chk_redis {


    script "/etc/keepalived/scripts/redis_check.sh" ###监控脚本

    interval 2 ###监控时间

    }


    #网卡需要注意,使用ifconfig查看一下当前活动网卡


    vrrp_instance VI_1 {

    state BACKUP ###设置为BACKUP

    interface eth1 ###监控网卡

    virtual_router_id 51

    priority 100 ###权重值

    nopreempt ###不抢占VIP

    authentication {

    auth_type PASS ###加密

    auth_pass 1111 ###密码

    }

    track_script {

    chk_redis ###执行上面定义的chk_redis

    }

    virtual_ipaddress {

    192.168.10.100 ######VIP

    }

    notify_master /etc/keepalived/scripts/redis_master.sh

    notify_backup /etc/keepalived/scripts/redis_backup.sh

    notify_fault /etc/keepalived/scripts/redis_fault.sh

    notify_stop /etc/keepalived/scripts/redis_stop.sh


    }



    2.sLave上创建配置文件

    bash> vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived


    vrrp_script chk_redis {


    script "/etc/keepalived/scripts/redis_check.sh" ###监控脚本

    interval 2 ###监控时间

    }


    #网卡需要注意,使用ifconfig查看一下当前活动网卡


    vrrp_instance VI_1 {

    state BACKUP ###设置为 BACKUP

    interface eth1 ###监控网卡

    virtual_router_id 51

    priority 10 ###权重值

    nopreempt ###不抢占VIP

    authentication {

    auth_type PASS ###加密

    auth_pass 1111 ###密码

    }

    track_script {

    chk_redis ###执行上面定义的chk_redis

    }

    virtual_ipaddress {

    192.168.10.100 ######VIP

    }

    notify_master /etc/keepalived/scripts/redis_master.sh

    notify_backup /etc/keepalived/scripts/redis_backup.sh

    notify_fault /etc/keepalived/scripts/redis_fault.sh

    notify_stop /etc/keepalived/scripts/redis_stop.sh


    }

    #1.由于没有设置master,先启动的为master

    #2.由于没有设置masterbackup通过权重值来争取master


    五:编写keepalied使用的脚本

    notify_master /etc/keepalived/scripts/redis_master.sh

    notify_backup /etc/keepalived/scripts/redis_backup.sh

    notify_fault /etc/keepalived/scripts/redis_fault.sh

    notify_stop /etc/keepalived/scripts/redis_stop.sh


    因为Keepalived在转换状态时会依照状态来执行脚本:

    当进入Master状态时会呼叫notify_master

    当进入Backup状态时会呼叫notify_backup

    当发现异常情况时进入Fault状态呼叫notify_fault

    当程序终止时则呼叫notify_stop


    1.MasterSlave上创建监控Redis的脚本

    bash> mkdir /etc/keepalived/scripts

    bash> cd /etc/keepalived/scripts/

    bash> vim redis_check.sh

    #!/bin/bash

    ALIVE=`/usr/local/bin/redis-cli -p 6378 PING`

    if [ "$ALIVE" == "PONG" ]; then

    echo $ALIVE

    exit 0

    else

    echo $ALIVE

    exit 1

    fi


    2.首先,在Redis Master上创建notity_masternotify_backup脚本:

    bash> cd /etc/keepalived/scripts/

    bash> vim redis_master.sh

    #!/bin/bash

     

    REDISCLI="/usr/local/bin/redis-cli -p 6378"

    LOGFILE="/var/log/keepalived-redis-state.log"

    ALIVE=`/usr/local/bin/redis-cli -h 192.168.10.53 -p 6378 PING`


    echo "[master]" >> $LOGFILE

    date >> $LOGFILE

    echo "Being master...." >> $LOGFILE 2>&1

    #判断对方是否存活

    if [ "$ALIVE" == "PONG" ]; then

    echo "Run SLAVEOF cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF 192.168.10.53 6378 >> $LOGFILE 2>&1

    sleep 10 #如果存活则延迟10秒以后待数据同步完成后再取消同步状态 ,否则直接取消同步状态

    fi


    echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1


    bash> vim redis_backup.sh

    #!/bin/bash

     

    REDISCLI="/usr/local/bin/redis-cli -p 6378"

    LOGFILE="/var/log/keepalived-redis-state.log"

    ALIVE=`/usr/local/bin/redis-cli -h 192.168.10.53 -p 6378 PING`

    echo "[backup]" >> $LOGFILE

    date >> $LOGFILE

    echo "Being slave...." >> $LOGFILE 2>&1

    echo "Run SLAVEOF cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF 192.168.10.53 6378 >> $LOGFILE 2>&1


    3.Redis Baskup上创建notity_masternotify_backup脚本:

    bash> cd /etc/keepalived/scripts/

    bash> vim redis_master.sh

    #!/bin/bash

     

    REDISCLI="/usr/local/bin/redis-cli -p 6378"

    LOGFILE="/var/log/keepalived-redis-state.log"

    ALIVE=`/usr/local/bin/redis-cli -h 192.168.10.52 -p 6378 PING`


    echo "[master]" >> $LOGFILE

    date >> $LOGFILE

    echo "Being master...." >> $LOGFILE 2>&1

    #判断对方是否存活

    if [ "$ALIVE" == "PONG" ]; then

    echo "Run SLAVEOF cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF 192.168.10.52 6378 >> $LOGFILE 2>&1

    sleep 10 #如果存活则延迟10秒以后待数据同步完成后再取消同步状态 ,否则直接取消同步状态

    fi


    echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1


    bash> vim redis_backup.sh

    #!/bin/bash

     

    REDISCLI="/usr/local/bin/redis-cli -p 6378"

    LOGFILE="/var/log/keepalived-redis-state.log"

    echo "[backup]" >> $LOGFILE

    date >> $LOGFILE

    echo "Being slave...." >> $LOGFILE 2>&1

    echo "Run SLAVEOF cmd ..." >> $LOGFILE

    $REDISCLI SLAVEOF 192.168.10.52 6378 >> $LOGFILE 2>&1


    #除了脚本内的ip,其他内容相同


    4.然后在MasterSlave创建如下相同的脚本:

    bash> vim redis_fault.sh

    #!/bin/bash

    LOGFILE=/var/log/keepalived-redis-state.log

    echo "[stop]" >> $LOGFILE

    date >> $LOGFILE


    bash> vim redis_stop.sh

    #!/bin/bash

    LOGFILE=/var/log/keepalived-redis-state.log

    echo "[stop]" >> $LOGFILE

    date >> $LOGFILE


    5.在主从服务器上面给脚本都加上可执行权限:

    bash> chmod +x /etc/keepalived/scripts/*.sh


    六:测试

    略。。懒着写


    注:

    1.优先启动的redisMaster,另一个为slave

    2.可以通过redis-cli -p 6378 info |grep role查看当前redis的角色。

    2.slave位只读模式。

    3.backup切换至master时有2秒的时间为只读。

    4.master挂掉时会检测是redis挂了还是别的原因,如果是别的原因则会有10秒的时间进行数据同步,这个期间redis为只读模式,否则backup会直接成为master,但是会损失数据。


    参考资料:

    http://abcve.com/redis-keepalived/

  • 相关阅读:
    数据结构与算法系列——排序(6)_树形选择排序
    数据结构与算法系列——排序(7)_堆排序
    数据结构与算法系列——排序(5)_简单选择排序
    数据结构与算法系列——排序(4)_Shell希尔排序
    数据结构与算法系列——排序(3)_折半插入排序
    数据结构与算法系列——排序(2)_直接插入排序
    数据结构与算法系列——排序(1)_概述
    Java高级开发_性能优化的细节
    图形推理
    美团点评面试20190515
  • 原文地址:https://www.cnblogs.com/hygs/p/6826214.html
Copyright © 2020-2023  润新知