keepalived redis主从双机热备部署

搭建环境看了很多帖子,因为诸多原因都有些原因导致,失败,因此记录一下自己的搭建步骤。


为了提高程序响应效率,用到了redis作为存放缓存数据的地方,但是只运行一台redis无疑对线上环境是一种挑战,万一服务器宕机,那生成环境就没法玩了,因此需要对redis做集群配置,由于公司业务量不是很大,所以采用主从双机热备的方案。

主要核心思想,如果master 和 salve 全部存活的情况,VIP就漂移到 master。读写都从master操作,如果master宕机,VIP就会漂移到salve,并将之前的salve切换为master,当宕机的master可以继续服务的时候,首先会从salve同步数据,然后VIP漂移到master服务器上面,持续提供服务。

一、准备环境

    1.两台服务器

        192.168.0.55 master

        192.168.0.56 slave

        192.168.0.99 VIP

    2.redis安装包

        下载地址:redis下载 (本人下载的稳定版 4.0.9)

    3.keeplived安装包

二、安装redis(两台服务器都按照此方式安装)

    1、解压安装包

        tar -zxvf redis-stable.tar.gz 

    2、将文件放于 /usr/local

        mv redis-stable /usr/local/

    3、进入redis目录并重命名

        cd /usr/local/

        mv redis-stable/ redis

    4、进入 redis目录,编译

        cd redis

        make 

        

        到这步就编译成功了、但是发现    有个错误,经检测发现是时间不对

        所以修改时间  

        date  -s "2018-3-31 15:24:00"  

        让系统时间和硬件时间同步:

        hwclock --systohc

        

        最后通过date 查看时间无误了。再编译一次 在 redis目录中再次make

        

       5、 然后执行 make test

        

        测试的时候报错了,需要安装 tcl8.5

        5.1 、去下载tcl8.5

        5.2、解压并放入 /usr/local

        5.3、进入tcl 下的unix 编译安装

            cd tcl8.6.1/unix/

            ./configure

            make && make install

            

        6、进入 /usr/local/redis/src 执行 make install

            

        7、新建 redis 下新建 bin 及 etc目录 存放redis 服务相关文件和配置文件

            mkdir /usr/local/redis/etc /usr/local/redis/bin

            

        8、移动相关文件

            mv /usr/local/redis/redis.conf /usr/local/redis/etc/

            cd /usr/local/redis/src

           mv  mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/

        9、修改配置文件、让服务可以后台启动

            vim /usr/local/redis/etc/redis.conf

            daemonize  yes

            requirepass 123456 (连接密码)

        10、启动 redis(后台启动)

            [root@jonyLinux1 redis]# ./bin/redis-server ./etc/redis.conf

        11、测试是否成功(保存、查找)

            

        12、配置服务

            12.1、创建文件

                touch /etc/init.d/redis

            12.2、编写启动文件

                vim /etc/init.d/redis

            12.3、文件内容

#!/bin/sh
# chkconfig: 2345 10 90  
# description: Start and Stop redis   

REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/etc/redis.conf"
REDISPASS=123456

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF &
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT -a $REDISPASS shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    restart)
        "$0" stop
        sleep 3
        "$0" start
        ;;
    *)
        echo "Please use start or stop or restart as first argument"
        ;;
esac

            12.4、配置开机启动

                chmod +x /etc/init.d/redis

                chkconfig --add redis

                chkconfig redis on

    三、redis双机热备配置

            1、相关配置

                192.168.0.55 master中配置    

                    daemonize  yes

                    requirepass 123456

                    bind 0.0.0.0

                    slave-serve-stale-data yes

                    slave-read-only no

                192.168.0.56 slave中配置

                    daemonize  yes

                    slaveof 192.168.0.55 6379

                    masterauth 123456

                    slave-serve-stale-data yes

                    slave-read-only no

            2、验证是否成功

                    192.168.0.55 master 中

                        

                    192.168.0.56 slave 中(先get weater 无值、master set 成功之后 slave 中 有值)

                        

    四、keepalived安装

        1、解压压缩包

                tar -zxvf keepalived-1.4.0.tar.gz

        2、安装所需镜像

                yum install -y openssl openssl-devel

        3、编译安装

                cd keepalived-1.4.0

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

                make && make install

        4、拷贝keepalived配置文件

            cp /opt/keepalived-1.4.0/keepalived/etc/init.d/keepalived /etc/init.d/

            cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

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

            mkdir -p /etc/keepalived/scripts/

            cp /usr/local/keepalived/etc/keepalived/samples/keepalived.conf.virtualhost

