通过Keepalived实现Redis Failover自动故障切换功能
来源:互联网 发布:在Mac上如何使用jdk 编辑:程序博客网 时间:2024/04/30 20:28
通过Keepalived实现Redis Failover自动故障切换功能
一、主从的安装和配置
1 基本环境
两台机器:
master: 192.168.195.75
slave: 192.168.195.74
2 安装主服务器
vi redis.conf
.修改磁盘上保存数据库文件的位置:
dbfilename /jcm-data/redisdb/dump.rdb
.修改日志文件的位置
logfile /jcm-data/redisdb/redis.log
3 安装和配置从机
vi redis.conf
修改其中的一行
配置master的ip地址和redis-server的端口。
slaveof 192.168.195.75 6379
4, 启动和测试
主机: ./redis-server /opt/redis/redis.conf
从机: ./redis-server /opt/redis/redis.conf
5 测试
在主机上启动redis客户端:
ssh 192.168.195.75
redis-cli
>set k1 v1
>get k1
"v1"
.登陆从机,并在从机上启动客户端:
ssh 192.168.195.74
redis-cli
>get k1
"v1"
可以看到redis已经把数据同步过来了。
二 、通过Keepalived实现Redis Failover自动故障切换
修改Master和Slave的/etc/hosts文件
[root@redis rc.d]# cat /etc/hosts
192.168.195.75 redis
192.168.195.74 redis-slave
Master上是
[root@redis rc.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis
Slave上是
[root@redis-slave linux]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis-slave
修改完主机名重启机器生效
Master 和 Slave 上 安装 keepalived
sudo apt-get install keepalived
service iptables stop 一定要关闭IP 信息包过滤系统
配置keepalived配置文件:
首先,在Master上创建如下配置文件:
[root@redis linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { yfhawei@jd.com }
notification_email_from yfhawei@jd.com
router_id redis
}
vrrp_script chk_redis
Unknown macro: { script "/etc/keepalived/scripts/redis_check.sh" interval 1 }
vrrp_instance mes_Redis {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 100
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }
virtual_ipaddress
Unknown macro: { 192.168.195.200 }
track_script
Unknown macro: { chk_redis }
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
然后,在Slave上创建如下配置文件:
[root@redis-slave linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { xiesongmeng@xlhtol.com }
notification_email_from keepalived@redis-slave
router_id redis-salve
}
vrrp_script chk_redis
vrrp_instance mes_Redis {
state BACKUP
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 90
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }
virtual_ipaddress
Unknown macro: { 192.168.195.200 }
track_script
Unknown macro: { chk_redis }
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
在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
编写以下负责运作的关键脚本:
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.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
首先,在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.195.74 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_slave.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.195.74 6379 >> $LOGFILE 2>&1
接着,在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.195.75 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_slave.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.195.75 6379 >> $LOGFILE 2>&1
然后在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
在Master与Slave给脚本都加上可执行权限:
chmod +x /etc/keepalived/scripts/*.sh
脚本创建完成以后,开始按照如下流程进行测试:
1.启动Master上的Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf
2.启动Slave上的Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf
3.启动Master上的Keepalived
/etc/init.d/keepalived start
4.启动Slave上的Keepalived
/etc/init.d/keepalived start
5.尝试通过VIP连接Redis:
[root@redis bin]#pwd
/usr/local/bin
[root@redis bin]# ./redis-cli -h 192.168.195.200 info
role:master
slave0:192.168.195.74,6379,online
连接成功,Slave也连接上来了
6.尝试插入一些数据:
[root@redis bin]# ./redis-cli -h 192.168.195.200 SET Hello Redis
从VIP读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.200 GET Hello
"Redis"
从Master读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"
从Slave读取数据
[root@redis-slave bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"
下面,模拟故障产生:
将Master上的Redis进程杀死:
[root@redis bin]# ./redis-cli shutdown
查看Master上的Keepalived日志
[root@redis scripts]# tail /var/log/keepalived-redis-state.log
fault
Thu Sep 27 08:29:01 CST 2012
同时Slave上的日志显示:
[root@redis-slave scripts]# tail /var/log/keepalived-redis-state.log
master
Thu Nov 15 12:06:04 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK
然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。
./redis-cli -h 192.168.195.200 info
./redis-cli -h 192.168.195.74 info
role:master
然后我们恢复Master的Redis进程
主变成slave
然后把 74 redis停掉
75恢复主的角色,在把 74 redis开启
恢复 75是主, 74是备
一、主从的安装和配置
1 基本环境
两台机器:
master: 192.168.195.75
slave: 192.168.195.74
2 安装主服务器
vi redis.conf
.修改磁盘上保存数据库文件的位置:
dbfilename /jcm-data/redisdb/dump.rdb
.修改日志文件的位置
logfile /jcm-data/redisdb/redis.log
3 安装和配置从机
vi redis.conf
修改其中的一行
配置master的ip地址和redis-server的端口。
slaveof 192.168.195.75 6379
4, 启动和测试
主机: ./redis-server /opt/redis/redis.conf
从机: ./redis-server /opt/redis/redis.conf
5 测试
在主机上启动redis客户端:
ssh 192.168.195.75
redis-cli
>set k1 v1
>get k1
"v1"
.登陆从机,并在从机上启动客户端:
ssh 192.168.195.74
redis-cli
>get k1
"v1"
可以看到redis已经把数据同步过来了。
二 、通过Keepalived实现Redis Failover自动故障切换
修改Master和Slave的/etc/hosts文件
[root@redis rc.d]# cat /etc/hosts
192.168.195.75 redis
192.168.195.74 redis-slave
Master上是
[root@redis rc.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis
Slave上是
[root@redis-slave linux]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis-slave
修改完主机名重启机器生效
Master 和 Slave 上 安装 keepalived
sudo apt-get install keepalived
service iptables stop 一定要关闭IP 信息包过滤系统
配置keepalived配置文件:
首先,在Master上创建如下配置文件:
[root@redis linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { yfhawei@jd.com }
notification_email_from yfhawei@jd.com
router_id redis
}
vrrp_script chk_redis
Unknown macro: { script "/etc/keepalived/scripts/redis_check.sh" interval 1 }
vrrp_instance mes_Redis {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 100
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }
virtual_ipaddress
Unknown macro: { 192.168.195.200 }
track_script
Unknown macro: { chk_redis }
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
然后,在Slave上创建如下配置文件:
[root@redis-slave linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { xiesongmeng@xlhtol.com }
notification_email_from keepalived@redis-slave
router_id redis-salve
}
vrrp_script chk_redis
vrrp_instance mes_Redis {
state BACKUP
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 90
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }
virtual_ipaddress
Unknown macro: { 192.168.195.200 }
track_script
Unknown macro: { chk_redis }
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
在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
编写以下负责运作的关键脚本:
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.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
首先,在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.195.74 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_slave.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.195.74 6379 >> $LOGFILE 2>&1
接着,在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.195.75 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_slave.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.195.75 6379 >> $LOGFILE 2>&1
然后在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
在Master与Slave给脚本都加上可执行权限:
chmod +x /etc/keepalived/scripts/*.sh
脚本创建完成以后,开始按照如下流程进行测试:
1.启动Master上的Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf
2.启动Slave上的Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf
3.启动Master上的Keepalived
/etc/init.d/keepalived start
4.启动Slave上的Keepalived
/etc/init.d/keepalived start
5.尝试通过VIP连接Redis:
[root@redis bin]#pwd
/usr/local/bin
[root@redis bin]# ./redis-cli -h 192.168.195.200 info
role:master
slave0:192.168.195.74,6379,online
连接成功,Slave也连接上来了
6.尝试插入一些数据:
[root@redis bin]# ./redis-cli -h 192.168.195.200 SET Hello Redis
从VIP读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.200 GET Hello
"Redis"
从Master读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"
从Slave读取数据
[root@redis-slave bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"
下面,模拟故障产生:
将Master上的Redis进程杀死:
[root@redis bin]# ./redis-cli shutdown
查看Master上的Keepalived日志
[root@redis scripts]# tail /var/log/keepalived-redis-state.log
fault
Thu Sep 27 08:29:01 CST 2012
同时Slave上的日志显示:
[root@redis-slave scripts]# tail /var/log/keepalived-redis-state.log
master
Thu Nov 15 12:06:04 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK
然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。
./redis-cli -h 192.168.195.200 info
./redis-cli -h 192.168.195.74 info
role:master
然后我们恢复Master的Redis进程
主变成slave
然后把 74 redis停掉
75恢复主的角色,在把 74 redis开启
恢复 75是主, 74是备
自动切换成功!
*************************************
郑州就维 www.zzjiuwei.com
0 0
- 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能
- Redis主从复制 - 通过Keepalived实现Redis Failover自动故障切换功能
- 通过Keepalived实现Redis Failover自动故障切换功能[实践分享] =转载
- 通过Keepalived实现Redis Failover自动故障切换功能[实践分享]
- 通过Keepalived实现Redis Failover自动故障切换功能(整理中) .
- Keepalived实现Redis Failover自动故障切换
- keepalived+redis 实现高可用的自动故障转移failover
- 结合keepalived实现redis群集高可用故障自动切换
- redis主从配置及通过keepalived实现redis自动切换
- debian6下redis+keepalived故障自动切换
- Redis主从配置及通过Keepalived实现Redis自动切换高可用
- KeepAlived+Redis | 高可用 | 主从复制 | 健康检查 | 故障自动切换
- Java操作Redis实现单点故障自动切换
- 面向对象系列一(继承)
- 苹果面试过程中求职者可能遇到的问题
- 迷迷糊糊的一个月(2014.6.27 22:30)
- 安装APP损坏,出现[INSTALL_FAILED_DEXOPT]的解决办法
- 1036. Boys vs Girls
- 通过Keepalived实现Redis Failover自动故障切换功能
- Linux下查看并发连接数(转)
- 2014-6-26任务完成情况
- 2014-6-27任务完成情况
- linux计划任务
- FPGA机器学习之stanford机器学习第五堂
- Android SDK 4.0.3 开发环境配置及运行
- Eclipse设置
- 行人检测识别车载视频实测