Redis双机热备方案

参考资料:

 

  1. http://www.linuxidc.com/Linux/2014-02/96080.htm
  2. http://www.linuxidc.com/Linux/2014-02/96081.htm
  3. http://www.linuxidc.com/Linux/2014-02/96082.htm

 

背景

 

目前,Redis集群的官方方案还处在开发测试中,未集成到稳定版中。且目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或http://www.redisdoc.com/en/latest/topic/cluster-spec.html),在生产环境中不推荐使用。通过调研发现市面上要实现采用单一的IP来访问,大多采用keepalived实现redis的双机热备作为过渡方案。

 

环境部署

 

环境介绍:
Master: 192.168.1.218 redis,keepalived
Slave: 192.168.1.219 redis,keepalived
Virtural IP Address (VIP): 192.168.1.220

以下Master表示192.168.1.218这台主机,Slave表示192.168.1.219这台主机;master/slave表示keepalived/redis的role。(首字母大小写的区别)

 

设计思路:

通过keepalived的自定义脚本功能监控本机的redis服务状态,当监控脚本检测到redis服务出现异常时,则将本机的keepalived关闭,同时这会导致master/backup角色的变化,而keepalived在角色变化时也会触发一些机制执行相关脚本,这就为我们改变redis的master/slave状态提供了机会,这样做的目的是为了是redis的master/slave的数据保持一致。

在keepalived+redis的使用过程中有四种情况:

1 一种是keepalived挂了,同时redis也挂了,这样的话直接VIP飘走之后,是不需要进行redis数据同步的,因为redis挂了,你也无法去master上同步,不过会损失已经写在master上却还没同步到slave上面的这部分数据。

2 另一种是keepalived挂了,redis没挂,这时候VIP飘走后,redis的master/slave还是老的对应关系,如果不变化的话会把数据写入redis slave中,从而不会同步到master上去,这就要借助监控脚本反转redis的master/slave关系。这时候就要预留一点时间进行数据同步,然后反转master/slave。

3 还有一种是keepalived没挂,redis挂了,这时候根据监控脚本会检测到redis挂了,将本地的keepalived关闭,将虚拟IP漂移到另外一台服务器上。由另外一台备机承接redis业务。

4 随后一种是keepalived没挂,redis也没挂,什么都不用操作。

本文的实验环境四种情况都适合,第一种是不需要同步数据的,脚本会默认去同步数据,但是其实是不会成功的。脚本主要是用来处理第二和第三种情况的。

 

 

实施步骤:

-------------------创建专用用户-------------------

useradd -g develop redisadmin
echo ******|passwd --stdin redisadmin

说明:以下部署过程都是在root(或具备sudo权限的账号)账户下进行。

-------------------安装配置redis-------------------

在Master和Slave上进行如下操作:

1.下载redis源码

cd

wget http://download.redis.io/releases/redis-2.8.4.tar.gz

2.安装redis

tar -zxvf redis-2.8.4.tar.gz

cd redis-2.8.4

#reds的安装可以不用执行configure

make

#测试

make test

####在速度较慢的机器上执行make test可能出现下列错误,无影响

#*** [err]: Test replication partial resync: no backlog in tests/integration/replication-psync.tcl

3.配置redis

#创建redis主目录

mkdir -p /usr/local/redis/{bin,conf,logs}

#将可执行文件拷贝到相应的目录

find src/ \( -perm -0001 \) -type f -exec cp -a -R -p {} /usr/local/redis/bin \;

#创建redis启动脚本

vi /usr/local/redis/redis-start.sh

####以下是master上的配置,slave上的配置只需修改对应的IP地址。

#!/bin/bash
RPATH=/usr/local/redis
KPATH=/usr/local/keepalived
REDISCLI=$RPATH/bin/redis-cli
LOGFILE=$KPATH/logs/redis-state.log
LOCALIP=192.168.1.218
REMOTEIP=192.168.1.219

$RPATH/bin/redis-server $RPATH/conf/redis.conf
if [ "$?" == "0" ];then
    echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP redis start successful." >> $LOGFILE
else
    echo "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP redis start error." >> $LOGFILE
fi
#创建redis关闭脚本
vi /usr/local/redis/redis-stop.sh
####以下为master上的配置,slave上的配置只需修改对应的IP地址。
#!/bin/bash
RPATH=/usr/local/redis
KPATH=/usr/local/keepalived
LOGFILE=$KPATH/logs/redis-state.log
LOCALIP=192.168.1.218
REMOTEIP=192.168.219
kill -9 `ps -ef|grep '/bin/redis-server'|grep -v grep|awk  '{print $2}'`
if [ "$?" == "0" ];then
        echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP redis shutdown completed!" >> $LOGFILE
else
        echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP redis is not started." >> $LOGFILE
fi
#创建redis配置文件
cp -a -R -p redis.conf /usr/local/redis/conf/redis.conf
#修改redis.conf对应配置项:
vi /usr/local/redis/conf/redis.conf
#以下为改动部分,其他的按照实际生产环境进行调整
daemonize yes
pidfile /usr/local/redis/redis.pid
#bind 192.168.1.218    #暂时注释,方便测试
timeout 300
loglevel verbose       #实际生产环境可用notice,此处是为了详细查看各种输出细节
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/
appendonly yes

#修改redis的属主和权限

chmod -R 750 /usr/local/redis/

chown -R redisadmin:develop /usr/local/redis/

-------------------安装配置keepalived-------------------

1.下载keepalived最新源码包1.2.10

wget http://www.keepalived.org/software/keepalived-1.2.10.tar.gz
2.安装keepalived

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

tar zxvf keepalived-1.2.10.tar.gz

cd keepalived-1.2.10

注意:先按照下列出错解决版本修改后再执行后面步骤:

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

make && make install

安装出错(在版本1.2.9上不会出错):

Redis双机热备方案

解决办法:

vi ~/keepalived-1.2.10/keepalived/libipvs-2.6/libipvs.c

按照下图的方法修正(新增57行,注释82行):

Redis双机热备方案

相关推荐