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. 安装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
- 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
- 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
- 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
- 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
- 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的角色,故障切换以及自动恢复都成功了。
- redis主备部署方案
- redis主备部署方案
- php+redis+python网站部署方案
- Redis 测试以及集群部署方案
- 基于Twemproxy的Redis集群方案部署
- Redis+TwemProxy(nutcracker)集群方案部署记录
- Redis集群主备模式部署
- Redis集群主备模式部署
- redis主,从部署
- redis部署及其高可用方案:主从+sentinel,安装步骤
- CAS集群部署基于Redis缓存配置详细方案
- centos7-codis安装部署,解决redis分布式的方案
- redis配置主从备份以及主备切换方案配置
- Redis方案
- redis部署
- redis 部署
- redis部署
- Redis双机热备方案--转
- FZU 2193 So Hard (简单的思维题目)
- 【杭电-oj】-2008-数值统计
- 关于苹果iOS设备日期设置到1970年变砖的原理及解救方法
- Expandable的条目存在抢点击事件的控件
- C++对lua静态库的使用
- redis主备部署方案
- 页面滚动条隐藏拙见
- eyearth
- Halcon算子速查
- 【杭电-oj】-2009-求数列的和
- 协议栈的基本技术
- python对绑定事件的鼠标、按键的判断
- 常用界面跳转方式
- 3D自定义翻转View--TagCloudView