阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis双机热备方案

413次阅读
没有评论

共计 18523 个字符,预计需要花费 47 分钟才能阅读完成。

参考资料:

 

  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 行):

image_thumb5

3. 配置 keepalived

cd /usr/local/keepalived

# 将 keepalived.conf 备份:
mv /usr/local/keepalived/etc/keepalived/keepalived.conf /usr/local/keepalived/etc/keepalived/keepalived.conf-bak

# 在 Master:192.168.1.218 上创建如下配置文件(可根据实际情况调整):

vi /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived

#global_defs {
#   notification_email {#}
#   notification_email_from Alexandre.Cassen@firewall.loc
#    router_id  node3
#}

vrrp_script chk_Redis {script "/usr/local/keepalived/etc/keepalived/scripts/redis_check.sh"
#如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少; 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加; 其他情况,维持原本 prority 的优先级。#    weight -20
    interval 10                 #设置脚本执行的频率。10 秒一次
}

vrrp_instance VI_1 {
    state BACKUP                #要设置恢复时不抢占,需要将主,从服务器的此项都设置成 BACKUP,nopreempt 才会生效。#state MASTER
    interface eth3
    virtual_router_id 51
    priority 100
    nopreempt                   #设置不抢占。在 priority 值比较高的服务器上设置即可。priority 值比较低的服务器启动时,发现值高的服务器为 master,自动不抢占。#advert_int 的作用是巡检的次数。keepalived 默认是在启动完成后 3 秒向 state:MASTER 切换。若此处设置成 2,则是 2 *3= 6 秒后才开启切换。advert_int 1
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {192.168.1.220}
    track_script {chk_redis}
    notify_master /usr/local/keepalived/etc/keepalived/scripts/master.sh
    notify_backup /usr/local/keepalived/etc/keepalived/scripts/backup.sh
    notify_fault  /usr/local/keepalived/etc/keepalived/scripts/fault.sh
    notify_stop   /usr/local/keepalived/etc/keepalived/scripts/stop.sh
}
# 在 Slave:192.168.1.219 上创建如下配置文件(可根据实际情况调整):
vi /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived

#global_defs {
#   notification_email {#}
#   notification_email_from Alexandre.Cassen@firewall.loc
#    router_id  node3
#}

vrrp_script chk_redis {script "/usr/local/keepalived/etc/keepalived/scripts/redis_check.sh"
#如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少; 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加; 其他情况,维持原本 prority 的优先级。#    weight -20
    interval 10                 #设置脚本执行的频率。10 秒一次
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth5
    garp_master_delay 10
    virtual_router_id 51
    priority 90
    #nopreempt 
    #advert_int 的作用是巡检的次数。keepalived 默认是在启动完成后 3 秒向 state:MASTER 切换。若此处设置成 2,则是 2 *3= 6 秒后才开启切换。advert_int 1
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {192.168.1.220}
    track_script {chk_redis}
    notify_master /usr/local/keepalived/etc/keepalived/scripts/master.sh      #当 keepalived 切换成 master 时,会触发执行 master.sh       
    notify_backup /usr/local/keepalived/etc/keepalived/scripts/backup.sh      #当 keepalived 切换成 slave 时,会触发执行 slave.sh       
    notify_fault  /usr/local/keepalived/etc/keepalived/scripts/fault.sh       #当 keepalived 出错时,会触发执行 fault.sh       
    notify_stop   /usr/local/keepalived/etc/keepalived/scripts/stop.sh        #当 keepalived 停止时,会触发执行 stop.sh
}
# 指定 keepalived 的日志文件 
vi /usr/local/keepalived/etc/sysconfig/keepalived
#KEEPALIVED_OPTIONS="-D"
KEEPALIVED_OPTIONS="-D -d -S 0"
#RedHat6.0 以下服务器修改 /etc/syslog.conf,redhat6.0 以上(包括 6.0)服务器修改 /etc/rsyslog.conf, 新增以下内容:
#Save keepalived message to keepalived.log
local0.*                                                /usr/local/keepalived/logs/keepalived.log
# 重启日志服务
service rsyslog restart
# 将文件拷贝到相应的位置

cp -r * /

# 在 Master 和 Slave 上创建监控 Redis 的相关脚本脚本,以下脚本都是 master 上的配置,slave 上只需修改相应的 IP 地址。
mkdir /usr/local/keepalived/etc/keepalived/scripts

vi /usr/local/keepalived/etc/keepalived/scripts/redis_check.sh

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

ALIVE=`$REDISCLI PING`
if ["$ALIVE" == "PONG" ]; then
  echo "[INFO]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP local redis is health." >> $LOGFILE
  exit 0
