Redis主从配置及通过Keepalived实现Redis自动切换高可用

原文:Redis主从配置及通过Keepalived实现Redis自动切换高可用

一:环境介绍:

Master: 192.168.1.4

Slave: 192.168.1.5

Virtural IP Address (VIP): 192.168.1.253

二:设计思路:

当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;

当 Master 挂掉,Slave 正时, Slave接管服务,同时关闭主从复制功能;

当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。

然后依次循环。

需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失。

三:安装配置前准备工作


1.在主服务器192.168.1.4上面做下面操作

echo "192.168.1.4 test01" >> /etc/hosts

echo "192.168.1.5 test" >> /etc/hosts

2.在从服务器192.168.1.5上面做下面操作

echo "192.168.1.4 test01" >> /etc/hosts

echo "192.168.1.5 test" >> /etc/hosts

 


四:主服务器配置redis

1.下载安装redis软件包

wget http://download.redis.io/releases/redis-2.8.12.tar.gztar xf redis-2.8.12.tar.gz

cd redis-2.8.12

make && make install

cd src/

cp redis-server redis-cli redis-benchmark redis-check-aof redis-check-dump /usr/local/bin

cd /usr/local/bin

ls -ll

然后将源码中的 redis.conf 复制到 /etc/redis.conf

cp /root/redis-2.8.12/redis.conf /etc/redis.conf

修改 /etc/redis.conf里面可以把  daemonize no 修改为daemonize yes

就可以默认在后台执行redis-server了。

 

再制作一个 init.d 的启动脚本:

vim /etc/init.d/redis-server

#!/usr/bin/env bash

#

# redis start up the redis server daemon

#

# chkconfig: 345 99 99

# description: redis service in /etc/init.d/redis \

#            chkconfig --add redis or chkconfig --list redis \

#            service redis start  or  service redis stop

# processname: redis-server

# config: /etc/redis.conf

 

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

 

REDISPORT=6379

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

REDIS_CLI=/usr/local/bin/redis-cli

 

PIDFILE=/var/run/redis.pid

CONF="/etc/redis.conf"

#make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

    mkdir -p /var/lib/redis

    mkdir -p /var/log/redis

fi

 

case "$1" in

    status)

        ps -A|grep redis

        ;;

    start)

        if [ -f $PIDFILE ]

        then

                echo "$PIDFILE exists, process is already running or crashed"

        else

                echo "Starting Redis server..."

                $EXEC $CONF

        fi

        if [ "$?"="0" ]

        then

              echo "Redis is running..."

        fi

        ;;

    stop)

        if [ ! -f $PIDFILE ]

        then

                echo "$PIDFILE does not exist, process is not running"

        else

                PID=$(cat $PIDFILE)

                echo "Stopping ..."

                $REDIS_CLI -p $REDISPORT SHUTDOWN

                while [ -x ${PIDFILE} ]

              do

                    echo "Waiting for Redis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

        fi

        ;;

  restart|force-reload)

        ${0} stop

        ${0} start

        ;;

  *)

    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2

        exit 1

esac


chmod o+x /etc/init.d/redis-server

chkconfig --add redis-server

service redis-server start

--------------------------------------分割线 --------------------------------------

Ubuntu 14.04下Redis安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10下安装Redis(图文详解)+ Jedis连接Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis系列-安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3安装Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis配置文件redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

CentOS 6.3下Haproxy+Keepalived+Apache配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm

Haproxy + KeepAlived 实现WEB群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm

Keepalived+Haproxy配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm

Haproxy+Keepalived构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm

--------------------------------------分割线 --------------------------------------

五:从发服务器配置redis 

从服务器,配置一样,只不过 修改/etc/redis.conf 中

slaveof 修改为

slaveof 192.168.1.4 6379

然后开启从服务器的redis服务。

start redis-server start

 

六:进行redis主从测试

#主服务器

redis-cli -p 6379 set hello world

#从服务器

redis-cli -p 6379 get hello

"world"

 


#主服务器

redis-cli -p 6379 set hello world2

#从服务器

redis-cli -p 6379 get hello

"world2"

redis-cli -p 6379 set hello world

(error) READONLY You can't write against a read only slave.

成功配置主从redis服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。


七:安装和配置keepalived

1.在Master和Slave上安装Keepalived

$ yum install keepalived -y

2.配置文件

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:

首先,在Master上创建如下配置文件:

$  vim /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

 

vrrp_script chk_redis {

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

    interval 2                                          ###监控时间

    }

 