/etc/keepalived/keepalived.conf

        5、修改配置文件及脚本

               5.1、修改master keepalived配置文件

              vim /etc/keepalived/keepalived.conf      

vrrp_script chk_redis {
    script "killall -0 redis-server"
    interval 2
}
#网卡需要注意,使用ifconfig查看一下当前活动网卡
vrrp_instance VI_1 {
    state MASTER
    interface eth0   #监控网卡(一定要设置正确)
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.0.99  #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
}

             5.2、修改salve keepalived配置文件

                  vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis {
   # script "killall -0 redis-server"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.0.99
    }

    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
}

    6、编写监控脚本

        6.1、master中脚本

            6.1.1 redis_master.sh文件

                touch /etc/keepalived/scripts/redis_master.sh

                vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"

sleep 15

echo "[master]" >> $LOGFILE

date >> $LOGFILE

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


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

$REDISCLI SLAVEOF 192.168.0.58 6379 >>$LOGFILE  2>&1
if [ $? -ne 0 ];then
    echo "data rsync fail." >>$LOGFILE 2>&1
else
    echo "data rsync OK." >> $LOGFILE  2>&1
fi

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 

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

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
    echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
    echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE  2>&1
fi
            6.1.2 redis_backup.sh文件

                    touch /etc/keepalived/scripts/redis_backup.sh

                    vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"

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



echo "[backup]" >> $LOGFILE

date >> $LOGFILE

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


sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 

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

$REDISCLI SLAVEOF 192.168.0.56 6379 >>$LOGFILE  2>&1

        6.2、slave中脚本

            6.2.1、redis_master.sh 脚本

                touch /etc/keepalived/scripts/redis_master.sh

                vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"

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



echo "[master]" >> $LOGFILE

date >> $LOGFILE

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



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

$REDISCLI SLAVEOF 192.168.0.55 6379 >>$LOGFILE  2>&1

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 



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

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

             6.2.2、redis_backup.sh 脚本

                    touch /etc/keepalived/scripts/redis_backup.sh

                    vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"

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


echo "[backup]" >> $LOGFILE

date >> $LOGFILE

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


sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 

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

$REDISCLI SLAVEOF 192.168.0.55 6379 >>$LOGFILE  2>&1
                                                           

           6.3、master 和 salve 中同时创建脚本

                6.3.1 创建 redis_fault.sh

                    touch /etc/keepalived/scripts/redis_fault.sh

                    vim /etc/keepalived/scripts/redis_fault.sh

LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

                 6.3.2、创建 redis_stop.sh

                    touch /etc/keepalived/scripts/redis_stop.sh

                    vim /etc/keepalived/scripts/redis_stop.sh

lOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

      7、keepalived 最终脚本目录如下

        master(55) 中

        

        salve(56) 中

        

到此所有配置文件全部设置完毕

然后再 maseter和 salve 中 执行:

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

五、验证成功

    1、启动master 和 salve中 的redis

        service redis restart

    2、启动master 和 salve中的 keepalived

        service keepalived restart

    3、用VIP连接redis

        redis-cli -h 192.168.0.99 -a 123456

        

        3.1、输入 info查看redis信息

        

        可以看到当前状态为master 以及 salve (图中IP58,由于内网56被占用了,只好将salve的IP改为58)

        

     4、同步测试

            4.1、master服务器中

            

            salve 服务器中

            

            数据已同步。

            4.2、停掉master redis 服务,测试同步

            

            查看replication slaves 为0

            

            4.3、新增 redis key

            

            4.4、重启 master 中的redis,并查看redis 数据同步状态

            

            启动master中的redis,然后查看keys 还未同步,稍等片刻发现 刚刚再slave中新增的数据已同步。

        以上为本人 使用keepalived+redis 双机热备实际操作步骤,以留记录,方便以后再次使用,也方便看到此文的同学。


本环境搭建成功,要感谢诸多同学的贡献,以下为主要参考的一些帖子内容:

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

http://blog.51cto.com/wangfeng7399/1591272

https://www.cnblogs.com/davidwang456/p/3525090.html

https://www.cnblogs.com/JeremyWYL/p/8562388.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章