共计 18523 个字符,预计需要花费 47 分钟才能阅读完成。
参考资料:
- http://www.linuxidc.com/Linux/2014-02/96080.htm
- http://www.linuxidc.com/Linux/2014-02/96081.htm
- 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
#!/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 配置文件
# 以下为改动部分,其他的按照实际生产环境进行调整
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 的属主和权限
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 上不会出错):
解决办法:
vi ~/keepalived-1.2.10/keepalived/libipvs-2.6/libipvs.c
按照下图的方法修正(新增 57 行,注释 82 行):
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
}
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"
#Save keepalived message to keepalived.log
local0.* /usr/local/keepalived/logs/keepalived.log
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/
参考资料:
- http://www.linuxidc.com/Linux/2014-02/96080.htm
- http://www.linuxidc.com/Linux/2014-02/96081.htm
- 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
#!/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 配置文件
# 以下为改动部分,其他的按照实际生产环境进行调整
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 的属主和权限
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 上不会出错):
解决办法:
vi ~/keepalived-1.2.10/keepalived/libipvs-2.6/libipvs.c
按照下图的方法修正(新增 57 行,注释 82 行):
系统测试
注意:
(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
—- 启动 218 的 keepalived: service keepalived start; 先不启动 219 的 keepalived.
在 218 上执行 tail –f /usr/local/keepalived/logs/keepalived.log,可看到 keepavlived 切换成 master state(配置文件中是设置 state:backup), 且绑定了 VIP。
查看 218Master:redis 的日志,可以看到 redis 切换的过程如下:
—- 启动 219Slave 的 keepalived,并查看 redis 的日志,可以看到 redis 的状态变成了 slave:
—————————————– 初始环境 ————————————————–
—————————————– 设计思路 3 ————————————————-
—- 模拟设计思路 3,将 218Master 的 redis 进程 kill 掉:
此时 218 的 keepalived 会被停止,如下图:
219 的 keepalived 会正确切换成 State:Master,VIP 完成漂移,如下图:
218 的 redis 监控日志如下,
219 的 redis 监控日志如下,显示了 219 已切换成 master,保证了业务(当然此处 218 在内存中未写入文件的数据会丢失):
—- 模拟 218 从故障中恢复:
因为在发现故障时,会将 218 上的 keepalived 关闭,因此恢复时,需要先启动 218 的 redis,然后再启动 218 的 keepalived:
查看 218 的 keepalived 日志,218 的 keepalived 直接进入 state:backup, 不会造成业务的来回切换:
查看 218 的 redis 日志,218 的 redis 启动后,会切换成已存在 redis 服务器的备机。
综上所示,设计思路 3 测试成功。
—————————————– 设计思路 3 ————————————————-
—————————————– 设计思路 2 ————————————————-
—- 先设置成初始环境,再模拟设计思路 2,将 218 的 keepalived 进程 kill 掉(service keepalived stop):
查看 218 的 redis 监控日志:
查看 219 的 keepalivd 日志,说明 keepalived 正常切换了:
查看 219 的 redis 监控日志,可以看到 redis 完成了主从切换:
—- 模拟 218 从 keepalived 故障中恢复(只需要先 kill 所有 keepalived 进程后正常启动),执行 service keepalived start:
查看 219 的 keepalived 的日志,可以看到 keepalived 的 state 为 backup,不会造成 VIP 的漂移:
查看 218 的 redis 监控日志,可
查看 218 的 redis 运行日志,可以看到 redis 恢复为 slave 身份,不会造成业务切换:
综上所示,设计思路 2 测试成功。
—————————————– 设计思路 2 ————————————————-
设计思路 4 即为初始环境,设计思路 1 的情况为设计思路 2 和 3 的综合情况,无需测试了。
以上即为 Redis 双机热备方案。