vrrp_instance VI_1 {

    state MASTER                ###设置为MASTER 

    interface eth1                ###监控网卡   

    virtual_router_id 51

    priority 100            ###权重值 

    authentication {

        auth_type PASS        ###加密 

        auth_pass 1111        ###密码

    }

 

track_script {

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

    }

 

    virtual_ipaddress {

        192.168.1.253        ######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

}


3.然后,在Slave上创建如下配置文件

$ vim /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

 

vrrp_script chk_redis {

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

    interval 2                  ###监控时间

    }

 

vrrp_instance VI_1 {

    state BACKUP        ###设置为BACKUP 

    interface eth1      ###监控网卡

    virtual_router_id 51

    priority 10          ###比MASTRE权重值低 

    authentication {

        auth_type PASS

        auth_pass 1111        ###密码与MASTRE相同 

    }

 

track_script {

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

    }

 

    virtual_ipaddress {

        192.168.1.253  ####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

 

}


4.在Master和Slave上创建监控Redis的脚本

$  mkdir /etc/keepalived/scripts

$  vim /etc/keepalived/scripts/redis_check.sh

 

#!/bin/bash 

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

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

echo $ALIVE 

exit 0 

else

echo $ALIVE 

exit 1 

fi


5.编写以下负责运作的关键脚本:

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

当Keepalived程序终止时则呼叫notify_stop

1)首先,在Redis Master上创建notity_master与notify_backup脚本:

$  vim /etc/keepalived/scripts/redis_master.sh

 

#!/bin/bash

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

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.1.5 6379 >> $LOGFILE  2>&1

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

 

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

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


$  vim /etc/keepalived/scripts/redis_backup.sh

 

 

#!/bin/bash 

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

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.1.5 6379 >> $LOGFILE  2>&1


2)在Redis Slave上创建notity_master与notify_backup脚本:

$  vim /etc/keepalived/scripts/redis_master.sh

 

 

#!/bin/bash 

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

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.1.4 6379 >> $LOGFILE  2>&1

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

 

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

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


$  vim /etc/keepalived/scripts/redis_backup.sh

 

 

#!/bin/bash 

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

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.1.4 6379 >> $LOGFILE  2>&1


3)然后在Master与Slave创建如下相同的脚本:

$  vim /etc/keepalived/scripts/redis_fault.sh

 

#!/bin/bash 

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

echo "[fault]" >> $LOGFILE

date >> $LOGFILE


$  vim /etc/keepalived/scripts/redis_stop.sh

 

 


#!/bin/bash 

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

echo "[stop]" >> $LOGFILE

date >> $LOGFILE


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

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

7.进行相关功能测试


启动Master和slave上的Redis

$  /etc/init.d/redis start

启动Master和slave上的Keepalived

$  /etc/init.d/keepalived start

 


尝试通过VIP连接Redis:

$ redis-cli -h 192.168.0.253 INFO

连接成功,Slave也连接上来了。

role:master

slave0:192.168.1.5,6379,online

尝试插入一些数据:


$ redis-cli -h 192.168.0.253 SET Hello Redis

OK

 


从VIP读取数据

$ redis-cli -h 192.168.0.253 GET Hello

"Redis"

从Master读取数据

$ redis-cli -h 192.168.0.1 GET Hello

"Redis"

从Slave读取数据

$ redis-cli -h 192.168.0.2 GET Hello

"Redis"

8.通过模拟相关故障,进行功能测试

将Master上的Redis进程杀死:

$  killall -9 redis-server

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[fault]

Thu Sep 27 08:29:01 CST 2012

 


同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[master]

2014年 07月 07日 星期一 16:42:52 CST

Being master....

Run SLAVEOF cmd ...

OK Already connected to specified master

Run SLAVEOF NO ONE cmd ...

OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。

$ redis-cli -h 192.168.1.253 INFO

$ redis-cli -h 192.168.1.5 INFO

role:master

 


然后我们恢复Master的Redis进程

$  /etc/init.d/redis start

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[master]

2014年 07月 07日 星期一 16:48:08 CST

Being master....

Run SLAVEOF cmd ...

OK

Run SLAVEOF NO ONE cmd ...

OK

同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[backup]

Fri Sep 28 14:16:37 CST 2012

Being slave....

Run SLAVEOF cmd ...

OK

发现目前的Master已经再次恢复了Master的角色,故障切换以及自动恢复都成功了。

Redis 的详细介绍:请点这里
Redis 的下载地址:请点这里


你可能感兴趣的:(redis,项目上线相关,服务器)