else
  echo "[ERROR]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP local redis is not health." >> $LOGFILE
  #当发现本地 redis 无法连接时,等待一秒后再进行一次检查。若恢复,则提示;若仍无法连接,则关闭本地 keepalived, 将虚拟 ip 漂移到另外一台服务器上。sleep 1
  ALIVE1=`$REDISCLI PING`
  if ["$ALIVE1" == "PONG" ];then 
    echo "[NOTICE]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP local redis become health." >> $LOGFILE
    exit 0
  else
    echo "[ERROR]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP local redis is error." >> $LOGFILE
    echo "[ERROR]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP shutdown local keepalived." >> $LOGFILE
    /etc/init.d/keepalived stop
    if ["$?" != "0" ];then
      echo "[ERROR]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP keepalived shutdown error." >> $LOGFILE
    else
      echo "[INFO]`date +'%Y-%m-%d:%H:%M:%S'` :$LOCALIP keepalived shutdown completed." >> $LOGFILE
    fi
  exit 1 
  fi
fi
#######################################################################

vi /usr/local/keepalived/etc/keepalived/scripts/master.sh

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


#当此服务器的 keepalived 恢复成 master 时,即虚拟 IP 切换到本机时,将本机的 redis 切换成 role:master

echo "[WARM]-----------keepalived change to master,change local redis to master---------------" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave]" >> $LOGFILE
#先切换成 role:slave
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] Run'SLAVEOF $REMOTEIP $PORT'" >> $LOGFILE
$REDISCLI SLAVEOF $REMOTEIP $PORT >> $LOGFILE 2>&1
#同步数据
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
#等待 10 秒(此时间要根据实际业务需要进行调整),待数据同步完,再切换成 role:master
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] data rsync from old mater ok..." >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] wait other slave connect...." >> $LOGFILE
echo "-------------------------------------complete!------------------------------------------" >> $LOGFILE

#######################################################################

vi /usr/local/keepalived/etc/keepalived/scripts/backup.sh

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


#当此服务器的 keepalived 恢复成 slave 时,即虚拟 IP 切换到其他服务器时,将本机 redis 切换成 role:slave

echo "[WARM]------------keepalived change to slave,change local redis to slave----------------" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master]" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] Being slave state..." >> $LOGFILE 2>&1
#切换时,等待 10 秒,让对方同步数据(此时间要根据实际业务需要进行调整)echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] data rsync from old mater ok..." >> $LOGFILE
#等数据同步完,再切换成 role:slave
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] Run'SLAVEOF  $REMOTEIP $PORT'" >> $LOGFILE
$REDISCLI SLAVEOF $REMOTEIP $PORT >> $LOGFILE  2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] slave connect to $REMOTEIP $PORT ok..." >> $LOGFILE
echo "-------------------------------------complete!------------------------------------------" >> $LOGFILE

#######################################################################

vi /usr/local/keepalived/etc/keepalived/scripts/stop.sh

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


#当主服务器的 keepalived 停止时,将本机 redis 切换成 role:slave

echo "[ERROR]-----------------keepalived stop,change local redis to slave---------------------" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master]" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] Being slave state..." >> $LOGFILE 2>&1
#切换时,等待 10 秒,让对方同步数据(此时间要根据实际业务需要进行调整)echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] data rsync from old mater ok..." >> $LOGFILE
#等数据同步完,再切换成 role:slave
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] Run'SLAVEOF  $REMOTEIP $PORT'" >> $LOGFILE
$REDISCLI SLAVEOF $REMOTEIP $PORT >> $LOGFILE  2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] slave connect to $REMOTEIP $PORT ok..." >> $LOGFILE
echo "-------------------------------------complete!------------------------------------------" >> $LOGFILE

#######################################################################

vi /usr/local/keepalived/etc/keepalived/scripts/fault.sh

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


#当此服务器的 keepalived 出错时,将本机 redis 切换成 role:slave
echo "[ERROR]---------------keepalived is fault,change local redis to slave-------------------" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master]" >>$LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] Being slave state..." >> $LOGFILE 2>&1
#切换时,等待 10 秒,让对方同步数据(此时间要根据实际业务需要进行调整)echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[master] data rsync from old mater ok..." >> $LOGFILE
#等数据同步完,再切换成 role:slave
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] Run'SLAVEOF  $REMOTEIP $PORT'" >> $LOGFILE
$REDISCLI SLAVEOF $REMOTEIP $PORT >> $LOGFILE  2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$PID|state:[slave] slave connect to $REMOTEIP $PORT ok..." >> $LOGFILE
echo "-------------------------------------complete!------------------------------------------" >> $LOGFILE
#######################################################################
 修改监控脚本的权限:
chmod -R 750 /usr/local/keepalived/etc/keepalived/scripts/

参考资料:

 

  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 行):

image_thumb5

系统测试

注意:

(1). 在 keepalived.conf 配置文件中,将 keepalived 双机 都设置成 BACKUP. 同时在 218 上设置了 nopreempt,即恢复时不抢占。而规划中是将 218 作为 master。所以在启动过程中要遵循以下顺序:先启动 218 上的 keepalived,等待数据同步完成后,再启动 219 上的 keepalived.

(2). 在 keepalived 的巡检脚本 Redis_check.sh 中加入了状态切换的监控脚本。在 master.sh 中设置了当 keepalived 切换成 master,会先将 redis 切换成 slave 进行同步数据,再切换回 master。所以在启动 keepalived 之前,要保证 Master 和 Slave 上 redis 的数据是一致的,这样先启动 redis 的 master 那台的 keepalived,虽然 redis master 会连接到 redis slave 同步数据,但是两边数据在刚开始的时候是一致的,并不会产生什么问题。

(3). 在实际生产环境中需要修改防火墙策略,开放相应的端口。在此直接先将防火墙关闭:service iptables stop。

 

以下为各种测试场景和输出结果:

—————————————– 初始环境 ————————————————–

设定一下初始环境:

—- 启动 218 和 219 的 redis: /usr/local/redis/redis-start.sh

Redis 双机热备方案

—- 启动 218 的 keepalived: service keepalived start; 先不启动 219 的 keepalived.

在 218 上执行 tail –f /usr/local/keepalived/logs/keepalived.log,可看到 keepavlived 切换成 master state(配置文件中是设置 state:backup), 且绑定了 VIP。

Redis 双机热备方案

查看 218Master:redis 的日志,可以看到 redis 切换的过程如下:

Redis 双机热备方案

—- 启动 219Slave 的 keepalived,并查看 redis 的日志,可以看到 redis 的状态变成了 slave:

 

Redis 双机热备方案

—————————————– 初始环境 ————————————————–

—————————————– 设计思路 3 ————————————————-

—- 模拟设计思路 3,将 218Master 的 redis 进程 kill 掉:

此时 218 的 keepalived 会被停止,如下图:

Redis 双机热备方案

219 的 keepalived 会正确切换成 State:Master,VIP 完成漂移,如下图:

Redis 双机热备方案

218 的 redis 监控日志如下,

Redis 双机热备方案

219 的 redis 监控日志如下,显示了 219 已切换成 master,保证了业务(当然此处 218 在内存中未写入文件的数据会丢失):

Redis 双机热备方案

—- 模拟 218 从故障中恢复:

因为在发现故障时,会将 218 上的 keepalived 关闭,因此恢复时,需要先启动 218 的 redis,然后再启动 218 的 keepalived:

查看 218 的 keepalived 日志,218 的 keepalived 直接进入 state:backup, 不会造成业务的来回切换:

Redis 双机热备方案

查看 218 的 redis 日志,218 的 redis 启动后,会切换成已存在 redis 服务器的备机。

Redis 双机热备方案

综上所示,设计思路 3 测试成功。

—————————————– 设计思路 3 ————————————————-

—————————————– 设计思路 2 ————————————————-

—- 先设置成初始环境,再模拟设计思路 2,将 218 的 keepalived 进程 kill 掉(service keepalived stop):

查看 218 的 redis 监控日志:

Redis 双机热备方案

查看 219 的 keepalivd 日志,说明 keepalived 正常切换了:

Redis 双机热备方案

查看 219 的 redis 监控日志,可以看到 redis 完成了主从切换:

Redis 双机热备方案

—- 模拟 218 从 keepalived 故障中恢复(只需要先 kill 所有 keepalived 进程后正常启动),执行 service keepalived start:

查看 219 的 keepalived 的日志,可以看到 keepalived 的 state 为 backup,不会造成 VIP 的漂移:

Redis 双机热备方案

查看 218 的 redis 监控日志,可

Redis 双机热备方案

查看 218 的 redis 运行日志,可以看到 redis 恢复为 slave 身份,不会造成业务切换:

Redis 双机热备方案

综上所示,设计思路 2 测试成功。

—————————————– 设计思路 2 ————————————————-

设计思路 4 即为初始环境,设计思路 1 的情况为设计思路 2 和 3 的综合情况,无需测试了。

以上即为 Redis 双机热备方案。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计18523字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7984678
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...