redis主备部署方案

来源:互联网 发布:最近好听的网络歌 编辑:程序博客网 时间:2024/05/17 22:15

转载自:http://www.cnblogs.com/aspnethot/articles/3468823.html

Redis部署方式采用主备的方式,通过keepalived来对外提供虚IP,并实现主备自动切换功能。

主实例A:192.168.20.30

备实例B:192.168.20.232

虚IP:192.168.20.110

正常工作时,虚IP在主实例A上,主实例A上的数据自动同步到备实例B上,当主实例A挂掉之后,备实例B将自动接管虚IP,并将redis转换为主模式,待原主实例A恢复后,A将自动切换成备模式,从B上同步数据,主备角色互换,实现融灾备份。

 

安装部署步骤如下:

  1. 1.       安装keepalived

wget http://www.keepalived.org/software/keepalived-1.2.6.tar.gz

tar zxvf keepalived-1.2.6.tar.gz

cd keepalived-1.2.6

./configure

如果报错

configure: error:

        !!! OpenSSL is not properly installed on your system. !!!

  !!! Can not include OpenSSL headers files.

解决办法:

yum -y install openssl-devel

yum -y install popt-devel

ln -s /usr/src/kernels/2.6.32-220.el6.x86_64/ /usr/src/linux

 

 

./configure

make

make install

 

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

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

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

mkdir /etc/keepalived

添加keepalived的配置项:

vi /etc/keepalived/keepalived.conf

global_defs {

   router_id LVS_DEVEL

}

vrrp_script Monitor_Redis {

 script "/home/bbcv/redis/redis_keepalive.sh"

 interval 3 #每3秒执行一次

 weight 2

}

# VIP1

vrrp_instance VI_1 {

    state BACKUP           #主备服务器都设置成BACKUP

    interface eth0

    virtual_router_id 55

    priority 100     # 备份服务上将100改为90

    advert_int 1    #检查间隔

    nopreempt     #设置为不抢占,注意这个配置只能设置在state为BACKUP的主机上,而且这个主机的priority必须比另外一台高

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    notify_master /home/bbcv/redis/redis_master.sh

    notify_backup /home/bbcv/redis/redis_backup.sh

    track_script {

        Monitor_Redis #(调用redis进程检测脚本)

    }

    virtual_ipaddress {

        192.168.20.110

        #(如果有多个VIP,继续换行填写.)

    }

}

启动keepalived

service keepalived start

  1. 2.       redis_keepalive.sh脚本

该脚本主要实现对redis进程进行监控,当检测到redis进程挂掉时,自动停止keepalived进程,使虚IP进行漂移

²  注意添加该脚本的可执行权限!

chmod +x redis_keepalive.sh

#!/bin/bash

time=$(date '+%Y-%m-%d %H:%M:%S' )

#redis部署路径

redispath=/home/bbcv/redis

#redis-cli部署路径

rediscli=$redispath/redis-2.0.0-rc4/redis-cli

if [ ! -d "logs" ]; then

        mkdir $redispath/logs

fi

logfile=$redispath/logs/redis-state.log

oldfile=$logfile'.'$(date +%Y-%m-%d --date='30 days ago')

yesterdayfile=$logfile'.'$(date +%Y-%m-%d --date='1 days ago')

#把昨天的日志重命名

if [ -f $yesterdayfile ]

then

        echo "OK"

else

        mv $logfile $yesterdayfile >> $logfile 2>&1

        echo "$time [$yesterdayfile] Move yesterdayfile Success!" >> $logfile

fi

#删除老的日志文件

if [ -f $oldfile ]

then

        rm -f $oldfile >> $logfile 2>&1

        echo "$time [$oldfile] Delete Old File Success!" >> $logfile

else

        echo "no old file"

fi

#检测redis端口是否正常

status=`$rediscli -h 127.0.0.1 -p 6379 info|grep role|awk -F ":" '{print $2}'`

$rediscli -h 127.0.0.1 -p 6379 info > /dev/null

if [ $? -eq 0 ]; then

        echo "$time redis server is OK" >>$logfile

        echo 目前状态为:$status >>$logfile

else

        echo "$time no redis service found!" >>$logfile

        sleep 2

        # try to found it again

        $rediscli -h 127.0.0.1 -p 6379 info > /dev/null

        if [ $? -eq 0 ]; then

                echo "$time redis server is OK" >>$logfile

                echo 目前状态为:$status >>$logfile

                #exit 0

        else

                echo "$time redis server error" >>$logfile

                #stop keepalived

                /etc/init.d/keepalived stop

                echo "$time stop keepalived" >>$logfile

        fi

fi

  1. 3.       redis_master.sh脚本

该脚本主要实现当keepalived切换到master时,执行slaveof no one语句把redis的端口转换为主模式

²  注意添加该脚本的可执行权限!

chmod +x redis_master.sh

#!/bin/sh

#本机IP地址

localip=127.0.0.1

#另一台服务器的地址

backip=192.168.20.232

#redis端口号

port="6379 9998 11111 14948"

 

time=$(date '+%Y-%m-%d %H:%M:%S' )

#redis部署路径

redispath=/home/bbcv/redis

#redis-cli部署路径

rediscli=$redispath/redis-2.0.0-rc4/redis-cli

#日志文件目录

logfile=$redispath/logs/redis-state.log

for p in $port

do

{

        echo "$time redis $p端口切换成主端口" >>$logfile

        $rediscli -h $localip -p $p slaveof no one >>$logfile 2>&1

        sleep 1

}

done

  1. 4.       redis_backup.sh

该脚本主要实现当keepalived切换到master时,执行slaveof 主redisIP 端口 语句,把redis的端口转换为备模式,并同步主redis的数据

²  注意添加该脚本的可执行权限!

chmod +x redis_backup.sh

#!/bin/sh

#本机IP地址

localip=127.0.0.1

#另一台服务器的地址

backip=192.168.20.232

#redis端口号

port="6379 9998 11111 14948"

 

time=$(date '+%Y-%m-%d %H:%M:%S' )

#redis部署路径

redispath=/home/bbcv/redis

#redis-cli部署路径

rediscli=$redispath/redis-2.0.0-rc4/redis-cli

#日志文件目录

logfile=$redispath/logs/redis-state.log

for p in $port

do

{

        echo "$time redis $p端口切换成$backip的备端口" >>$logfile

        $rediscli -h $localip -p $p slaveof $backip $p  >>$logfile 2>&1

        sleep 1

}

done

  1. 5.       安装redis

1.新建文件夹,如mkdir redis

2.将redis-2.2.13.tar.gz拷入其中

3.解压并进入主目录

4.make

5.make install(Ubuntu上需要sudo执行)

6.修改配置文件redis.conf

修改如下:

daemonize no 改为 daemonize yes

取消注释:

syslog-enabled no (改为syslog-enabled yes )

syslog-facility local0

已将修改后的redis.conf文件放入附件,不同需求还需再修改配置文件(如修改端口等)

7.在执行redis-server redis.conf启动时,可能会报如下错误:

Can't chdir to '/var/db/redis': No such file or directory

需要手动创建'/var/db/redis'文件夹

# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition

需要执行 sysctl vm.overcommit_memory=1 修改内核参数

8.再次执行redis-server redis.conf可成功启动redis

  1. 6.       测试

1.查看当前redis是主还是备

/home/bbcv/redis/redis-2.0.0-rc4/redis-cli -h 127.0.0.1 -p 6379 info

 

2.在主redisA上新增一条数据,查看备redisB是否同步该数据

/home/bbcv/redis/redis-2.0.0-rc4/redis-cli -h 127.0.0.1 -p 6379

 

3.停止主redisA,查看虚IP是否切换到备redisB服务器,并查看备redisB服务器是否切换成主状态

ip a查看虚IP是否在本机上

 

4.恢复redisA,查看redisA是否从redisB中同步数据

 

百度文库: http://wenku.baidu.com/view/511754254b73f242336c5f72.html


文章二:

安装和配置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的角色,故障切换以及自动恢复都成功了。


0 0